gazebo

gazebo sim demos - 1 ( Air pressure )

정지홍 2025. 3. 5. 16:40

https://github.com/gazebosim/ros_gz/tree/jazzy/ros_gz_sim_demos

 

ros_gz/ros_gz_sim_demos at jazzy · gazebosim/ros_gz

Integration between ROS (1 and 2) and Gazebo simulation - gazebosim/ros_gz

github.com

 

 

 

1. ros_gz_sim_demos관련 파일들은 아래의 경로에 있을 것이다.

 

 

 

2.  아래의 명령어를 입력해보자.

ros2 launch ros_gz_sim gz_sim.launch.py gz_args:="shapes.sdf"
  • ros2 launch : ros2에서 launch파일을 실행하는 명령어이다.
  • ros_gz_sim : ros2와 gazebo를 연결하는 패키지이다.
  • gz_sim.launch.py : gazebo sim을 실행하는 launch파일이다.
  • gz_args : gazebo실행시에 추가적인 인자를 전달하는 역할을 한다.
  • shapes.sdf : gz_sim 실행시에 추가로 전달할 인자이며, 이는 gazebo에서 사용할 sdf파일이다.

입력시에 다음과 같이 sim이 나올것이다.

 

 

 


 

 

3. Air pressure

  • 3-1. 아래의 명령어를 입력해보자
ros2 launch ros_gz_sim_demos air_pressure.launch.py
  • ros2 launch : ros2에서 launch파일을 실행하는 명령어이다.
  • ros_gz_sim_demos : ros2와 gazebo sim을 연동하는 예제 패키지이다.
  • air_pressure.launch.py : 공기 압력 센서를 포함한 gazebo sim 환경을 실행하는 launch파일이다.

이렇게 화면이 뜰거다.

 

  • 3-2. 위의 예제에서 공기 압력 센서는 gazebo에서 작동하며, ROS2 토픽을 통해서 데이터를 publishing할 것 이다.
    • 그래서 잘 되는지 확인을 위해서 ros2 topic list를 입력하고 센서 데이터가 잘 출력되는지 확인하자.
# 토픽 확인
ros2 topic list

# 센서 데이터 확인
ros2 topic echo /air_pressure

topic list 출력
센서 데이터 출력

 

 

  • 3-3. Qos( quiality of service)설정을 추가해서 topic echo를 해보자.
    • Qos를 'Best Effort'로 설정해서, 신뢰성이 낮더라도 가능한 많은 데이터를 수신하게 한다.
ros2 topic echo /air_pressure --qos-reliability best_effort

# 이는 한개의 메시지만 받고 종료
ros2 topic echo /air_pressure --qos-reliability best_effort --once

# 신뢰성이 높은 모드로 진행. ( 데이터 손실 없이 모든 메시지 수신 )
  • ros2 topic echo : 지정된 토픽의 메시지를 수신해서 터미널에 출력한다.
  • /air_pressure : 수신할 토픽의 이름이다. 공기압력 센서 데이터가 publish되는 ros2 토픽이다.
  • --qos-reliability best_effor : 해당 설정은 데이터를 최대한 수신하지만, 일부 손실이 발생하여도 재전송을 요청하지 않는 방식이다. ( best effort는 센서 데이터같이 지속적으로 발생하는 값을 처리할때 사용함 )

 

 

==> 해당 연습에서 발생하는 오류 내용

[gazebo-1] Warning [Utils.cc:132] [/sdf/world[@name="sensors"]/model[@name="force_torque_demo"]/link[@name="base_plate"]/static:/opt/ros/jazzy/opt/gz_sim_vendor/share/gz/gz-sim8/worlds/sensors.sdf:L209]: XML Element[static], child of element[link], not defined in SDF. Copying[static] as children of [link].

[parameter_bridge-2] [WARN] [1741227977.755085710] [ros_gz_bridge]: New subscription discovered on topic '/air_pressure', requesting incompatible QoS. No messages will be sent to it. Last incompatible policy: RELIABILITY_QOS_POLICY
[parameter_bridge-2] [WARN] [1741227977.755104540] [ros_gz_bridge]: New publisher discovered on topic '/air_pressure', offering incompatible QoS. No messages will be sent to it. Last incompatible policy: RELIABILITY_QOS_POLICY

[gazebo-1] Warning [Utils.cc:132] [/sdf/model[@name="force_torque_demo"]/link[@name="base_plate"]/static:<data-string>:L3]: XML Element[static], child of element[link], not defined in SDF. Copying[static] as children of [link].
[gazebo-1] Warning [Utils.cc:132] [/sdf/model[@name="force_torque_demo"]/link[@name="base_plate"]/static:<data-string>:L3]: XML Element[static], child of element[link], not defined in SDF. Copying[static] as children of [link].
  • 1번째는 SDF관련 경고이다.
    • 이는 /opt/ros/jazzy/opt/gz_sim_vendor/share/gz/gz-sim8/worlds에 존재하는 sensor.sdf가 원인이다.
      구체적으로는 코드(207줄)를 보면 <model name="force_torque_demo">의 <link name="base_plate">안의 <static>부분이다.
    • 해결법...
      • 1. /opt/ros/jazzy/opt/gz_sim_vendor/share/gz/gz-sim8/worlds에 존재하는 sensors.sdf는 내가 만든 것이 아니다. 그래서 수정하는 방식보다는 cp를 해서 할거다. 위의 디렉토리에서 cp를 해주자... ( 사진 1 참고 )
      • 2. custum_sensor.sdf에 가서 <static>부분을 날리자. ( 사진 2 참고 )
      • 3. 이제 launch 파일을 수정할것이다. ros_gz_sim_demos에 존재하는 launch파일에서 해당 파일을 읽어오는 부분을 수정하자. ( 사진 3 4 참고 )

사진1
사진2
사진3
사진4

 

 

  • 2번째는 QoS 불일치 경고이다
    • 이는 /air_pressure 토픽에서 ros2와 gazebo간의 QoS정책이 일치하지 않아서 메시지가 전달되지 않는 문제다.
    • 경고 메시지를 보면 한쪽에서는 'reliable(신뢰성 있는 전송)'을 요구하나, 다른쪽에서는 'best effort(최대한 전송)'을 사용하기 때문이다.
    • 해결법...
      • 1. 우선 /air_pressure의 QoS를 확인해보자. ros2 topic info /air_pressure --verbose
      • 2. 자세히 보면 publisher의 reliability는 best_effort이며, subscription의 reliability는 reliable이다.(사진 5)
      • 3. 우리는 publisher와 subsription의 타입에 서로 맞춰야한다.
      • 4. 그러면 우리는 /opt/ros/jazzy/share/ros_gz_sim_demos/launch의 air_pressure.launch에서 publisher가 reliable타입으로 받게 변경할것이다. ( 사진 6 )
      • 5. 위와 같이 하면 에러가 안날것이며 rqt의 모니터링 화면에서도 볼수있을것이다.

사진 5
사진6
위와같이 수정하니 이제 rqt에서도 확인이 되며, 실행시에도 에러가 발생 안함.