基于ros2 dashing的建图导航探索
基于ros2 dashing的建图导航探索
1、 环境准备
安装ros2 dashing, 参考链接:
https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/
安装gazebo
$ sudo apt remove gazebo11 libgazebo11-dev
$ sudo apt install gazebo9 libgazebo9-dev
$ sudo apt install ros-dashing-gazebo-ros-pkgs
安装cartography:
$ sudo apt install ros-dashing-cartographer
$ sudo apt install ros-dashing-cartographer-ros
安装navigation:
$ sudo apt install ros-dashing-navigation2
$ sudo apt install ros-dashing-nav2-bringup
安装vcstool:
$ sudo apt install python3-vcs
安装turtlebot3包:
使用apt方式:
$ source /opt/ros/dashing/setup.bash
$ sudo apt install ros-dashing-dynamixel-sdk
$ sudo apt install ros-dashing-turtlebot3-msgs
$ sudo apt install ros-dashing-turtlebot3tool
或者使用源码方式:
$ sudo apt remove ros-dashing-turtlebot3-msgs
$ sudo apt remove ros-dashing-turtlebot3
$ mkdir -p ~/turtlebot3_ws/src
$ cd ~/turtlebot3_ws/src/
$ git clone -b dashing-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone -b dashing-devel https://github.com/ROBOTIS-GIT/turtlebot3.git
$ colcon build --symlink-install
$ source ~/.bashrc
下载gazebo的模型,加速运行gazebo
cd ~/.gazebo/
git clone https://github.com/osrf/gazebo_models models
需要删除.git目录,要不运行会出错
rm -rf models/.git
设置GAZEBO_MODEL_PATH变量, 指定机器人类型为burger
$ echo 'export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/tb3_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models' >> ~/.bashrc #变更为对应的turtlebot3模型地址
$ echo 'export TURTLEBOT3_MODEL=waffle' >> ~/.bashrc
$ source ~/.bashrc
配置其他环境变量:
$ echo 'source /opt/ros/dashing/setup.bash' >> ~/.bashrc
$ echo 'source ~/turtlebot3_ws/install/setup.bash' >> ~/.bashrc
$ echo 'export ROS_DOMAIN_ID=30 #TURTLEBOT3' >> ~/.bashrc
$ source ~/.bashrc
2、使用cartography建图相关探索
2.1 建图流程
打开仿真世界launch文件:
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
打开建图launch文件:
$ ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
打开小车运动控制节点:
$ ros2 run turtlebot3_teleop teleop_keyboard
控制小车移动,直到在rviz里看到完整的地图,保存地图:
$ ros2 run nav2_map_server map_saver -f ~/map
激光数据话题重定向问题:
打开建图的launch文件后,理论上应该会看到小车当前激光雷达扫描的状态,但实际上rviz里啥也没有,并且有报错说frame [map] is not exist.
经过定位问题发现,话题/scan并没有发布数据,故而无法生成map, 而后发现该问题是由于模拟器中,雷达数据以/turtlebot3_laserscan/out话题发布, 需要做个话题remapping,将数据映射到/scan话题中。
解决方法: 参考链接 https://github.com/ros-simulation/gazebo_ros_pkgs/issues/991 中issue所述,问题已经在ros2 e及f版本中解决,在d版本中,打开文件:turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf,在160行左右,将文件改为如下后,在/scan下可正常获得数据:
<plugin name="turtlebot3_laserscan" filename="libgazebo_ros_ray_sensor.so">
<ros>
<!-- <namespace>/tb3</namespace> -->
<argument>--ros-args</argument>
<argument>-r</argument>
<argument>~/out:=scan</argument>
</ros>
<output_type>sensor_msgs/LaserScan</output_type>
<frame_name>base_scan</frame_name>
</plugin>
2.2 cartography的配置文件
配置文件名称及路径:
turtlebot3/turtlebot3/turtlebot3_cartographer/config/turtlebot3_lds_2d.lua
相关配置解读:
1 map_frame:
用来发布子图,是poses的父帧,通常是“map”。
和odom最开始的时候是一个原点,但时间累计对产生累积误差。
2 tracking_frame:
由SLAM算法跟踪的坐标系。如果使用IMU,尽管它可能是旋转的,它也应该在其位置。
一个常见的选择是“imu_link”。
3 published_frame:
这个frame是用来正在发布poses的子帧,和map_frame对应。
一般就将其设置为"base_link",这不就是"map->base_link"。
找坐标能找到了不!!!
4 odom_frame:
仅在provide_odom_frame为true时使用。
published_frame 和 map_frame之间的框架,用于发布(非循环关闭)local SLAM结果。
默认是“odom”。
5 provide_odom_frame:
如果启用,则local-slam估计的连续的姿态(不包括回环)将作为map_frame中 odom_frame发布。
6 publish_frame_projected_to_2d:
如果启用,则已发布的pose将限制为纯2D姿势(无滚动,俯仰或z偏移)。
这可以防止在2D模式中由于"pose extrapolation
step"而发生的"out-of-plane"(如果姿势应该作为类似“base-footprint”发布)。
7 use_odommetry:
如果启用,请在主题“odom”上订阅nav_msgs/Odometry。
在这种情况下必须提供"Odommetry",并且信息将包含在SLAM中。
8 use_nav_sat:
如果启用,请在主题“fix”上订阅sensor_msgs / NavSatFix。 在这种情况下必须提供Navigation data,并且信息将包含在全局SLAM中。
9 use_landmarks:
如果启用,请在主题“Landmarks”上订阅cartographer_ros_msgs / LandmarkList。
在这种情况下必须提供Landmarks,并且信息将包含在SLAM中。
10 num_laser_scans:
订阅的激光扫描主题数量。
在一个激光扫描仪的“扫描”主题上订阅sensor_msgs /LaserScan
或在多个激光扫描仪上订阅主题“scan_1”,“scan_2”等。
11 num_subdivisions_per_laser_scan:
将每个接收到的(multi-echo)激光扫描分割成的点云数。
细分扫描可以在扫描仪移动时取消扫描获取的扫描。
有一个相应的轨迹构建器选项可将细分扫描累积到"用于scan_matching的点云"中。
12 num_multi_echo_laser_scans:
订阅的multi-echo激光扫描主题的数量。
在一个激光扫描仪的“echoes”主题上订阅sensor_msgs / MultiEchoLaserScan,
或者为多个激光扫描仪订阅主题“echoes_1”,“echoes_2”等。
时间间隔设置参数:
13 lookup_transform_timeout_sec:
使用tf2查找变换的超时时间
14 submap_publish_period_sec:
发布子图的时间间隔,单位是秒
15 pose_publish_period_sec:
发布pose的时间间隔,比如:5e-3频率是200Hz
16 trajectory_publish_period_sec:
以秒为单位发布轨迹标记的间隔,例如, 30e-3持续30毫秒。
其中,不使用imu数据参与建图,可将use_imu_data设为false:
TRAJECTORY_BUILDER_2D.use_imu_data = false
其中,不使用odom数据参与建图,可将use_odometry设为false,并将published_frame从odom修改为base_link或base_footprint
use_odometry = false
published_frame = "base_link" #否则tf转换会出现问题,导致无法建图,参考: https://answers.ros.org/question/311263/odometry-with-cartographer/
3. navigation导航相关探索
3.1 导航流程
参考链接可正常运行:
https://github.com/mlherd/navigation2/tree/new-tutorials/doc/tb3_tutorial
启动gazebo:
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
启动navigation:
ros2 launcturtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:='/opt/ros/dashing/share/nav2_bringup/launch/turtlebot3_world.yaml' # map需改为对应的文件及路径
启动rviz:
ros2 run rviz2 rviz2 -d /opt/ros/dashing/share/nav2_bringup/launch/nav2_default_view.rviz
在rviz点击左下角startup启动按钮:
在rviz点击启动设置初始位姿按钮2D Pose Estimate,并设置初始位姿:
在rviz点击启动设置初始位姿按钮Navigation2 Goal,设置目标点位姿:
此时可见生成了一条运动轨迹,并在gazebo里能看到小车按照轨迹在运动:
遇到的问题1:
刚开始运行的时候参考了链接: https://emanual.robotis.com/docs/en/platform/turtlebot3/slam_simulation/, 以及链接: https://www.ncnynl.com/archives/202008/3852.html.
运行ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME_PATH/map.yaml失败,发现navigation2.launch.py中所需要的bringup.launch.py在dashing 版本的nav2_bringup中不存在,在foxy版本中才有,故而尝试将navigation2.launch.py中的launch文件更新为nav2_bringup_launch.py
IncludeLaunchDescription(
PythonLaunchDescriptionSource([nav2_launch_file_dir, '/nav2_bringup_launch.py']), #需要修改此处
launch_arguments={
'map': map_dir,
'use_sim_time': use_sim_time,
'params': param_dir}.items(),
),
遇到的问题2:
运行后发现rviz里不能发现map, 也没有相关地图显示,检索后发现到了以下issue: https://github.com/ros-planning/navigation2/issues/1042, 指出需要在rviz里点击一些startup按钮,并需要指定初始位姿,才可以开始导航。
参考链接:
https://blog.csdn.net/SimileciWH/article/details/84861718
https://www.cnblogs.com/jiangxinyu1/p/12458699.html