天天看點

在RVIZ中顯示深度資料

文章目錄

  • ​​深入 RVIZ​​
  • ​​景深圖​​
  • ​​深度雲​​
  • ​​點雲​​
  • ​​置信度​​
  • ​​視差​​
  • ​​C++中的深度訂閱​​
  • ​​參考​​

深入 RVIZ

在本教程中,您将詳細了解如何配置您自己的 RVIZ 會話以僅檢視您需要的深度資料。

深度資訊可以通過許多不同的方式可視化:2D 深度圖像、3D 點雲、3D 注冊深度雲和置信度圖像等等。

景深圖

要可視化 a depth image,您可以使用 simpleImage plugin因為深度資料是在類型主題上釋出的sensor_msgs/Image(見上文)。它與“普通”圖像的不同之處在于,資料以 32 位(浮點)而非 8 位編碼。

在RVIZ中顯示深度資料

參數與 for 相同Image,增加了三個:

  • Normalize range:由于浮點圖像不是直接渲染的,它被轉換為8位灰階圖像。啟用此字段意味着自動計算歸一化範圍
  • Min value:如果Normalize range未選中,您可以手動設定以米為機關的最小深度範圍
  • Max value:如果Normalize range未選中,您可以手動設定以米為機關的最大深度範圍

如果您知道測量深度的最大值并且希望保持圖像比例靜态,則手動設定歸一化範圍很有用。

深度雲

該Depth Cloud插件是第一種可視化由深度和視訊資料流生成的注冊點雲的方法。該插件采用深度圖像和 RGB 圖像(均釋出在同一個frame_id)并自動生成 3D RGB 點雲。

在RVIZ中顯示深度資料

關鍵參數:

  • Depth map topic:從組合框中的可用圖像清單中選擇要可視化的深度圖像主題(選中Topic filter以僅選擇名稱讓人想起深度圖像的圖像主題)
  • Color image topic:從組合框中的可用圖像清單中選擇 RGB 圖像主題以與深度圖像相關聯
  • Style:用于渲染每個點的樣式。使用Points和Size=1最大化 FPS
  • Color transformer:選擇點的着色方式。用于RGB8将彩色圖像像素與相應的深度像素相比對。用于Axis color使用與值的Axis值成比例的顔色(例如Z,使用與距地闆的距離成比例的色标或X使用與距相機的距離成比例的顔色)

點雲

要直接可視化主題類型sensor_msgs/Pointcloud2,您可以使用該Pointcloud2插件。

在RVIZ中顯示深度資料

關鍵參數:

  • Topic:從可用點雲消息清單中選擇要可視化的主題
  • Unreliable:勾選此選項以減少訂閱 pointcloud2 主題所需的帶寬。訂閱者将使用 UDP 協定并根據可用帶寬接收消息
  • Depthcloud您可以按照上面對插件的說明更改渲染樣式和顔色轉換器。

注意:如果啟用映射(請參閱mapping/mapping_enabled參數),該Pointcloud2插件還用于可視化映射闡述的融合點雲結果,訂閱主題/zed/zed_node/point_cloud/fused_cloud_registered。

置信度

要将 可視Confidence Map化為圖像,您可以使用Image訂閱主題的插件/zed/zed_node/confidence/confidence_image。

在RVIZ中顯示深度資料

像素越亮,其對應的深度值就越可靠。

視差

用于 RVIZ 的插件來可視化有關類型主題的差異消息stereo_msgs/Disparity不可用,但您可以使用包disparity_view中可用的節點image_view。

啟動視差檢視器以可視化在主題上釋出的視差圖像/zed/zed_node/disparity/disparity_image:

$ rosrun image_view disparity_view image:=/zed/zed_node/disparity/disparity_image      
在RVIZ中顯示深度資料

C++中的深度訂閱

在本教程中,您将學習如何編寫一個簡單的 C++ 節點來訂閱類型 sensor_msgs/Image的消息,以檢索 ZED 節點釋出的深度圖像并擷取圖像中心的測量距離。

訂閱者節點的源代碼zed_depth_sub_tutorial.cpp:

#include <ros/ros.h>
#include <sensor_msgs/Image.h>

/**
 * Subscriber callback
 */
void depthCallback(const sensor_msgs::Image::ConstPtr& msg) {

    // Get a pointer to the depth values casting the data
    // pointer to floating point
    float* depths = (float*)(&msg->data[0]);

    // Image coordinates of the center pixel
    int u = msg->width / 2;
    int v = msg->height / 2;

    // Linear index of the center pixel
    int centerIdx = u + msg->width * v;

    // Output the measure
    ROS_INFO("Center distance : %g m", depths[centerIdx]);
}

/**
 * Node main function
 */
int main(int argc, char** argv) {
    // Node initialization
    ros::init(argc, argv, "zed_video_subscriber");
    ros::NodeHandle n;

    // Depth topic subscriber
    ros::Subscriber subDepth = n.subscribe("/zed/zed_node/depth/depth_registered", 10,
                                           depthCallback);

    // Node execution
    ros::spin();

    return 0;
}      

下面對上述源碼做一個簡單的說明。

void depthCallback(const sensor_msgs::Image::ConstPtr& msg) {

    // Get a pointer to the depth values casting the data
    // pointer to floating point
    float* depths = (float*)(&msg->data[0]);

    // Image coordinates of the center pixel
    int u = msg->width / 2;
    int v = msg->height / 2;

    // Linear index of the center pixel
    int centerIdx = u + msg->width * v;

    // Output the measure
    ROS_INFO("Center distance : %g m", depths[centerIdx]);
}      

當訂閱者節點接收sensor_msgs/Image到與訂閱的主題比對的類型的消息時,将執行此回調/zed/zed_node/depth/depth_registered。回調的參數是boost::shared_ptr收到的消息。這意味着您不必擔心記憶體管理。

回調示範了如何通路消息資料:

  • 指向data字段的指針被強制轉換為,因為它被聲明為指向值float*數組的指針char
  • 計算深度圖中心的圖像坐标[u,v]
  • 由于資料是以線性向量組織的,是以中心像素的索引是根據圖像坐标計算的
  • 中心點的測量值(以米為機關)列印在螢幕上

上述代碼最重要的一課是如何定義訂閱者:

// Subscribers
ros::Subscriber subDepth = n.subscribe("/zed/zed_node/depth/depth_registered", 10,
                                           depthCallback);      

Aros::Subscriber是一個 ROS 對象,它監聽網絡并等待自己的主題消息可用。收到消息時,它會執行配置設定給它的回調。

參考

繼續閱讀