文章目錄
- 深入 RVIZ
- 景深圖
- 深度雲
- 點雲
- 置信度
- 視差
- C++中的深度訂閱
- 參考
深入 RVIZ
在本教程中,您将詳細了解如何配置您自己的 RVIZ 會話以僅檢視您需要的深度資料。
深度資訊可以通過許多不同的方式可視化:2D 深度圖像、3D 點雲、3D 注冊深度雲和置信度圖像等等。
景深圖
要可視化 a depth image,您可以使用 simpleImage plugin因為深度資料是在類型主題上釋出的sensor_msgs/Image(見上文)。它與“普通”圖像的不同之處在于,資料以 32 位(浮點)而非 8 位編碼。

參數與 for 相同Image,增加了三個:
- Normalize range:由于浮點圖像不是直接渲染的,它被轉換為8位灰階圖像。啟用此字段意味着自動計算歸一化範圍
- Min value:如果Normalize range未選中,您可以手動設定以米為機關的最小深度範圍
- Max value:如果Normalize range未選中,您可以手動設定以米為機關的最大深度範圍
如果您知道測量深度的最大值并且希望保持圖像比例靜态,則手動設定歸一化範圍很有用。
深度雲
該Depth Cloud插件是第一種可視化由深度和視訊資料流生成的注冊點雲的方法。該插件采用深度圖像和 RGB 圖像(均釋出在同一個frame_id)并自動生成 3D RGB 點雲。
關鍵參數:
- 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插件。
關鍵參數:
- 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 的插件來可視化有關類型主題的差異消息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
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 對象,它監聽網絡并等待自己的主題消息可用。收到消息時,它會執行配置設定給它的回調。