现象描述
获得深度相机的点云后,使用pcl处理(除了滤波外,还会进行坐标系变换,比如从相机坐标系变换到机器人的 base_link),然后将pcl点云类型转换为ROS msg的点云类型。然后发布为话题进行显示,具体情况就是下面这张图
右边图像是深度相机采集的原始点云 /kinect/depth/points,参考系为 kinect_link
左边为坐标系变换后的点云/scene/points,参考坐标系为 kinect_link
解决办法
这里我们是想把深度图显示在 base_link 坐标系下,因为 /scene/points 已经变换到 base_link 坐标系下了。 所以要想正常显示,必须在 发布点云 /scene/points 的话题前将其参考坐标系设置为 base_link,设置代码如下
pcl::toROSMsg(tranf_pcd, scene_pcd);
scene_pcd.header.frame_id = "base_link";
话题 /scene/points 发布的就是 scene_pcd 这个Ros中的点云类型。
正确结果如下:
未解之谜
这里有个问题,就是在把点云由 kinec_link 变换为 base_link 的时候,使用的坐标变换矩阵为啥是 kinect_depth_link 相对 base_link 的变换矩阵??二者并不是相同的参考系
经过苦思冥想,这里的 kinect_depth_link 是我自己根据点云添加的真实点云数据的参考坐标系。
所以问题演变为为什么深度相机采集的点云参考坐标系定义的是kinect_link,而实际的数据并不是这个参考坐标系?????