基于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
基于ros2 dashing的建图导航探索的更多相关文章
- SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图
摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...
- cartographer环境建立以及建图测试(详细级)
- 基于CarbonData的电信时空大数据探索
摘要:作为IOT最底层的无线通信网络生成大量与位置相关的数据,用于无线通信网络规划和优化,帮助电信运营商建设更好体验的精品网络,构建万物互联的信息社会. 本文分享自华为云社区<基于CarbonD ...
- 【BZOJ-2879】美食节 最小费用最大流 + 动态建图
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1366 Solved: 737[Submit][Status] ...
- 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载
今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML 中的遗留问题:webpack将如何处理按需加载的 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图
4289: PA2012 Tax Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 168 Solved: 69[Submit][Status][Dis ...
- CF467D Fedor and Essay 建图DFS
Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...
- UVa 3487 & 蜜汁建图
题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...
随机推荐
- 飞塔5.4和5.6版本IPSec互备冗余测试
主电信.备联通:测试方法:修改诚盈的IPSec,将阶段一电信的对端地址改为错误的. 方法一: 通过静态路由的管理距离:电信设置为10:联通为15.经测试,可以实现自动切换,且电信恢复后 可以切换回电信 ...
- 痞子衡嵌入式:恩智浦MCUX SDK在GitHub上线了
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是恩智浦MCUX SDK 在GitHub上线一事. 其实在差不多一个月前(2021年1月6日),恩智浦MCUX SDK就在GitHub悄悄上 ...
- 【函数分享】每日PHP函数分享(2021-2-6)
array_combine - 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 说明: array_combine ( array $keys , array $values ) : ...
- SpringMVC数据校验并通过国际化显示错误信息
目录 SpringMVC数据校验并通过国际化显示错误信息 SpringMVC数据校验 在页面中显示错误信息 通过国际化显示错误信息 SpringMVC数据校验并通过国际化显示错误信息 SpringMV ...
- 理解了这三点,才敢说自己会写Python代码
某同学应聘Python岗位被录用.上班第一天,Leader吩咐他写一个获取次日日期信息的函数.该同学信心满满地写下了这样一段代码, 然后就没有然后了. import time def get_next ...
- Educational Codeforces Round 88 (Rated for Div. 2) B、New Theatre Square C、Mixing Water
题目链接:B.New Theatre Square 题意: 你要把所有"." 都变成"*",你可以有两个选择,第一种就是一次铺一个方块(1*1),第二种就是同一 ...
- Codeforces Global Round 12 D. Rating Compression (思维,双指针)
题意:给你一长度为\(n\)的数组,有一长度为\(k\ (1\le k \le n)\)的区间不断从左往右扫过这个数组,总共扫\(n\)次,每次扫的区间长度\(k=i\),在扫的过程中,每次取当前区间 ...
- JavaScript——内置对象
- Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors (数学)
题意:有\(n\)组数,对于每组数,问是否能找到两个因子\(d_{1},d{2}\),使得\(gcd(d_{1}+d_{2},a_{i}=1)\),如果有,输出它们,否则输出\(-1\). 题解:对于 ...
- PowerShell随笔9--- call
很多时候我们需要在一个脚本文件执行另外一个脚本文件,比如我们有一个Test.ps1文件 我们有以下2种方法: Invoke-Expression (&) 我们可以看到,Test.ps1中的代码 ...