基于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 & 蜜汁建图
题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...
随机推荐
- java封装详解
三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...
- shell脚本将字符串按指定分隔符切分成数组
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下: array_name=(value1 value2 ... valuen) keyword=1,sdg,dd ...
- 2019牛客暑期多校训练营(第五场)H-subsequence 2 (拓扑排序+思维)
>传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输 ...
- Codeforces Round #658 (Div. 2) D. Unmerge(dp)
题目链接:https://codeforces.com/contest/1382/problem/D 题意 给出一个大小为 $2n$ 的排列,判断能否找到两个长为 $n$ 的子序列,使得二者归并排序后 ...
- 【uva 1658】Admiral(图论--网络流 最小费用最大流)
题意:有个N个点M个边的有向加权图,求1~N的两条不相交路径(除了起点和终点外没有公共点),使得权和最小. 解法:不相交?也就是一个点只能经过一次,也就是我后面博文会讲的"结点容量问题&qu ...
- Proud Merchants HDU - 3466 01背包&&贪心
最近,我去了一个古老的国家.在很长一段时间里,它是世界上最富有.最强大的王国.结果,这个国家的人民仍然非常自豪,即使他们的国家不再那么富有.商人是最典型的,他们每个人只卖一件商品,价格是Pi,但是如果 ...
- 2.PowerShell概述
PowerShell PowerShell命令窗一般随系统带着,运行->输入:powershell,即可打开命令窗口. 命令 Powershell有诸多命令,兼容cmd命令 语法和命令 在此我推 ...
- 833A The Meaningless Game
A. The Meaningless Game time limit per test 1 second memory limit per test 256 megabytes input stand ...
- μC/OS-III---I笔记12---任务管理
任务管理任务切换应该算是UCOS最基本的部分,首先保存当前任务寄存器的内容到当前任务的堆栈:接着弹出即将进行的任务的堆栈内容到寄存器中然后就是按寄存器内容执行,这个过程成为上下文切换.任务堆栈在创建任 ...
- JavaScript 实现 (ECMAScript 6)
JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象: DOM 描述了处理网页内容的方法和接口: BOM 描述了与浏览器进行交互的方法和接口. ECMAScript.DOM ...