Gazebo mechaship 물리오류입니다

<?xml version="1.0"?>

false

0.0001

base_footprint

base_link

<enable_wind>true</enable_wind>

0 0 0.139 0 0 0

9.5

0.18

-0.0002

-0.0004

0.43

-0.000035

0.53

0.016 0 0.0771 0 0 0

0.56 0.258 0.085

0.0355 0.14 -0.06 0 1.5708 0

0.09

0.751

0.0355 -0.14 -0.06 0 1.5708 0

0.09

0.751

0.3 0.3 0.3 1.0

0.3 0.3 0.3 1.0

0.3 0.3 0.3 1.0

package://mechaship_description/models/mechaship/meshes/BASE.stl

0.001 0.001 0.001

base_link

gps_link

0 0 0 0 0 0

0.001

<always_on>true</always_on>

<update_rate>1</update_rate>

true

gps/fix

<gz_frame_id>gps_link</gz_frame_id>

<position_sensing>

1.0

1.0

</position_sensing>

base_link

imu_link

0 0 0 0 0 0

0.001

<always_on>true</always_on>

<update_rate>33</update_rate>

true

imu

<gz_frame_id>imu_link</gz_frame_id>

base_link

base_scan

0.034159 0 0.20588 0 0 0

0.045

0.000012807

0.000012664

0.000015284

package://mechaship_description/models/mechaship/meshes/LiDAR.stl

0.001 0.001 0.001

<always_on>true</always_on>

<update_rate>7</update_rate>

true

scan

<gz_frame_id>base_scan</gz_frame_id>

512

<min_angle>-3.14</min_angle>

<max_angle>3.14</max_angle>

0.05

15.0

base_link

camera_link

0.077413 -0.0165 0.17319 1.5708 0 1.5708

<always_on>true</always_on>

<update_rate>30</update_rate>

true

image_raw

<gz_frame_id>camera_link</gz_frame_id>

<horizontal_fov>0.8344</horizontal_fov>

640

480

<joint_name>key_joint</joint_name>

actuator/key/radian

<initial_position>1.5708</initial_position>

mechaship

actuator/thruster/percentage

<joint_name>thruster_joint</joint_name>

<propeller_diameter>0.06</propeller_diameter>

joint_states

<joint_name>key_joint</joint_name>

<joint_name>thruster_joint</joint_name>

<link_name>base_link</link_name>

<hull_length>0.751</hull_length>

<hull_radius>0.09</hull_radius>

<fluid_level>0.0</fluid_level>

0.35 0.14 -0.05

0.15 0.14 -0.05

0.0 0.14 -0.05

-0.15 0.14 -0.05

-0.35 0.14 -0.05

0.35 -0.14 -0.05

0.15 -0.14 -0.05

0.0 -0.14 -0.05

-0.15 -0.14 -0.05

-0.35 -0.14 -0.05

<link_name>base_link</link_name>

0.4

0.1

8.0

0.5

4.0

40.0

20.0

2.0

다음과 코드를 적용시켰을때 (model.sdf파일) 배가 무한이 가라앉는 현상이 발생합니다…
그리고 추가적으로 ubuntu상으로 배의 코드(폴드명 : simul, 파일명 : simul_node)를 실행시키는 방법이 궁금합니다.

포럼 텍스트 에디터는 마크다운을 사용하기 때문에 소스코드를 그대로 입력하면 일부 내용이 사라질 수 있습니다.
되도록 파일로 첨부하거나, 코드 스니펫을 남긴다면 ```으로 감사서 코드를 써주세요.

예를 들어서, C언어 코드를 남긴다면 위 사진처럼 해주셔야 합니다.

#include <stdio.h>

int main(void) {
  printf("Hello, World!");
  return 0;
}

``` 뒤에 언어(C, xml 등)을 남기면 언어에 맞게 자동으로 색을 입혀주니 참고해주세요.

@Sydney

