【学习记录】ros2中处理livox_ros_driver1格式的msg
livox的驱动版本有1和2两个,一些数据集是ros1版本,有些是ros2版本,导致自己的代码总是调来调去很麻烦。记录下解决办法。
我这里需要用到的,只有CustomMsg这个,而1和2两个的msg是一模一样的。
1、编译
首先创建一个工作空间
~/livox_msg_ws/
然后在下方创建只包含msg的package即可,不需要安装完整的SDK或者是driver(因为我不需要启动lidar)。
这个链接:https://github.com/LarryDong/livox_msg_ros2 ,之后编译,便出现了2版本的msg。
为了兼容1,可以把所有的数字2删掉(package.xml, CMakeLists.txt, 文件夹名称),然后重新编译,就出现了1。
2、运行rosbag
对于ros2版本,在终端中运行格式如下:
ros2 bag run <Your_db3_bag>
当然运行前需要source一下msg ws。如果ws只包含2的msg,而rosbag是1转过来的,则此时bag是无法识别livox_ros_driver/的消息类型的,会出现如下报错:
WARN] [1762862091.760178347] [rosbag2_player]: Ignoring a topic '/livox/lidar', reason: package 'livox_ros_driver' not found, searching: [/home/larry/livox_msgs_ws/install/livox_ros_driver2, /opt/ros/jazzy].
此时也不会发布这个topic的数据,因为不知道格式该如何解析。因为我们知道的是2格式的,这里的是1格式的。
所以,source一下包含1版本msg的ws之后,可以正常运行。
3、如何echo
此时我想echo一下这个topic是什么样子,同样,在source了msg的ws后,在终端执行:
ros2 topic echo /livox/lidar
会出现报错:
Cannot echo topic '/livox/lidar', as it contains more than one type: [livox_ros_driver/msg/CustomMsg, livox_ros_driver2/msg/CustomMsg]
这意味着终端发现两个 CustomMsg 格式,不知道用1还是2。
为了避免这个问题,把/livox/lidar这个 topic 显式的映射到 1 下方。采用如下方式运行
ros2 bag play 1018_00_LIO --remap /livox/lidar:=/livox_ros_driver/livox/lidar
这样再另一个终端echo这个/livox_ros_driver下方的 msg 就不会有冲突了:
ros2 topic echo /livox_ros_driver/livox/lidar
4、自己的 SLAM 算法中如何同时handle两种topic?
在SLAM算法运行时,可以在一个ws下方粘贴过来1和2两个package,重新build一下这两个msg。
或者直接将上面msg的ws中build出来的install中的头文件粘过来不用重新编译,也行。问题不大(可能这种方式需要改一下缓存的问题?)
在具体的C++代码中,可以根据 lidarCallback 的类型选择livox_ros_driver还是2。这部分待做,明天再写一下测试进行更新。
