ros_gz_bridge ( cmd , yaml , namespace )
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이다.
- 대신에 지원해주는 메시지 타입이 한정되어 있으며 이는 아래의 표를 보자.


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"'

간단한 예제 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


간단한 예제 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이라는 파라미터를 지정된 값으로 설정
- --ros-args : ros2노드에서 추가적인 ros-specific인자를 전달할때 사용되는 옵션
- 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





간단한 예제 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