Gazebo仿真RealSense深度图与彩色图尺寸不一致问题排查
问题描述
在Gazebo仿真中使用RealSense D435相机,通过ROS采集图像并显示到OpenCV窗口。已解决深度图彩色异常问题,但彩色图与深度图尺寸不一致(未做过缩放处理),需要让仿真输出与真实场景的RealSense相机完全一致。
原因分析与解决方案
核心问题点
真实D435相机的彩色流与深度流默认分辨率存在差异(如彩色1920x1080@30fps、深度1280x720@30fps),且可通过硬件对齐功能将深度图尺寸匹配到彩色图。仿真中若未配置对应参数或未启用对齐,就会出现尺寸不一致的情况。
具体解决步骤
统一仿真相机分辨率参数
在Gazebo的相机配置(URDF/SDF)或launch文件中,设置与真实D435一致的分辨率,同时开启深度-彩色对齐功能。订阅对齐后的深度话题
RealSense ROS驱动会发布对齐后的深度图话题,该话题的尺寸将自动匹配彩色图,无需手动缩放。OpenCV端保留原始尺寸显示
订阅图像话题时直接获取原始尺寸数据,不做自动缩放处理。
相关代码与配置示例
1. Launch文件关键配置
<launch> <!-- 加载RealSense D435仿真节点 --> <include file="$(find realsense2_gazebo)/launch/ros_intrinsic.launch"> <arg name="camera" value="camera"/> <!-- 匹配真实D435默认分辨率 --> <arg name="color_width" value="1920"/> <arg name="color_height" value="1080"/> <arg name="depth_width" value="1280"/> <arg name="depth_height" value="720"/> <!-- 开启深度与彩色对齐 --> <arg name="align_depth" value="true"/> </include> <!-- 自定义图像显示节点 --> <node name="image_display_node" pkg="your_package" type="image_display" output="screen"/> </launch>
2. OpenCV图像订阅与显示代码
#include <ros/ros.h> #include <sensor_msgs/Image.h> #include <cv_bridge/cv_bridge.h> #include <opencv2/highgui/highgui.hpp> void colorImageCallback(const sensor_msgs::ImageConstPtr& msg) { try { cv::Mat color_img = cv_bridge::toCvShare(msg, "bgr8")->image; // 直接显示原始尺寸,不做缩放 cv::imshow("Color Image", color_img); cv::waitKey(1); ROS_INFO("Color image size: %dx%d", color_img.cols, color_img.rows); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); } } void depthImageCallback(const sensor_msgs::ImageConstPtr& msg) { try { cv::Mat depth_img = cv_bridge::toCvShare(msg, "16UC1")->image; // 深度图转伪彩色(仅用于观察,不改变尺寸) cv::Mat depth_color; cv::normalize(depth_img, depth_color, 0, 255, cv::NORM_MINMAX, CV_8UC1); cv::applyColorMap(depth_color, depth_color, cv::COLORMAP_JET); cv::imshow("Depth Image", depth_color); cv::waitKey(1); ROS_INFO("Depth image size: %dx%d", depth_img.cols, depth_img.rows); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); } } int main(int argc, char** argv) { ros::init(argc, argv, "image_display_node"); ros::NodeHandle nh; ros::Subscriber color_sub = nh.subscribe("/camera/color/image_raw", 1, colorImageCallback); // 订阅对齐后的深度图话题,尺寸与彩色图一致 ros::Subscriber depth_sub = nh.subscribe("/camera/aligned_depth_to_color/image_raw", 1, depthImageCallback); ros::spin(); cv::destroyAllWindows(); return 0; }
3. 编译依赖说明
确保CMakeLists.txt中包含以下依赖:
find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs cv_bridge image_transport realsense2_camera ) find_package(OpenCV REQUIRED)
内容的提问来源于stack exchange,提问作者brian2lee
相关产品推荐
相关产品推荐

