簡體   English   中英

從 (x,y) 像素坐標獲取 3D 世界坐標

[英]Getting 3D world coordinate from (x,y) pixel coordinates

我對 ROS/Gazebo 世界完全陌生; 這可能是一個簡單的問題,但我找不到一個好的答案。

我在 Gazebo 場景中有一個模擬深度相機(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,因此對於地面上的點。 我顯然錯過了一些東西。

我假設您已經看過 kinect 的涼亭示例( 簡要完整)。 作為主題,您可以獲得原始圖像、原始深度和計算的點雲(通過在配置中設置它們):

<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>

除非您需要對 rgb 和深度幀的 image_raw 做自己的事情(例如 ML over rgb 幀並通過 camera_infos 找到相應的深度點),否則點雲主題應該足夠了 - 它與 c++ 中的 pcl 點雲相同,如果您包括正確的標題。

編輯(作為回應): ros 中有一個神奇的東西叫做tf / tf2 您的點雲,如果您查看msg.header.frame_id ,會說類似"camera" ,表明它在相機框架中。 tf就像 ros 中的消息傳遞系統一樣,發生在后台,但它會查找/偵聽從一個參考幀到另一幀的轉換。 然后,您可以轉換/查詢另一幀中的數據。 例如,如果攝像頭安裝在機器人的旋轉位置,您可以在啟動文件中指定 static 轉換。 似乎您正在嘗試自己進行轉換,但是您可以讓tf為您做; 這使您可以輕松找出點在世界/地圖框架中的位置,與機器人/base_link 框架或執行器/相機/等框架中的位置。

我還將查看這些 ros wiki 問題,這些問題演示了幾種不同的方法,具體取決於您想要什么: ex1ex2ex3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM