从(x,y)像素坐标获取3D世界坐标

问题描述 投票:0回答:1

我对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;

但是我得到的x,y,z坐标为point.x,似乎是不正确的。摄像机的俯仰角为pi / 2,因此指向地面。我显然缺少什么。

c++ kinect ros depth gazebo-simu
1个回答
0
投票

我假设您已经看过kinect(brieffull)的凉亭示例。您可以获取原始图像,原始深度和计算出的点云作为主题(通过在配置中进行设置):

<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 / tf。如果您查看tf2,您的点云会显示类似tf2的字样,表明它在相机框架中。像ros中的消息传递系统一样,msg.header.frame_id发生在后台,但是它查找/侦听从一个参考框架到另一框架的转换。然后,您可以在另一个框架中转换/查询数据。例如,如果将摄像机旋转安装在机器人上,则可以在启动文件中指定静态转换。似乎您正在尝试自己进行转换,但是可以使"camera"替您完成;这样,您可以轻松确定点在世界/地图框架中,在机器人/ base_link框架中或在执行器/照相机/等框架中的点。

我还将查看这些ros wiki问题,这些问题演示了几种不同的方式来执行此操作,具体取决于您想要的内容:tftfex1

© www.soinside.com 2019 - 2024. All rights reserved.