自定义话题及服务消息类型与系统内置消息的区别就在于自定义的类型ROS1_bridge必须用源代码重新编译。
1. 创建ros1_bridge工作区。我们在一个单独的工作区中构建ROS1_bridge,因为它需要在其环境中同时使用ROS1和ROS2包。从github上拉下代码时候注意git分支的对应修改,我的ros2是galactic。如果下载为dashing分支,编译时候会很多报错如下图所示
mkdir -p ~/ros1_bridge_ws/src
cd ~/ros1_bridge_ws/src
git clone -b galactic https://github.com/ros2/ros1_bridge.git
2. ros1的代码路径在~/catkin_ws/src/custommsg
/msg/SetString.msg,
SetString.msg如下:
bool b
string message
3.
ros2的代码路径在~/colcon_ws/src/custommsg
/msg/SetString.msg,其对应的CMakeList.txt和package
.xml文件如下图所示:
cmake_minimum_required(VERSION 3.5)
project(custommsg)
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(custommsg
"msg/SetString.msg"
DEPENDENCIES builtin_interfaces
)
install(
FILES my_mapping_rules.yaml
DESTINATION share/${PROJECT_NAME})
ament_package()
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>custommsg</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<member_of_group>rosidl_interface_packages</member_of_group>'
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
<ros1_bridge mapping_rules="my_mapping_rules.yaml"/>
</export>
</package>
my_mapping_rules.yaml如下:
ros1_package_name: 'custommsg'
ros1_service_name: 'SetString'
ros2_package_name: 'custommsg'
ros2_service_name: 'SetString'
4. 编译bridge
source /opt/ros/noetic/setup.bash
source /opt/ros/galactic/setup.bash
source ~/catkin_ws/devel/setup.bash
source ~/colcon_ws/install/setup.bash
colcon build --symlink-install --packages-select ros1_bridge --cmake-force-configure --cmake-args -DBUILD_TESTING=FALSE
最后的--cmake-args -DBUILD_TESTING=FALSE也可以在对应的CMakeList.txt设置
...
58 set(TEST_ROS1_BRIDGE FALSE)
59 set(BUILD_TESTING FALSE)
if(BUILD_TESTING)
...
endif()
编译成功后,启动ros2到ros1的桥
,也可以打印出映射的消息看是否有自定义的消息:
source install/local_setup.bash
ros2 run ros1_bridge dynamic_bridge --print-pairs
ros2 run ros1_bridge dynamic_bridge
5. 使用ros2播放ros2的bag包
source /opt/ros/galactic/setup.bash
source ~/colcon_ws/install/setup.bash
ros2 bag play rosbag2_2022_04_09-14_59_04_0.db3 --topics /gnss_driver/gnssvel /gnss_driver/rawimu
6. 使用ros1录制包
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
rosbag record /gnss_driver/rawimu /gnss_driver/gnssvel