gazebo

ros_gz_bridge ( cmd , yaml , namespace )

정지홍 2025. 3. 7. 12:34

https://gazebosim.org/docs/harmonic/ros2_integration/

 

Use ROS 2 to interact with Gazebo — Gazebo harmonic documentation

Use ROS 2 to interact with Gazebo In this tutorial we will learn how to use ROS 2 to communicate with Gazebo. This can help in many aspects; we can receive data (like joint states, TFs) or commands from ROS and apply it to Gazebo and vice versa. This can a

gazebosim.org

 

해당되는 튜토리얼은 ros와 gazebo가 어떻게 상호작용할지 알려줄것이다.

==> 많은 이점을 배울것인데, 첫째로는 joint state나 TFs같은 데이터를 받아올것이다. 두번째로는 ros 명령어를 어떻게 gazebo에 적용시킬지도 배울것이다. ( 반대도 해볼것임... ). 세번째로는 RViz도 사용해보며 gazebo world에 존재하는 로봇에 대해서 시뮬레이션에 대한 시각화도 배워볼것이다.

 

 

 

ros_gz_bridge

  • ros_gz_bridge는 ROS2와 Gazebo Transport간의 메시지 교환을 가능하게 해주는 network bridge이다.
    • 대신에 지원해주는 메시지 타입이 한정되어 있으며 이는 아래의 표를 보자.

ros2와 gazebo간의 bridge를 지원하는 토픽들
이거는 토픽이 아니라 서비스이다.

 

 

bridge명령어 형식에 대한 설명

  • bridge는 양방향으로 생성할수있다. 즉, Ros가 publisher나 subscriber가 될수 있으며, gazebo도 가능하다.( vise versa )
  • 문법의 형태는 ' /TOPIC@ROS_MSG@GZ_MSG ' 형태이다.
    • TOPIC은 gazebo internal topic이다.
    • ROS_MSG은 앞에서 기술한 topic에 대한 ROS message type이다.
    • GZ_MSG은 gazebo message type이다.
    • ex) ros2  run  ros_gz_bridge  parameter_bridge  /scan@sensor_msgs/msg/LazerScan@gz.msgs.LazerScan
      • 위에서 보면 ros2 run은 당연 ros2를 실행하는 부분이다. 그리고 ros_gz_bridge패키지의 parameter_bridge를 실행한다는것.
      • @는 토픽과 메시지들을 구분하기 위한것이다. 이 부분에는 3가지의 타입이 존재한다.
        • @ is a bidirectional bridge
        • [ is a bridge from Gazebo to ROS
        • ] is a bridge from ROS to Gazebo

 

 

간단한 bridge 예제 1

  • cmd상에서 bridge를 띄워두고, ros2는 listner역할 , gz는 talker역할을 해볼것이다.
    • ros_gz_bridge : ros와 gazebo 사이에서 메시지를 변환해주는 패키지이다.
    • parameter_bridge : 이는 ros_gz_bridge 패키지 내에서 실행하는 노드이며, ros2와 gazebo간 메시지 변환을 위한 브릿지 노드를 실행하는 것
# ros_gz_bridge 명령어 
ros2 run ros_gz_bridge parameter_bridge /chatter@std_msgs/msg/String@gz.msgs.StringMsg

# ros의 리스너
ros2 topic echo /chatter

# gz의 talker
gz topic -t /chatter -m gz.msgs.StringMsg -p 'data:"hi"'

차례대로 bridge , gz talker , ros listener이다.

 

 

간단한 예제 2

  • 이번에는 gz를 띄우고 gz의 이미지와 관련된 토픽에 대해서 bridge를 해준다. 그리고 ros의 rqt로 이를 확인해볼거임.
# 우선 gz sim을 실행시켜주자
gz sim sensors_demo.sdf

# 다음에는 gz에 어떠한 토픽이 존재하는지 볼것인데, 이번에는 image에 대한것만 해보자
# --> 그러면 아마도 2개가 출력될거임. 그중에 하나를 우리는 bridge해줄거임.
gz topic -l | grep image

