gazebo中创建stereo camera并且利用ROS获取左右图

本文介绍如何使用Gazebo与ROS获取立体相机的左右视图进行无监督学习训练,涉及创建立体相机模型、配置Gazebo世界文件及编写ROS节点等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  现在很多CNN算法都开始采用无监督的学习算法,有的时候需要在仿真环境中获取一个stereo camera的左右图来进行训练,发现用gazebo获取一个stereo camera的左右图的资料比较少,所以就记录一下我做的过程。在读这篇博客之前,请先了解gazebo的相关内容和ROS的相关知识。

步骤:
1、创建一个stereo camera model,添加ros plugin
2、创建一个gazebo world file
3、创建一个ROS workspace 来保存stereo camera的左右图

我的系统是Ubuntu 14.04,gazebo的版本是默认的gazebo 2.2

1、创建stereo camera model
  gazebo支持两种模型的描述格式,URDF和SDF文件,SDF文件出的比较晚,书写起来比较方便,建议使用SDF文件,但是原来有很多model的描述都是URDF的文件格式的,gazebo也是可以同时兼容的,URDF文件的后缀是.xacro。
  下面是我的stereo camera的sdf文件

    <model name="kinect_ros">
      <pose>-2 2.5 1 0 0 0</pose>
      <link name="link">
        <inertial>
          <mass>0.1</mass>
        </inertial>

        <collision name="collision">
          <geometry>
            <box>
              <size>0.073000 0.276000 0.072000</size>
            </box>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <mesh>
              <uri>model://kinect_ros/meshes/kinect_ros.dae</uri>
            </mesh>
          </geometry>
        </visual>
            <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${60.0*M_PI/180.0}</horizontal_fov>
          <image>
            <format>B8G8R8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.4</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>camera_depth_optical_frame</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>    <--! max distance -->
        </plugin>
      </sensor>
        <gravity>0</gravity>
      </link>
    </model>

上面就是stereo camera的model的sdf文件描述,整个部分被 “model”包括,这也是和其它model的区分的界限。“camera” 片段之间描述的就是相机的内部参数,可以修改图片大小(640 x 480),颜色通道(B8G8R8),可测量的距离(near和far),然后添加ROS plugin就可以发布一些关于图片的rostopic,用这些topic来读取gazebo中的相机的左右图。上述文件中还有个mesh参数,导入的是相机的外形参数,我直接用的是kinect的mesh。

2、创建一个gazebo world file
  world file是来描述这个虚拟世界的一些基本的元素,比如说 “ground plane”,”sun”等,还有除了你所添加的机器人以外的环境(比如桌子、椅子、房子等)。这一个步骤推荐利用图形界面来完成,要是都是通过直接写sdf文件来描述得累死,也没有必要。图形界面直接插入gazebo model base里面的model,然后直接保存成为一个sdf文件,打开之后就可以看到了详细的sdf文件描述。
  接下来有两种办法将world file和上面的stereo camera的model file合并起来:
1、通过一个launch file,分别添加world file和model file
2、直接将model file插入到world file中。

我采用的是第二种,这样就一个文件,直接rosrun gazebo_ros gazebo xxx.world就可以查看了

3、创建一个workspace来读取双目相机的左右图
直接上代码了:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include "std_msgs/Empty.h"

using namespace std;
using namespace cv;


static const std::string OPENCV_WINDOW = "Image window";
static const std::string OPENCV_WINDOW2 = "Image window2";


//void imageCb(const sensor_msgs::ImageConstPtr& msg);

void imageCb(const sensor_msgs::ImageConstPtr& msg)
{
int count = 0;

    char t[100];

    sprintf(t,"%08d",count);    
    cv_bridge::CvImagePtr cv_ptr;
    try
    {
        cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);  //bgr8
    }
    catch (cv_bridge::Exception& e)
    {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    cv::Mat frame = cv_ptr->image;
    cv::imshow(OPENCV_WINDOW, frame);
    cv::imwrite(std::string("/home/osgoodwu/save_stereo_workspace/left")+t+std::string(".png"),frame);
   // count++;
    cv::waitKey(3);
}

void imageCb2(const sensor_msgs::ImageConstPtr& msg)
{
int count = 0;

    char t[100];

    sprintf(t,"%08d",count);    
    cv_bridge::CvImagePtr cv_ptr;
    try
    {
        cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);  //bgr8
    }
    catch (cv_bridge::Exception& e)
    {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    cv::Mat frame = cv_ptr->image;
    cv::imshow(OPENCV_WINDOW, frame);
    cv::imwrite(std::string("/home/osgoodwu/save_stereo_workspace/right")+t+std::string(".png"),frame);
   // count++;
    cv::waitKey(3);
}

