Gazebo仿真记录 Turtlebot3 + D435i

本文介绍如何在Gazebo仿真环境中为Turtlebot3添加Realsense D435深度相机与IMU设备,并解决了相关问题,如IMU话题发布失败和D435i仿真无点云输出等问题。

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

在Gazebo环境中在Turtlebot3上添加深度相机D435和IMU。

步骤

1.准备工作

创建ROS工作空间,下载turtlebot3相关代码和realsense2_description 模型文件放到工作空间下。
Turtlebot3:主要是turtlebot3turtlebot3_simulationsturtlebot3_msgs
realsense2_description:存放Realsense相关型号的相机模型文件及xacro文件。这里的相机型号包括d415、d345、r410、r430和t265。可以用view_d415_model.launch等在Gazebo中打开查看。在这里插入图片描述

2.添加相机D435

以在turtlebot-burger上添加D435为例,首先需要包含_d435.urdf.xacro文件。

<xacro:include filename="$(find realsense2_description)/urdf/_d435.urdf.xacro" />

然后,将上述文件中构造的d435传感器模型添加到turtlebot-burger上,

  <xacro:sensor_d435 name="camera" topics_ns="camera" parent="base_link" publish_pointcloud="true">
    <origin xyz="0 0 0.1" rpy="0 0 0" />
  </xacro:sensor_d435>

3.添加IMU

turtlebot_burger文件里面已经添加了imu的相关设置。

  <gazebo>
    <plugin name="imu_plugin" filename="libgazebo_ros_imu.so">
      <alwaysOn>true</alwaysOn>
      <bodyName>imu_link</bodyName>
      <frameName>imu_link</frameName>
      <topicName>imu</topicName>
      <serviceName>imu_service</serviceName>
      <gaussianNoise>0.0</gaussianNoise>
      <updateRate>0</updateRate>
      <imu>
        <noise>
          <type>gaussian</type>
          <rate>
            <mean>0.0</mean>
            <stddev>2e-4</stddev>
            <bias_mean>0.0000075</bias_mean>
            <bias_stddev>0.0000008</bias_stddev>
          </rate>
          <accel>
            <mean>0.0</mean>
            <stddev>1.7e-2</stddev>
            <bias_mean>0.1</bias_mean>
            <bias_stddev>0.001</bias_stddev>
          </accel>
        </noise>
      </imu>
    </plugin>
  </gazebo>

也可以参考[1]的方法添加IMU

  <gazebo reference="camera_link">
    <gravity>true</gravity>
    <sensor name="imu_sensor" type="imu">
      <always_on>true</always_on>
      <update_rate>200</update_rate>
      <visualize>true</visualize>
      <topic>__default_topic__</topic>
      <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
        <topicName>d435i/imu</topicName>
        <bodyName>camera_link</bodyName>
        <updateRateHZ>200.0</updateRateHZ>
        <gaussianNoise>0.0</gaussianNoise>
        <xyzOffset>0.0 0.0 0.0</xyzOffset>
        <rpyOffset>0.0 0.0 0.0</rpyOffset>
        <frameName>imu_link_</frameName>
      </plugin>
      <pose>0 0 0 0 0 0</pose>
    </sensor>
  </gazebo>

在Gazebo仿真时发现没有IMU话题发布,后来发现可能是libgazebo_ros_imu_sensor.so文件缺失,但是并没有报错。重新安装Gazebo之后问题解决。
sudo apt-get install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control

仿真结果

在这里插入图片描述

获取相机内参

执行 rostopic echo /camera/color/camera_info,得到

 header: 
  seq: 1114
  stamp: 
    secs: 37
    nsecs: 526000000
  frame_id: "camera_color_optical_frame"
height: 480
width: 640
distortion_model: "plumb_bob"
D: []
K: [462.1379699707031, 0.0, 320.0, 0.0, 462.1379699707031, 240.0, 0.0, 0.0, 1.0]
R: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
P: [462.1379699707031, 0.0, 320.0, 0.0, 0.0, 462.1379699707031, 240.0, 0.0, 0.0, 0.0, 1.0, 0.0]
binning_x: 0
binning_y: 0
roi: 
  x_offset: 0
  y_offset: 0
  height: 0
  width: 0
  do_rectify: False

