基于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的建图导航探索的更多相关文章

  1. SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图

    摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...

  2. cartographer环境建立以及建图测试(详细级)

  3. 基于CarbonData的电信时空大数据探索

    摘要:作为IOT最底层的无线通信网络生成大量与位置相关的数据,用于无线通信网络规划和优化,帮助电信运营商建设更好体验的精品网络,构建万物互联的信息社会. 本文分享自华为云社区<基于CarbonD ...

  4. 【BZOJ-2879】美食节 最小费用最大流 + 动态建图

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1366  Solved: 737[Submit][Status] ...

  5. 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载

    今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章   基于webpack的前端工程化开发解决方案探索(一):动态生成HTML  中的遗留问题:webpack将如何处理按需加载的 ...

  6. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  7. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  8. CF467D Fedor and Essay 建图DFS

      Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...

  9. UVa 3487 & 蜜汁建图

    题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...

随机推荐

  1. UI和3D物体的堆叠响应

    一.问题:当3D物体和UI元素重叠显示时一般UI元素会遮挡物体,这时点击UI元素响应时UI后方的物体也会响应. private void OnMouseDown() { ChangeColor(); ...

  2. LSTM机器学习生成音乐

    目录 LSTM机器学习生成音乐 数据集介绍 将mid转成note数组 将note数组转成mid文件 获取数据集并将其保存 将note进行编号 构建数据集 截取数据 进行one-hot编码 构建模型 训 ...

  3. HDFS读写流程(转载)

    概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现.特点如下:    能够运行在廉价机器上,硬件出错常态,需要具备高容错性    ...

  4. jmespath(1)基础语法

    前言 JMESPath是JSON的查询语言.您可以从JSON文档中提取和转换元素 官方文档:https://jmespath.org/tutorial.html 基本表达式 JMESPath用的最多的 ...

  5. CF Hello 2020 E.New Year and Castle Construction

    E.New Year and Castle Construction 题意 给定n个点,对于每个点\(p\),求出4-point 子集(该子集有四个点,并且围成的圈包含\(p\))的个数 数据给的点中 ...

  6. Codeforces Round #650 (Div. 3) E. Necklace Assembly (暴力)

    题意:有一个字符串,要求使用其中字符构造一个环(不必全部都用),定义一个环是k美的,如果它转\(k\)次仍是原样,现在给你\(k\),要求最长的k美环的长度. 题解:我们首先看\(k\),如果一个环转 ...

  7. sort排序使用以及lower_bound( )和upper_bound( )

    sort()原型: sort(first_pointer,first_pointer+n,cmp) 排序区间是[first_pointer,first_pointer+n)      左闭右开 参数1 ...

  8. 系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案

    一.问题由来 前一段时间本人的电脑崩溃了,系统还原之后,eclipse就用不了,也找不大原因.eclipse报错原因是jvm出现问题:JVM terminated Exit code=2 C:\Pro ...

  9. 逆元 exgcd 费马小定理 中国剩余定理的理解和证明

    一.除法取模逆元 如果我们要通过一个前面取过模的式子递推出其他要取模的式子,而递推式里又存在除法 那么一个很尴尬的事情出现了,假如a[i-1]=100%31=7 a[i]=(a[i-1]/2)%31 ...

  10. Linux 驱动框架---驱动中的异步

    异步IO是对阻塞和轮询IO的机制补充,所谓异步IO就是在设备数据就绪时主动通知所属进程进行处理的机制.之所以说是异步是相对与被通知进程的,因为进程不知道也无法知道什么时候会被通知:这一机制非常类似于硬 ...