int main(int argc, char** argv)
{
    //static int count = 0;
    ros::init(argc, argv, "image_converter");

    ros::NodeHandle nh_;
    image_transport::ImageTransport it_(nh_);
    image_transport::Subscriber image_sub_;
    image_transport::Subscriber image_sub2_;

    image_sub_ = it_.subscribe("/stereo/camera/left/image_raw", 1, imageCb);
    image_sub2_ = it_.subscribe("/stereo/camera/right/image_raw", 1, imageCb2);


    ros::Rate rate(10.0);

    // ImageConverter ic;1
    while(ros::ok())
    {

        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}

参考文献:
[1] http://gazebosim.org/tutorials

<think>好的,我现在需要帮助用户在ROS2中通过realsense_ros_gazebo插件配置双目相机。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息可以直接应用。 用户提到了引用[1]、[2]、[3]。引用[3]提到Intel RealSense Gazebo/ROS支持多种相机,包括D435i,并且提供了URDF宏,这可能对配置有帮助。引用[2]提到了ros_gz_bridge的安装注意事项,可能需要确保gazeboros_gz_bridge正确安装。引用[1]中的ros launch命令可能对应ROS1,但用户是在ROS2环境下,所以可能需要调整。 首先,用户需要安装相关的ROS2包和依赖。根据引用[2],ros_gz_bridge可以通过apt安装,无需源码编译。因此,用户需要安装ros-humble-ros-gz-bridge(假设使用Humble版本)。此外,需要确认realsense_ros_gazebo插件是否支持ROS2。可能用户需要从源码编译这个插件,如果官方已经支持的话。 接下来,创建URDF文件来描述双目相机。引用[3]提到使用URDF宏,可能需要参考项目中的示例,比如包含realsense相机的宏,并设置双目相关的参数,如相机类型为stereo,调整基线距离等。可能需要修改或创建一个新的URDF文件,指定相机类型为D435或其他支持双目的型号。 然后,配置Gazebo仿真环境,确保相机模型正确加载,并且通过ros_gz_bridge建立话题转发。用户需要编写或修改launch文件,启动Gazebo、加载URDF模型,并启动桥接节点。在launch文件中,可能需要包括启动Gazebo、加载模型、启动桥接的节点,并设置相应的参数,比如配置左右相机的像话题。 测试部分,用户可能需要使用RViz2查看相机数据,或者通过命令行工具检查话题是否正常发布。如果遇到问题,比如像不显示,可能需要检查URDF中的传感器配置,确保Gazebo插件正确加载,或者桥接参数是否正确。 最后,用户可能需要参考官方文档或社区资源解决常见问题,比如相机模型在Gazebo中的位置、噪声模拟,或者同步设置。 需要确认的几点:realsense_ros_gazebo是否支持ROS2,是否需要从特定分支克隆;URDF宏的具体写法;以及launch文件在ROS2中的语法差异(比如使用Python launch文件而非XML)。可能需要指导用户正确克隆仓库,编译,并在launch文件中正确引用节点和参数。</think>在ROS2中通过$realsense\_ros\_gazebo$配置双目相机需完成以下步骤: ### 一、环境准备 1. 安装$ros\_gz\_bridge$(确保Gazebo版本与ROS2兼容): ```bash sudo apt-get install ros-humble-ros-gz-bridge # 以Humble为例 ``` 该工具负责ROS2与Gazebo的通信桥接[^2] 2. 获取$realsense\_ros\_gazebo$插件: ```bash git clone https://github.com/IntelRealSense/realsense-ros_gazebo -b ros2 ``` 需注意选择对应ROS2版本的分支 ### 二、URDF配置 创建双目相机描述文件$d435_stereo.urdf.xacro$: ```xml <?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find realsense_ros_gazebo)/urdf/_d435.xacro"/> <xacro:realsense_d435 parent="camera_link" camera_name="stereo_cam" camera_type="stereo" enable_pointcloud:=false> <origin xyz="0 0 0.1" rpy="0 0 0"/> </xacro:realsense_d435> </robot> ``` 关键参数说明: - $camera\_type=stereo$ 启用双目模式 - 基线距离通过$baseline$参数调整(默认0.05m) - 分辨率设置$width=848$, $height=480$[^3] ### 三、启动文件配置 创建$stereo_launch.py$: ```python from launch import LaunchDescription from launch_ros.actions import Node from launch.actions import ExecuteProcess def generate_launch_description(): return LaunchDescription([ # 启动Gazebo ExecuteProcess( cmd=['gzserver', '--verbose', '-s', 'libgazebo_ros_init.so'], output='screen' ), # 加载相机模型 Node( package='gazebo_ros', executable='spawn_entity.py', arguments=['-entity', 'd435', '-file', '$(find your_pkg)/urdf/d435_stereo.urdf'] ), # 建立话题桥接 Node( package='ros_gz_bridge', executable='parameter_bridge', arguments=[ '/stereo_cam/left/image@sensor_msgs/msg/Image[gz.msgs.Image', '/stereo_cam/right/image@sensor_msgs/msg/Image[gz.msgs.Image' ] ) ]) ``` ### 四、数据验证 1. 查看像话题: ```bash ros2 topic list | grep image ``` 应出现$/stereo\_cam/left/image$和$/stereo\_cam/right/image$ 2. RViz2可视化: ```bash ros2 run rviz2 rviz2 -d $(find realsense_ros_gazebo)/rviz/dual_camera.rviz ``` ### 五、常见问题处理 | 问题现象 | 解决方案 | |---------|----------| | 像无数据 | 检查URDF中的$update\_rate$是否>0 | | 视差不匹配 | 调整$baseline$参数并重新生成点云 | | 时间不同步 | 启用$use\_sim\_time$参数 | ### 高级配置 1. 添加噪声模型: ```xml <xacro:realsense_d435 ... noise_type="gaussian" noise_mean="0.0" noise_stddev="0.007"/> ``` 2. 同步采集设置: ```python arguments=[ '/stereo_cam/left/image@sensor_msgs/msg/Image[gz.msgs.Image @synced_timestamp', '/stereo_cam/right/image@sensor_msgs/msg/Image[gz.msgs.Image @synced_timestamp' ] ``` [^1]: 运行ros launch realsense_gazebo_description multicamera.launch [^2]: ros2中ros_gz_bridge/gazebo安装的注意事项 : Intel RealSense Gazebo/ROS技术特性
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值