对上述参数理解参考[4]

# Projection/camera matrix
#     [fx'  0  cx' Tx]
# P = [ 0  fy' cy' Ty]
#     [ 0   0   1   0]

#     [fx  0 cx]
# K = [ 0 fy cy]
#     [ 0  0  1]

其他

最早的计划是直接添加D435i模型,但是折腾了很久没有实现。同时参考[1],对于实体realsense-d435i,会有相关realsense软件包实现时间同步等工作,但是在Gazebo环境中与普通的camera+imu组合并没有区别,最终选择了分别添加D435和IMU.

Github项目Turtlebot3_with_Realsense_D435i里面给出了D435i模型,但并没有找到Tutrlebot3_with_Realsense_D435i/turtlebot3/turtlebot3_description/urdf_d435i.gazebo.xacro文件中所需要的librealsense_gazebo_accel_sensor.so和librealsense_gazebo_gyro_sensor.so文件。

本文的urdf文件修改主要参考了leochien1110/turtlebot3_d435,如果有更好的方法或建议可以私信或者评论区,在此感谢!

参考链接[5]给出了在无人机上添加realsense D435i的实现。

修正

上述的leochien1110/turtlebot3_d435项目中的,在添加burger模型时,对base_footprint 和base_link 之间的变换做了一些修改:
原来的代码为:

  <joint name="base_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link"/>
    <origin xyz="0.0 0.0 0.010" rpy="0 0 0"/>
  </joint>

而在上述项目中被修改为:

  <joint name="base_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link"/>
    <origin xyz="0.0 0.0 0.010" rpy="0 0 3.14"/>
  </joint>

即rpy的值做了修改,会导致算法仿真时出现一些错误,需要注意。

问题解决

D435i仿真无点云输出

使用rostopic list命令,可以查询到深度点云话题/camera/depth/color/points,但是当通过rostopic echo /camera/depth/color/points获取深度点云数据时,会出现以下报错:
在这里插入图片描述
对比了leochien1110/turtlebot3_d435项目的文件,发现在如下的文件中重复包含了realsense2_description/urdf/_d435.urdf.xacro文件(第6行)
在这里插入图片描述
在自己对应的文件中同样添加 <xacro:include filename="$(find realsense2_description)/urdf/_d435.urdf.xacro" />,问题解决,原因不详。

参考资料:
[1] Gazebo环境下VIO SLAM系统实现
[2] Gazebo使用笔记(10)–gazebo插件与传感器的添加
[3] Gazebo官方教程Tutorial: Using Gazebo plugins with ROS
[4] Gazebo仿真Kinect相机内参获取,以及fx fy cx cy 的理解
[5] realsense D435i gazebo slam(px4)仿真

