我对ROS /凉亭世界绝对陌生;这可能是一个简单的问题,但我找不到很好的答案。
我在凉亭场景中有一个模拟深度相机(Kinect)。经过一番细致的研究,我对RGB图像的像素坐标有了一个兴趣点,我想在世界框架中检索其3D坐标。 我不明白该怎么做。
我已经尝试补偿CameraInfo消息给定的失真。我尝试将PointCloud与pcl库一起使用,将点检索为cloud.at(x,y)
。
在两种情况下,坐标都不正确(我在程序给出的坐标中放置了一个小球体,以便检查其是否正确)。
我们将非常感谢您的帮助。非常感谢。
编辑: 从PointCloud开始,我尝试找到类似以下内容的点的坐标:
point = cloud.at(xInPixel, yInPixel);
point.x = point.x + cameraPos.x;
point.y = point.y + cameraPos.y;
point.z = point.z - cameraPos.z;
但是我得到的{,{1}}的x,y,z坐标似乎不正确。 摄像机的俯仰角为pi / 2,因此指向地面。 我显然缺少了一些东西。
答案 0 :(得分:0)
我认为您已经看过Kinect的凉亭示例(brief,full)。您可以获取原始图像,原始深度和计算出的点云作为主题(通过在配置中进行设置):
<imageTopicName>/camera/color/image_raw</imageTopicName>
<cameraInfoTopicName>/camera/color/camera_info</cameraInfoTopicName>
<depthImageTopicName>/camera/depth/image_raw</depthImageTopicName>
<depthImageCameraInfoTopicName>/camera/dept/camera_info</depthImageCameraInfoTopicName>
<pointCloudTopicName>/camera/depth/points</pointCloudTopicName>
除非您需要使用image_raw来处理rgb和景深帧(在rgb帧上使用ML并通过camera_infos找到对应的深度点),否则pointcloud主题应该足够了-与c ++中的pcl pointcloud相同,如果您包括正确的标题。
编辑(作为回应):
ROS中有一个神奇的东西,叫做tf
/ tf2
。如果您查看msg.header.frame_id
,则点云会显示类似"camera"
的字样,表明它在相机框架中。 tf
就像ros中的消息传递系统一样,在后台发生,但是它看起来/侦听从一个参考框架到另一框架的转换。然后,您可以在另一个框架中转换/查询数据。例如,如果将摄像机旋转安装在机器人上,则可以在启动文件中指定静态转换。似乎您正在尝试自己进行转换,但是可以使tf
为您完成转换;这样,您可以轻松确定点在世界/地图框架中,在机器人/ base_link框架中或在执行器/照相机/等框架中的点。