<?xml version="1.0"?>
<sdf version="1.8">
	<model name="mechaship" canonical_link="base_footprint">
		<static>false</static>
		<link name="base_footprint">
			<inertial>
				<mass>0.0001</mass>
			</inertial>
		</link>
		<joint name="base_joint" type="fixed">
			<parent>base_footprint</parent>
			<child>base_link</child>
		</joint>
		<link name="base_link">
			<enable_wind>true</enable_wind>
			<pose>0 0 0.139 0 0 0</pose>
			<inertial>
				<mass>9.5</mass>
				<inertia>
					<ixx>0.18</ixx>
					<ixy>-0.0002</ixy>
					<ixz>-0.0004</ixz>
					<iyy>0.43</iyy>
					<iyz>-0.000035</iyz>
					<izz>0.53</izz>
				</inertia>
			</inertial>
			<collision name="base_collision">
				<pose>0.016 0 0.0771 0 0 0</pose>
				<geometry>
					<box>
						<size>0.56 0.258 0.085</size>
					</box>
				</geometry>
			</collision>
			<collision name="left_hull_collision">
				<pose>0.0355 0.14 -0.06 0 1.5708 0</pose>
				<geometry>
					<cylinder>
						<radius>0.09</radius>
						<length>0.751</length>
					</cylinder>
				</geometry>
			</collision>
			<collision name="right_hull_collision">
				<pose>0.0355 -0.14 -0.06 0 1.5708 0</pose>
				<geometry>
					<cylinder>
						<radius>0.09</radius>
						<length>0.751</length>
					</cylinder>
				</geometry>
			</collision>
			<visual name="base_visual">
				<material>
					<ambient>0.3 0.3 0.3 1.0</ambient>
					<diffuse>0.3 0.3 0.3 1.0</diffuse>
					<specular>0.3 0.3 0.3 1.0</specular>
				</material>
				<geometry>
					<mesh>
						<uri>package://mechaship_description/models/mechaship/meshes/BASE.stl</uri>
						<scale>0.001 0.001 0.001</scale>
					</mesh>
				</geometry>
			</visual>
		</link>
		<joint name="gps_joint" type="fixed">
			<parent>base_link</parent>
			<child>gps_link</child>
		</joint>
		<link name="gps_link">
			<pose relative_to="base_link">0 0 0 0 0 0</pose>
			<inertial>
				<mass>0.001</mass>
			</inertial>
			<sensor name="mechaship_gps" type="navsat">
				<always_on>true</always_on>
				<update_rate>1</update_rate>
				<visualize>true</visualize>
				<topic>gps/fix</topic>
				<gz_frame_id>gps_link</gz_frame_id>
				<navsat>
					<position_sensing>
						<horizontal>
							<noise type="gaussian">
								<stddev>1.0</stddev>
							</noise>
						</horizontal>
						<vertical>
							<noise type="gaussian">
								<stddev>1.0</stddev>
							</noise>
						</vertical>
					</position_sensing>
				</navsat>
			</sensor>
		</link>
		<joint name="imu_joint" type="fixed">
			<parent>base_link</parent>
			<child>imu_link</child>
		</joint>
		<link name="imu_link">
			<pose relative_to="base_link">0 0 0 0 0 0</pose>
			<inertial>
				<mass>0.001</mass>
			</inertial>
			<sensor name="mechaship_imu" type="imu">
				<always_on>true</always_on>
				<update_rate>33</update_rate>
				<visualize>true</visualize>
				<topic>imu</topic>
				<gz_frame_id>imu_link</gz_frame_id>
			</sensor>
		</link>
		<joint name="scan_joint" type="fixed">
			<parent>base_link</parent>
			<child>base_scan</child>
		</joint>
		<link name="base_scan">
			<pose relative_to="base_link">0.034159 0 0.20588 0 0 0</pose>
			<inertial>
				<mass>0.045</mass>
				<inertia>
					<ixx>0.000012807</ixx>
					<iyy>0.000012664</iyy>
					<izz>0.000015284</izz>
				</inertia>
			</inertial>
			<visual name="scan_visual">
				<geometry>
					<mesh>
						<uri>package://mechaship_description/models/mechaship/meshes/LiDAR.stl</uri>
						<scale>0.001 0.001 0.001</scale>
					</mesh>
				</geometry>
			</visual>
			<sensor name="mechaship_lidar" type="gpu_lidar">
				<always_on>true</always_on>
				<update_rate>7</update_rate>
				<visualize>true</visualize>
				<topic>scan</topic>
				<gz_frame_id>base_scan</gz_frame_id>
				<lidar>
					<scan>
						<horizontal>
							<samples>512</samples>
							<min_angle>-3.14</min_angle>
							<max_angle>3.14</max_angle>
						</horizontal>
					</scan>
					<range>
						<min>0.05</min>
						<max>15.0</max>
					</range>
				</lidar>
			</sensor>
		</link>
		<joint name="camera_joint" type="fixed">
			<parent>base_link</parent>
			<child>camera_link</child>
		</joint>
		<link name="camera_link">
			<pose relative_to="base_link">0.077413 -0.0165 0.17319 1.5708 0 1.5708</pose>
			<sensor name="mechaship_camera" type="camera">
				<always_on>true</always_on>
				<update_rate>30</update_rate>
				<visualize>true</visualize>
				<topic>image_raw</topic>
				<gz_frame_id>camera_link</gz_frame_id>
				<camera>
					<horizontal_fov>0.8344</horizontal_fov>
					<image>
						<width>640</width>
						<height>480</height>
					</image>
				</camera>
			</sensor>
		</link>
		<plugin filename="gz-sim-joint-position-controller-system"
      name="gz::sim::systems::JointPositionController">
			<joint_name>key_joint</joint_name>
			<topic>actuator/key/radian</topic>
			<initial_position>1.5708</initial_position>
		</plugin>
		<plugin filename="gz-sim-thruster-system" name="gz::sim::systems::Thruster">
			<namespace>mechaship</namespace>
			<topic>actuator/thruster/percentage</topic>
			<joint_name>thruster_joint</joint_name>
			<propeller_diameter>0.06</propeller_diameter>
		</plugin>
		<plugin filename="gz-sim-joint-state-publisher-system"
      name="gz::sim::systems::JointStatePublisher">
			<topic>joint_states</topic>
			<joint_name>key_joint</joint_name>
			<joint_name>thruster_joint</joint_name>
		</plugin>
		<plugin filename="libSurface.so" name="vrx::Surface">
			<link_name>base_link</link_name>
			<hull_length>0.751</hull_length>
			<hull_radius>0.09</hull_radius>
			<fluid_level>0.0</fluid_level>
			<points>
				<point>0.35 0.14 -0.05</point>
				<point>0.15 0.14 -0.05</point>
				<point>0.0 0.14 -0.05</point>
				<point>-0.15 0.14 -0.05</point>
				<point>-0.35 0.14 -0.05</point>
				<point>0.35 -0.14 -0.05</point>
				<point>0.15 -0.14 -0.05</point>
				<point>0.0 -0.14 -0.05</point>
				<point>-0.15 -0.14 -0.05</point>
				<point>-0.35 -0.14 -0.05</point>
			</points>
		</plugin>
		<plugin filename="libSimpleHydrodynamics.so" name="vrx::SimpleHydrodynamics">
			<link_name>base_link</link_name>
			<xDotU>0.4</xDotU>
			<yDotV>0.1</yDotV>
			<zDotW>8.0</zDotW>
			<nDotR>0.5</nDotR>
			<xU>4.0</xU>
			<yV>40.0</yV>
			<zW>20.0</zW>
			<nR>2.0</nR>
		</plugin>
	</model>
