目前ROS2
最大的問題就是沒有ROS1
的龐大生態系,因此ROS1
和ROS2
的橋樑就變得非常重要,ROS1 Bridge
就是其中一個橋樑,它可以讓ROS1
和ROS2
的Node互相溝通。這樣在快速開發的時候,就可以先不用把ROS
的Package轉換到ROS2
,省去很多Migrating的時間。
目前最適合的作業系統是Ubuntu 20.04,因為ROS1 Noetic
和ROS2 Foxy
都是針對Ubuntu 20.04開發的,因此在安裝的時候也會比較順利。在Ubuntu 22.04以後就不再支援ROS
,得要趁20.04好好把握機會測試和Porting。
安裝:
sudo apt install ros-foxy-ros1-bridge
在使用ROS1 Bridge的時候,不能在bashrc
中事先source ROS2的環境,因為ROS1 Bridge會自動source ROS2的環境,因此如果在bashrc
中source ROS2的環境,會造成ROS2環境被source兩次,造成錯誤。
正確的方式是,在要使用ROS
的Terminal中source ROS
的環境。在需要使用ROS2
的Terminal中source ROS
和ROS2
的環境。
這裡訊息指的是Message和Service。
一般而言,ROS
和ROS2
會自動依照訊息的名稱和符合幾個條件之後,自動轉換。但是如果訊息的名稱不同,就需要客製化的轉換。
Mapping的條件如下:
ROS
Package名稱的_msgs
需對應到ROS2
Package名稱的_msgs
或_interfaces
官方有提供Mapping Rules。
對於客製化的訊息就不能用binary的方式安裝ros1_bridge
,而是需要從source code編譯安裝,以下是編譯安裝的方式:
cd ~/ros2_ws/src
git clone https://github.com/ros2/ros1_bridge/tree/master
cd ~/ros2_ws
colcon build --symlink-install --packages-select ros1_bridge
且必須要在ROS
Package和ROS2
Package都編譯過後,重新編譯ros1_bridge
,客製化的才會生效。
ROS
Server
source /opt/ros/noetic/setup.bash
roscore
source /opt/ros/noetic/setup.bash
source /opt/ros/foxy/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge
ROS1
的talker
source /opt/ros/noetic/setup.bash
rosrun roscpp_tutorials talker
如果你沒有安裝的話可以使用以下指令安裝
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/ros/ros_tutorials.git
cd ~/catkin_ws
catkin build roscpp_tutorials
source ~/catkin_ws/devel/setup.bash
接著在執行上述的talker指令。ROS2
的listener
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp listener
這樣就可以看到ROS1
的talker和ROS2
的listener互相溝通了。
除了簡單的std_msgs::String之外,ROS1 Bridge也支援影像的轉換,以下是ROS2的image publisher和ROS1的image subscriber的範例。
ROS
Server
source /opt/ros/noetic/setup.bash
roscore
source /opt/ros/noetic/setup.bash
source /opt/ros/foxy/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge
ROS2
的image publisher
source /opt/ros/foxy/setup.bash
ros2 run image_tools cam2image
ROS1
的rqt_image_view
source /opt/ros/noetic/setup.bash
rqt_image_view /image
這樣就可以在ROS
的rqt_image_view
中看到ROS2
的cam2image
的影像了。
當然也可以Bridge Service,以下是ROS1的Service Server和ROS2的Service Client的範例。同樣地,Service的Package名稱、Service名稱、Service的型態都必須相同。
ROS
Server
source /opt/ros/noetic/setup.bash
roscore -p 11311
source /opt/ros/noetic/setup.bash
source /opt/ros/foxy/setup.bash
export ROS_MASTER_URI=http://localhost:11311
ros2 run ros1_bridge dynamic_bridge
ROS1
的TwoInts Server
source /opt/ros/noetic/setup.bash
export ROS_MASTER_URI=http://localhost:11311
rosrun roscpp_tutorials add_two_ints_server
ROS2
的TwoInts Client
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp add_two_ints_client
其中ros1_bridge
有提供更進階的使用方式,可以透過編輯bridge.yaml
,選擇要bridge的topics和services。確切的範例可以參考這個連結。
在ROS2
中引入的QoS(Quaility of Service)也可以透過parameter_bridge
來設定。確切的範例可以參考這個連結。