![](/img/trans.png)
[英]Getting the color of a pixel at a specific x,y coordinate, then executing a click
[英]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 問題,這些問題演示了幾種不同的方法,具體取決於您想要什么: ex1 , ex2 , ex3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.