</sdf>

안녕하세요.

남겨주신 모델 파일을 확인했을 때, Surface 플러그인 설정에 오류가 있는 것 같습니다.
해당 플러그인은 선박에서 부력이 발생하게 해주는 hull에 대한 설정을 입력해야 합니다.
저희가 사용중인 선박처럼 2개의 Hull이 장착된 선박은 각각의 hull에 대한 설정을 입력해줘야 합니다.

전달해주신 코드와 예시 코드를 비교하여 수정해보시기 바랍니다.

전달받은 코드

<plugin filename="libSurface.so" name="vrx::Surface">
    <link_name>base_link</link_name>
    <hull_length>0.751</hull_length>
    <hull_radius>0.13</hull_radius>
    <fluid_level>0.0</fluid_level>
    <points>
        <point>0.35 0.14 -0.05</point>
        <point>0.15 0.14 -0.05</point>
        <point>0.0 0.14 -0.05</point>
        <point>-0.15 0.14 -0.05</point>
        <point>-0.35 0.14 -0.05</point>
        <point>0.35 -0.14 -0.05</point>
        <point>0.15 -0.14 -0.05</point>
        <point>0.0 -0.14 -0.05</point>
        <point>-0.15 -0.14 -0.05</point>
        <point>-0.35 -0.14 -0.05</point>
    </points>
</plugin>

예시 코드 (model.sdf 486~514줄)

<!-- Left hull -->
<plugin filename="libSurface.so" name="vrx::Surface">
  <link_name>base_link</link_name>
  <hull_length>0.751</hull_length>
  <hull_radius>0.09</hull_radius>
  <fluid_level>0.03</fluid_level>
  <points>
    <point>0.411 0.24 -0.06</point>
    <point>-0.34 0.06 -0.06</point>
  </points>
  <wavefield>
    <topic>/vrx/wavefield/parameters</topic>
  </wavefield>
</plugin>

<!-- Right hull -->
<plugin filename="libSurface.so" name="vrx::Surface">
  <link_name>base_link</link_name>
  <hull_length>0.751</hull_length>
  <hull_radius>0.09</hull_radius>
  <fluid_level>0.03</fluid_level>
  <points>
    <point>0.411 -0.06 -0.06</point>
    <point>-0.34 -0.24 -0.06</point>
  </points>
  <wavefield>
    <topic>/vrx/wavefield/parameters</topic>
  </wavefield>
</plugin>

추가로, 전달해주신 model.sdf 상에서 누락된 부분이 상당히 있는 것 같습니다. 이대로 사용하시면 시뮬레이션 동작이 어려울 수 있으니, sensor에 대한 설정 등 누락된 태그들을 전반적으로 점검해보시기 바랍니다.

참고로 model 파일을 수정하실 때에는 바로 Gazebo를 실행하지 않고 rviz 상에서 질량, 관성 등의 설정이 잘 입력되었는지 먼저 확인해보시면 편합니다. 추천드리는 테스트 과정을 안내드립니다.

  1. model.sdf 파일 수정 후 빌드
cb
  1. rviz 상에서 검토
ros2 launch mechaship_description mechaship_state_publisher.launch.py
# 새로운 터미널 창에서 실행합니다.
rviz2

rviz 창에서 Add 버튼을 눌러 RobotModel을 추가하시면 Visual, Collision, Mass, Inertia 형상을 확인하실 수 있습니다.
3. Gazebo 상에서 검토 (empty world 파일 사용)

ros2 launch mechaship_simulation gazebo.launch.py

이동 도구 등을 사용해 배의 부력이나 바람에 밀리는 정도를 확인합니다.
4. Gazebo에서 테스트 (경기장 world 파일 사용)

# 실행 전 bringup 패키지의 hooks/mechaship_bringup.sh.in 파일의 WORLD_NAME을 수정한 후 빌드합니다.
cb
ros2 launch mechaship_simulation gazebo.launch.py
# 새로운 터미널 창에서 실행합니다.
ros2 run mechaship_teleop mechaship_teleop_keyboard

키보드로 선박을 조종하며 세부 사항을 조정하며 확인합니다.

ubuntu상으로 배의 코드(폴드명 : simul, 파일명 : simul_node)를 실행시키는 방법이 이 내용을 말씀하신게 맞는지 모르겠네요. 별도의 패키지를 만드실 필요는 없고 mechaship_simulation 패키지를 활용하시면 됩니다.

알려주셔서 감사합니다!!