# gz topic으로 얻은것중 하나를 bridge 해줄것이다.
ros2 run ros_gz_bridge parameter_bridge /rgbd_camera/image@sensor_msgs/msg/Image@gz.msgs.Image
# 이렇게 입력시에 depth카메라도 가능 ros2 run ros_gz_bridge parameter_bridge /rgbd_camera/depth_image@sensor_msgs/msg/Image@gz.msgs.Image


# 다음에는 위의 명령어에서 볼수있듯이 sensor_msgs/msg/Image메시지 타입을 볼것임
ros2 run rqt_image_view rqt_image_view /rgbd_camera/image

다음과 같이 확인이 가능

 

만약 이러한 창이 뜨는경우에는 ros2 run 명령어를 잘못입력한 경우이다.

 

 

 

 

간단한 예제 3 ( yaml로 실행해보기)

  • 아래의 파일은 bridge를 실행하기 위한 yaml파일이다.
  • ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=파일이름
    • --ros-args : ros2노드에서 추가적인 ros-specific인자를 전달할때 사용되는 옵션
      • 즉, 위의 옵션을 사용하면 'ros에서 노드를 실행할때 특정 파라미터를 추가'하는 것이 가능하다.
    • -p : ros2노드를 실행할때 특정 parameter값을 설정하는 옵숀
    • config_file:= : config file이라는 파라미터를 지정된 값으로 설정
- topic_name: "chatter"
  ros_type_name: "std_msgs/msg/String"
  gz_type_name: "gz.msgs.StringMsg"

- topic_name: "chatter_ros"
  ros_type_name: "std_msgs/msg/String"
  gz_type_name: "gz.msgs.StringMsg"

- topic_name: "chatter_gz"
  ros_type_name: "std_msgs/msg/String"
  gz_type_name: "gz.msgs.StringMsg"

- ros_topic_name: "chatter_both_ros"
  gz_topic_name: "chatter_both_gz"
  ros_type_name: "std_msgs/msg/String"
  gz_type_name: "gz.msgs.StringMsg"
  
  
- ros_topic_name: "ros_chatter"
  gz_topic_name: "gz_chatter"
  ros_type_name: "std_msgs/msg/String"
  gz_type_name: "gz.msgs.StringMsg"
  subscriber_queue: 10
  publisher_queue: 10
  lazy: true
  direction: BIDIRECTIONAL

yaml실행시 위와 같이 topic이 출력됨을 볼수있다.
첫번째 설정에 대한 출력
이건 두번째
세번째
네번째

 

 

 

 

간단한 예제 4 ( namespace )

  • namespcae : ros2에서 토픽 이름이 충돌하지 않도록 그룹화하는 방법이다.
    • 1. Relative ( 상대적 네임스페이스 ) : 현재 노드의 네임스페이스를 따라감
    • 2. Global ( 전역 ) : 절대 경로를 사용  =>  /
    • 3. Private ( 개인 ) : 노드의 개별 네임스페이스를 기준  =>  ~/
  • 이름 활성화 하려면 expand_gz_topic_names:=true 설정 필요
# 브릿지를 실행
# 아래 expand_gz_topic_name:=true를 통해서 ros의 namespace가 gazebo에도 등록됨
# -r __ns:=/demo는 ros네임스페이스를 /demo로 설정. 즉, 모든 토픽이 /demo/ 아래로 들어감
# ===> 결과적으로 ros 토픽은 /demo/chatter이며, gazebo는 /demo/chatter이다.
ros2 run ros_gz_bridge parameter_bridge chatter@std_msgs/msg/String@ignition.msgs.StringMsg --ros-args -p expand_gz_topic_names:=true -r __ns:=/demo


# gazebo에서 메시지 수산
gz topic -e -t /demo/chatter


# ros에서 메시지 발행 
ros2 topic pub /demo/chatter std_msgs/msg/String "data: 'Hi from inside of a namespace'" --once