运行环境
系统版本: Ubuntu 16.04
ROS版本: Kinetic
问题描述
在进行手眼标定过程中,为了快速便捷的获取标定板的位姿,考虑采用aruco_ros
使用下面的指令可以快速安装ROS版本的aruco
sudo apt install ros-kinetic-aruco*
运行aruco_ros,结果如图所示
左边为aruco显示的Marker实时位姿,右侧为在rviz中显示TF发布的Marker位姿。
从图中可以看出,两者都可以显示准确的position,但是左侧相机图像显示的坐标轴 orientation 与ROS TF反馈的数据不一致。
理想情况下,Marker的Z轴应当是指向纸面外部, 按图中Marker放置的位置,Marker的Z轴应当与相机坐标系的Z轴平行且反向,但是,在rviz显示的结果为,Marker指向纸面外部的是Y轴,与左侧相机图像显示的不一致。
虽然直接使用这个位姿进行手眼标定 并不会影响标定结果。但是考虑到后面需要使用Marker进行位姿验证,希望可以让arcuo_ros 显示的坐标轴 与TF发布的姿态能够一致。
解决方案
根据官方大佬给出的解释,给出下面的解决方案
首先,卸载掉之前安装的 aruco_ros
sudo apt remove ros-kinetic-aruco*
然后,在Github下载arcuo_ros 源代码
https://github.com/pal-robotics/aruco_ros/tree/kinetic-devel
将源代码包放到一个ROS的工作空间下,定位到下面的路径
…/aruco_ros/src/
打开文件aruco_ros_utils.cpp
,按照下图修改代码
即,将源代码中的旋转矩阵修改为单位矩阵,然后使用 catkin_make
重新编译
再次运行,可以看到aruco在相机图像中显示的坐标轴位姿已经与TF发布的位姿一致