<think>好的,我现在需要帮助用户解决两个问题:一是在Ubuntu终端中保存输入的代码,二是使用roslaunch启动turtlebot3_gazebo仿真环境的具体用法。首先,我得回顾用户之前的提问和我的回答,确保这次的回答符合之前的建议,同时结合用户提供的引用内容。 用户提到之前的回答已经涵盖了终端输出保存的方法,但这次用户问的是保存输入的代码,也就是保存用户在终端输入的命令,而不是输出结果。这需要不同的方法,可能需要使用像script这样的命令或者历史记录功能。同时,用户还引用了关于TurtleBot3和roslaunch的相关内容,特别是引用[1]和[2]中的命令,所以需要将这些信息整合到回答中。 首先,保存终端输入的代码。常见的方法包括使用script命令记录整个会话,或者利用bash的历史功能。用户可能希望保存他们输入的命令以便后续查看或重复使用。需要详细说明这两种方法,并给出具体的命令示例,比如如何用script生成日志文件,如何从历史记录中导出命令到文件。 接下来是关于roslaunch启动turtlebot3_gazebo仿真环境的使用说明。根据引用[1]和[3],用户可能需要设置环境变量,比如TURTLEBOT3_MODEL,然后运行特定的launch文件。需要分步骤说明如何正确设置环境变量,如何启动仿真环境,以及常见问题,比如模型未设置导致的错误,或者launch文件路径的问题。引用[2]中提到用户可能在更改gazebo world时遇到错误,所以需要提醒检查world文件的路径是否正确,参数设置是否恰当。 此外,用户可能遇到的典型错误需要指出,例如未设置TURTLEBOT3_MODEL变量会导致启动失败,这时候应该参考引用[1]中的命令,先导出变量再执行roslaunch。同时,可能需要解释如何修改launch文件中的参数,比如更换world文件,需要找到正确的路径并修改对应的arg值,类似引用[2]中的情况。 最后,生成相关问题时要结合用户当前的问题,考虑他们可能进一步想知道如何修改仿真环境参数,如何保存ROS节点的输出,或者如何调试常见的启动错误等。确保问题具有逻辑连贯性,帮助用户深入探索相关主题。 总结回答结构,首先分两部分:保存终端输入的方法和roslaunch的使用说明。每部分给出具体步骤和示例命令,注意事项部分涵盖常见错误和解决方法。最后的相关问题要引导用户到可能的后续疑问。</think>根据您的问题需求,结合ROS机器人开发场景,以下是分步骤说明: ### 一、Ubuntu终端保存输入代码的方法 #### 方法1:使用`script`命令全程记录 ```bash script -a terminal_commands.log # 开始记录所有输入和输出 export TURTLEBOT3_MODEL=waffle_pi # 示例命令[^1] roslaunch turtlebot3_gazebo turtlebot3_world.launch # 用户目标命令 exit # 输入exit或Ctrl+D结束记录 ``` 生成文件包含:所有输入命令、命令输出、时间戳 #### 方法2:提取历史命令 ```bash history | grep "roslaunch" > my_commands.txt # 筛选包含roslaunch的历史命令 cat ~/.bash_history | tail -n 20 > recent_cmds.txt # 提取最近20条命令 ``` ### 二、turtlebot3_gazebo仿真环境使用指南 #### 1. 必要前提条件 ```bash sudo apt install ros-<distro>-turtlebot3-gazebo # 替换为实际ROS版本 source /opt/ros/<distro>/setup.bash # 激活ROS环境 ``` #### 2. 标准启动流程 ```bash # 必须指定机器人型号(二选一) export TURTLEBOT3_MODEL=burger # 基础车型[^1] # export TURTLEBOT3_MODEL=waffle_pi # 带摄像头的型号 roslaunch turtlebot3_gazebo turtlebot3_world.launch # 核心启动命令 ``` 成功启动后可见:Gazebo仿真界面+空场地环境+TurtleBot3机器人 #### 3. 参数定制方法 ```bash # 修改世界环境(参考报错处理[^2]) roslaunch turtlebot3_gazebo turtlebot3_world.launch world_file:=$(find turtlebot3_gazebo)/worlds/turtlebot3_house.world # 带Rviz可视化 roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch ``` ### 三、常见问题处理 1. **模型未定义错误** ```bash ERROR: [turtlebot3_gazebo] model not found ``` 解决方法:必须执行`export TURTLEBOT3_MODEL=burger/waffle_pi`[^1] 2. **world文件路径错误** ```bash [ERROR] GazeboRosControlPlugin missing <legacyModeNS>... ``` 解决方法:确认`find turtlebot3_gazebo`返回正确路径,检查package是否安装 3. **同时启动多个节点** ```bash roslaunch turtlebot3_gazebo turtlebot3_simulation.launch # 包含SLAM和导航 ``` ### 四、高级应用示例 ```bash # 带自定义参数的完整示例 export TURTLEBOT3_MODEL=waffle_pi roslaunch turtlebot3_gazebo turtlebot3_world.launch \ x_pos:=1.0 y_pos:=-0.5 z_pos:=0.01 \ world_file:=$(find turtlebot3_gazebo)/worlds/turtlebot3_demo.world ```
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

90的尾巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值