ros2与turtlebot3仿真教程-使用rtabmap建图
说明
- 介绍如何利用turtlebot3的gazebo仿真实现rtabmap建图
- 测试环境: ros2 humble + rtabmap
步骤
利用rcm安装turtlebot3仿真,参考文章ros2与turtlebot3仿真教程-安装turtlebot3
安装rtabmap,$ROS_DISTRO为系统默认的ros2版本
sudo apt install ros-$ROS_DISTRO-rtabmap-ros
- 复制命令到终端即可安装
配置
- 安装完成后,还需要配置使用深度相机,更改模型,地址位于
~/ros2_tb3_sim_ws/src/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf
- 修改内容步骤为:
# Modify turtlebot3_waffle SDF:
# 1) Edit /opt/ros/$ROS_DISTRO/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf
# 2) Add
# <joint name="camera_rgb_optical_joint" type="fixed">
# <parent>camera_rgb_frame</parent>
# <child>camera_rgb_optical_frame</child>
# <pose>0 0 0 -1.57079632679 0 -1.57079632679</pose>
# <axis>
# <xyz>0 0 1</xyz>
# </axis>
# </joint>
# 3) Rename <link name="camera_rgb_frame"> to <link name="camera_rgb_optical_frame">
# 4) Add <link name="camera_rgb_frame"/>
# 5) Change <sensor name="camera" type="camera"> to <sensor name="camera" type="depth">
# 6) Change image width/height from 1920x1080 to 640x480
# 7) Note that we can increase min scan range from 0.12 to 0.2 to avoid having scans
# hitting the robot itself
- 已经修改的内容如下,可以对比之前的model.sdf
<link name="camera_link"/>
<!-- <link name="camera_rgb_frame"> -->
<link name="camera_rgb_optical_frame">
<inertial>
<pose>0.069 -0.047 0.107 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0.000</ixy>
<ixz>0.000</ixz>
<iyy>0.001</iyy>
<iyz>0.000</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.035</mass>
</inertial>
<pose>0.069 -0.047 0.107 0 0 0</pose>
<!-- <sensor name="camera" type="camera"> -->
<sensor name="camera" type="depth">
<always_on>true</always_on>
<visualize>true</visualize>
<update_rate>30</update_rate>
<camera name="intel_realsense_r200">
<horizontal_fov>1.02974</horizontal_fov>
<image>
<!-- <width>1920</width>
<height>1080</height> -->
<width>640</width>
<height>480</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.02</near>
<far>300</far>
</clip>
<noise>
<type>gaussian</type>
<!-- Noise is sampled independently per pixel on each frame.
That pixel's noise value is added to each of its color
channels, which at that point lie in the range [0,1]. -->
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
</camera>
<plugin name="camera_driver" filename="libgazebo_ros_camera.so">
<ros>
<!-- <namespace>test_cam</namespace> -->
<!-- <remapping>image_raw:=image_demo</remapping> -->
<!-- <remapping>camera_info:=camera_info_demo</remapping> -->
</ros>
<!-- camera_name>omit so it defaults to sensor name</camera_name-->
<!-- frame_name>omit so it defaults to link name</frameName-->
<!-- <hack_baseline>0.07</hack_baseline> -->
</plugin>
</sensor>
</link>
<!-- depth -->
<link name="camera_rgb_frame"/>
<joint name="camera_rgb_optical_joint" type="fixed">
<parent>camera_rgb_frame</parent>
<child>camera_rgb_optical_frame</child>
<pose>0 0 0 -1.57079632679 0 -1.57079632679</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name="base_joint" type="fixed">
<parent>base_footprint</parent>
<child>base_link</child>
<pose>0.0 0.0 0.010 0 0 0</pose>
</joint>
<joint name="wheel_left_joint" type="revolute">
<parent>base_link</parent>
<child>wheel_left_link</child>
<pose>0.0 0.144 0.023 -1.57 0 0</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name="wheel_right_joint" type="revolute">
<parent>base_link</parent>
<child>wheel_right_link</child>
<pose>0.0 -0.144 0.023 -1.57 0 0</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name='caster_back_right_joint' type='ball'>
<parent>base_link</parent>
<child>caster_back_right_link</child>
</joint>
<joint name='caster_back_left_joint' type='ball'>
<parent>base_link</parent>
<child>caster_back_left_link</child>
</joint>
<joint name="imu_joint" type="fixed">
<parent>base_link</parent>
<child>imu_link</child>
<pose>-0.032 0 0.068 0 0 0</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name="lidar_joint" type="fixed">
<parent>base_link</parent>
<child>base_scan</child>
<pose>-0.064 0 0.121 0 0 0</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name="camera_joint" type="fixed">
<parent>base_link</parent>
<child>camera_link</child>
<pose>0.064 -0.065 0.094 0 0 0</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name="camera_rgb_joint" type="fixed">
<parent>camera_link</parent>
<!-- <child>camera_rgb_frame</child> -->
<child>camera_rgb_optical_frame</child>
<pose>0.005 0.018 0.013 0 0 0</pose>
<axis>
<xyz>0 0 1</xyz>
</axis>
</joint>
测试
- 启动gazebo
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
- 效果图
- 启动rtabmap
ros2 launch rtabmap_demos turtlebot3_rgbd.launch.py
或分步执行
$ ros2 launch rtabmap_launch rtabmap.launch.py visual_odometry:=false frame_id:=base_footprint odom_topic:=/odom args:="-d" use_sim_time:=true rgb_topic:=/camera/image_raw depth_topic:=/camera/depth/image_raw camera_info_topic:=/camera/camera_info approx_sync:=true qos:=2
$ ros2 run topic_tools relay /rtabmap/map /map
- 效果图
- 启动导航
#新开终端
ros2 launch nav2_bringup navigation_launch.py use_sim_time:=True
- 启动rviz
#新开终端启动rviz
ros2 launch nav2_bringup rviz_launch.py
- 效果图
- 启动遥控
ros2 run turtlebot3_teleop teleop_keyboard
- 利用遥控或通过rviz上指定目标点,可以移动小车进行建图
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号