之前做过ROS1的ar marker识别,最近切换ROS2使用就想看看怎么移植,butROS1使用的ar_track_alvar只支持到melodic,只能另寻出路。
ROS2 ar marker识别的实现
找到了aruco的ROS2版本:https://github.com/pal-robotics/aruco_ros
直接下载源码或者git clone都可以,放入工作空间colcon build编译即可
需要对应修改的内容:
/aruco_ros/launch/single.launch.py
1.修改info与image话题为你相机对应的话题
aruco_single = Node(
package='aruco_ros',
executable='single',
parameters=[aruco_single_params],
remappings=[('/camera_info', '/your_camera_info_topic'),
('/image', '/your_image_topic')],
)
2.修改识别marker的id与size
marker_id_arg = DeclareLaunchArgument(
'marker_id', default_value='582',
description='Marker ID. '
)
marker_size_arg = DeclareLaunchArgument(
'marker_size', default_value='0.34',
description='Marker size in m. '
)
注意修改后要编译才能生效
运行开启相机的launch文件,同时运行实现ar marker识别功能的launch文件
ros2 launch aruco_ros single.launch.py
生成可识别的ar marker:ArUco markers generator!
选择Original Aruco以及此前设置好的id和size
使用rqt中的image_view工具,选择查看/aruco_single/result话题,将相机对准生成的ar marker
同时可以使用ros2 topic工具查看所识别ar marker相对相机的位姿信息
ros2 topic echo /aruco_single/pose
适配过程遇到的cvbridge问题
顺利的话确实只要做完上面的步骤就结束了,但本人碰上疑难杂症几率90%
适配使用的是jetson orin主控,opencv版本为4.5.4
启动相机和ar marker识别功能后没有报错,但,只要打开rqt查看对应话题或者终端echo对应话题,ar marker识别的节点就会挂掉
报错内容:/opencv/modules/core/src/matrix.cpp:250: error: (-215:Assertion failed) s>=0 in function ‘setSize’
搜了一下告诉我这个问题可能是cvbridge索引的opencv版本对不上,但最令人百思不得其解的就是我环境里只有一个版本的opencv啊???
然后在重装opencv和cvbridge上浪费时间……
花了两三天之后开始怀疑是不是自己方向错了,重新找了个没被我破坏的环境进行尝试
果然,编译时的warning被我忽略了
警告内容:/usr/bin/ld: warning: libopencv_imgcodecs.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.4.5
/usr/bin/ld: warning: libopencv_core.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_core.so.4.5
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.4.5
/usr/bin/ld: warning: libopencv_imgproc.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_imgproc.so.4.5
/usr/bin/ld: warning: libopencv_core.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_core.so.4.5
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.4.5
/usr/bin/ld: warning: libopencv_core.so.4.5d, needed by /opt/ros/humble/lib/libcv_bridge.so, may conflict with libopencv_core.so.4.5
不是,它只有一个版本它到底在这里conflict什么啊?
仔细看看这个warning,这里面这个叫libcv_bridge.so的家伙嫌疑最大,无碍,我们来搜索一下
果然搜出了这家伙的黑历史,就是说环境里的这个默认文件有可能内容有缺失……有缺失……缺失……失
无碍,能定位的问题都是好问题
我们到github上找个完整包来看看:https://github.com/ros-perception/vision_opencv
注意选择humble分支,下载源码后选择其中的cv_bridge包进行编译
mkdir build
cd build
cmake ..
make
编译后在/build/src下找到新生成的libcv_bridge.so文件,替换掉原来/opt/ros/humble/lib下的同名文件,搞定,重新启动功能没有报错也能正常用了
新生成的1.4mb,旧文件200多k……你不缺失谁缺失(发疯)