ROS2_Foxy学习9——多机激光SLAM先导篇

  • 1 环境准备
  • 2 ROS1下测试SLAM
    • 2.1 cartographer 源码测试
    • 2.2 rplidar_ros 源码测试
    • 2.3 rplidar_ros + cartographer
  • 3 ROS2下测试SLAM
    • 3.1 cartographer 安装测试(失败)
    • 3.2 rplidar_ros 移植到 ROS2
  • 4 ROS1 & ROS2下测试SLAM
    • 4.1 ros1_bridge
    • 4.2 ROS1 & ROS2 & cartographer
  • 参考

  这篇文章的整体目的是在多个车上跑slam,通过ROS2_Foxy将地图集中到一个电脑下,然后拼接成一张地图。
  一开始的想法是车上用ROS2跑SLAM,由于各大开源SLAM算法对ROS2不支持或者支持不完善(又因为 懒 能力不够,不能把代码从ROS1移植到ROS2),因而,使用ROS1跑SLAM,然后通过ROS2的包ros1_bridge在各车与电脑之间传递数据,从而实现此项目。
  在引入ros1_bridge之前,先写一写在ROS1上跑开源SLAM,以及在ROS2上跑开源SLAM的一些过程。
  因为 没做完 内容较多,所以分了几个部分来写,这一篇是探索可行性的。

1 环境准备

设备 处理器 系统 ROS1版本 ROS2版本
电脑 amd64_酷睿i7 5500U_内存8GB Ubuntu 20.04 LTS Noetic Foxy
arm64_树莓派4B_内存4GB Ubuntu mate 20.04 LTS - Foxy

  激光雷达使用思岚RPLidarA1,由于这个雷达频率较低,因此开源SLAM选择cartographer。没有选择Hector的原因除了RPLidarA1扫描频率太低,用Hector效果不理想外,Hector官方没有给ROS2的版本,自己移植太费时间。

2 ROS1下测试SLAM

2.1 cartographer 源码测试

  参考官方文档:https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html 。

# 安装工具sudo apt-get updatesudo apt-get install -y python3-wstool python3-rosdep ninja-build stow# 下载源码mkdir catkin_wscd catkin_wswstool init srcwstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstallwstool update -t src# 安装依赖sudo rosdep initrosdep updaterosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y# 手动安装abseil-cpp库src/cartographer/scripts/install_abseil.sh# 编译安装. /opt/ros/noetic/setup.bash  #(记得source ros1的安装位置)catkin_make_isolated --install --use-ninja# 跑个包. install_isolated/setup.bash     #(记得source cartographer的安装位置)wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bagroslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag

  跑的bag大概是这样子:

2.2 rplidar_ros 源码测试

  参考官方文档:https://github.com/Slamtec/rplidar_ros 。

# 下载源码mkdir -p catkin_ws/srccd catkin_ws/srcgit clone https://github.com/Slamtec/rplidar_ros.git# 编译. /opt/ros/noetic/setup.bash #(记得source ros1的安装位置)catkin_make# 连接雷达,并赋予设备权限(根据实际情况,选择设备名称)sudo chmod 777 /dev/ttyUSB0# 跑个demo(记得source rplidar_ros的安装位置). devel/setup.bash       # 因为只编译,没有安装,所以没有install文件夹roslaunch rplidar_ros test_rplidar.launch

  跑的是这样子:
  再跑个rviz的demo

 roslaunch rplidar_ros view_rplidar.launch

  跑的是这样子:

2.3 rplidar_ros + cartographer

1、准备源码
  新建工作空间,并把cartographerrplidar_ros的源码包放到/src文件夹下。
2、编写cartographer的launch文件和lua配置文件
  直接参考源码给的demo来改,主要参考了cartographer_ros包下的launch/demo_revo_lds.launch及其对应的configuration_files/revo_lds.lua,改动的文件内容如下,这里是重新编写了两个文件,并将这两个新文件放在了跟参考文件同一个文件夹内:

launch文件:cartoForRplidar.launch <—— demo_revo_lds.launch

<launch>  <--!false 是因为要使用真实雷达数据,不用仿真时间 /--><param name="/use_sim_time" value="false" />  <--!注意configuration_basename 后面的配置文件名,要与实际的lua文件名一致 /--><node name="cartographer_node" pkg="cartographer_ros"  type="cartographer_node" args="  -configuration_directory $(find cartographer_ros)/configuration_files  -configuration_basename rplidar.lua"  output="screen">  <--!这句实际上,可以删掉 /--><remap from="scan" to="scan" />  </node>  <node name="rviz" pkg="rviz" type="rviz" required="true"  args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
</launch>

lua文件:rplidar.lua <—— revo_lds.lua
  这个文件只改了tracking_frame和published_frame,这两个frame,一般是laser,需要根据雷达ros驱动的实际情况配置。

include "map_builder.lua"
include "trajectory_builder.lua"options = {map_builder = MAP_BUILDER,trajectory_builder = TRAJECTORY_BUILDER,map_frame = "map",tracking_frame = "laser",published_frame = "laser",odom_frame = "odom",provide_odom_frame = true,publish_frame_projected_to_2d = false,use_pose_extrapolator = true,use_odometry = false,use_nav_sat = false,use_landmarks = false,num_laser_scans = 1,num_multi_echo_laser_scans = 0,num_subdivisions_per_laser_scan = 1,num_point_clouds = 0,lookup_transform_timeout_sec = 0.2,submap_publish_period_sec = 0.3,pose_publish_period_sec = 5e-3,trajectory_publish_period_sec = 30e-3,rangefinder_sampling_ratio = 1.,odometry_sampling_ratio = 1.,fixed_frame_pose_sampling_ratio = 1.,imu_sampling_ratio = 1.,landmarks_sampling_ratio = 1.,
}MAP_BUILDER.use_trajectory_builder_2d = trueTRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65return options

3、编译
  catkin_make和catkin_make_isolated都可以,区别是后者使用一个隔离的构建过程,其中每个包都是独立配置、构建和加载到环境中的,解决了目标冲突、目标依赖项管理和项目之间其他不希望的交叉对话的问题,缺点是比较慢,具体参考这篇博客。
  tips:编译后再修改launch或lua文件,只编译单独的包即可

 catkin_make_isolated --pkg cartographer_ros

4、跑一跑
  先跑cartographer再跑rplidar_ros,如果反了,似乎不太行,原因还没有深究。

# 首先的首先,配置环境变量. /opt/ros/noetic/setup.bash. devel_isolated/setup.bash     # 因为只编译,没有安装,所以没有install文件夹# 首先运行 cartographerroslaunch cartographer_ros cartoForRplidar.launch# 然后运行 rplidar_rosroslaunch rplidar_ros test_rplidar.launch

  出图:

3 ROS2下测试SLAM

3.1 cartographer 安装测试(失败)

  ROS2_Foxy上使用cartographer有两种方式:命令行安装和源码编译安装。

# 命令行sudo apt install ros-foxy-cartographer
#源码https://github.com/cartographer-project/cartographer_ros/tree/ros2-dashing

  cartographer似乎正在开发一个新版本(点击了解详情),直到去年11月还在开发中…

3.2 rplidar_ros 移植到 ROS2

  参考这里:ros2激光雷达功能包移植(思岚rplidar A1) 。
1、下载代码,然后找到rplidar_ros的包,并拷贝到自己的工作空间的src目录下

 git clone https://github.com/DylanLN/oryxbot_ws-ros2.git

2、编译、测试

# 编译. /opt/ros/foxy/setup.bashcolcon build# 跑一跑. install/setup.bashsudo chmod 777 /dev/ttyUSB0 ros2 launch rplidar_ros rplidar_A1.launch.py

  另开一个终端,跑rviz2

 . /opt/ros/foxy/setup.bash. install/setup.bashrviz2

  出图:
因为cartographer还没有成功在ROS2上跑,所以这里没有跑slam,等后面官方移植完善了,再看看。

4 ROS1 & ROS2下测试SLAM

  好了,现在到了先导篇,最奇怪的一部分了:在ROS2上跑rplidar_ros,然后通过ros1_bridge把激光数据传到ROS1,然后在ROS1中运行cartographer进行建图。
  按照前言中讲述的内容,激光雷达与cartographer都在ROS1环境下,车辆与电脑之间应该传递的是单车slam建图的结果,那么这里为什么把激光雷达放到ROS2下,然后在ROS1中接收ROS2的激光数据进行建图呢?因为不想在树莓派上,装完ROS2,再装ROS1,所以车子的作用变成了只采集激光数据,然后通过ROS2传到电脑,电脑端在ROS1中进行SLAM。
  也许,后面会尝试在树莓派上再装个ROS1?

4.1 ros1_bridge

1、小前言
  ros1_bridge是ROS2为了兼容ROS1而开发的包,这里介绍下基本的使用方法,然后将其应用到项目中。学习就是看看官网教程,这个包的安装过程可以命令行直接安装。

 sudo apt install ros-foxy-ros1-bridge

2、跑一跑(要开四个终端)

# Shell A (ROS 1 only):
. /opt/ros/noetic/setup.bash
roscore# Shell B (ROS 1 + ROS 2):
# Source ROS 1 first:
. /opt/ros/noetic/setup.bash
# Source ROS 2 next:
. /opt/ros/foxy/setup.bash
export ROS_MASTER_URI=http://localhost:11311   # 这里根据 Shell A 实际情况改
ros2 run ros1_bridge dynamic_bridge# Shell C:
. /opt/ros/noetic/setup.bash
rosrun rospy_tutorials talker# Shell D:
. /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp listener

  出图:

4.2 ROS1 & ROS2 & cartographer

1、ROS1下,跑cartographer,这会同时启动roscore

 . /opt/ros/noetic/setup.bash. devel_isolated/setup.bashroslaunch cartographer_ros cartoForRplidar.launch

2、ROS1和ROS2下,跑ros1_bridge

 . /opt/ros/noetic/setup.bash. /opt/ros/foxy/setup.bashexport ROS_MASTER_URI=http://localhost:11311 ros2 run ros1_bridge dynamic_bridge

3、ROS2下,跑rplidar_ros

 . /opt/ros/foxy/setup.bash. install/setup.bashros2 launch rplidar_ros2 rplidar_A1.launch.py# 这个包名叫rplidar_ros2而非rplidar_ros,是因为修改了launch文件,'frame_id': 'laser'# 以便于在下一部分与cartographer的frame对接正确

4、出图
  可以看到,ROS1的cartographer拿到数据正在建图,第二张图右上角的终端显示两个ROS正在通过话题sensor_msgs/LaserScan通信。

参考

1、ROS(Kinetic和Melodic)下使用cartographer踩坑记录和部分谣言终结
2、catkin_make, cmake, catkin build区别
3、ros2激光雷达功能包移植(思岚rplidar A1)

ROS2_Foxy学习9——多机激光SLAM先导篇相关推荐

  1. ROS2_Foxy学习10——多机激光SLAM准备篇

    ROS2_Foxy学习10--多机激光SLAM准备篇 1 安装Ubuntu20.04 mate 2 安装ROS noetic 3 安装cartographer 4 详细配置cartographer 5 ...

  2. 机器人学习--网友资料系列 激光SLAM建图、粒子滤波定位和位姿图优化

    一.移动机器人自主导航的前提是在未知环境中先构建地图 (目前市内很多用的2D激光雷达,构建栅格地图,相当于立体空间中的某个水平面高度的切面) 一般用的是2D 激光SLAM算法 构建概率栅格占用地图: ...

  3. 彻底搞懂基于LOAM框架的3D激光SLAM全套学习资料汇总!

    地图定位算法是自动驾驶模块的核心,而激光SLAM则是地图定位算法的关键技术,其重要性不言而喻,在许多AI产品中应用非常多(包括但不限于自动驾驶.移动机器人.扫地机等).相比于传统的视觉传感器,激光传感 ...

  4. 激光SLAM如何帮助自动驾驶准确定位和建图?

    应用背景介绍 目前自动驾驶行业日趋火热,除了原有自动驾驶第一梯队的百度,一些知名大厂如华为.小米.OPPO等纷纷入局.新造车势力和自动驾驶初创公司更是如雨后春笋:图森.智加科技.Momenta.文远知 ...

  5. 九.激光SLAM框架学习之LeGO-LOAM框架---速腾Robosense-16线雷达室外建图和其他框架对比、录包和保存数据

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  6. 七.激光SLAM框架学习之A-LOAM框架---速腾Robosense-16线雷达室内建图

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  7. SLAM相关学习资料:综述/激光/视觉/数据集/常用库

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨菠萝包包包@知乎 来源丨https://zhuanlan.zhihu.com/p/4348743 ...

  8. 十三.激光SLAM框架学习之livox-Mid-70雷达使用和实时室外跑框架

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  9. 激光SLAM学习--移动机器人技术系列课(智东西)

    移动机器人技术系列课1:利用激光SLAM实现移动机器人在复杂环境下的自主导航 边旭,深圳优艾智合机器人科技有限公司CTO,西安交通大学机器人学博士 [提纲] 1.AMR机器人的关键技术解析 2.SLA ...

最新文章

  1. 1-6-RHEL7用户管理和如何恢复root密码
  2. 安全报告显示2015年DDoS攻击强度创下新纪录
  3. 1.3.2 向量化实现浅层神经网络
  4. Android NDK学习(3)使用Javah命令生成JNI头文件 .
  5. 循环-20. 猜数字游戏(15)
  6. mysql从库夯住_MySQL从库维护经验分享
  7. 内推 | 字节跳动算法提前批
  8. c# 之继承、封装、多态
  9. 使用JDBC处理Oracle大数据
  10. vb串口 任意波特率_串口通讯基本知识
  11. 使用队列(Queue)解决简单的并发问题
  12. ItemsControl Grouping分组
  13. java ee自学_自学JavaEE难度大不大?
  14. u盘修复计算机系统,用u盘修复win7系统
  15. CS217 1_Intro Hardware Accelerators for Machine Learning
  16. T19136 交通指挥系统 题解
  17. vue:antV G2在vue中的使用(阿里图表,类似echarts)
  18. excel小技巧 生成递增时间区间
  19. SilkTest武林外史之7-简单web测试
  20. fluent当中的梯度宏和VOF梯度的获取【转载】

热门文章

  1. Access学习要点2----Access2010中如何运行SQL执行SQL语句
  2. cpu超线程优缺点_cpu看起来很高级的超线程到底对你有什么用?
  3. 计算机领域最新技术视频,浅析计算机技术在视频编辑领域的应用
  4. IT技术培训趋势 2020 和2021 最受欢迎的是数字运营和人工智能
  5. 米家扫地机器人重置网络_手机换了小米扫地机如何连接wifi_米家机器人重置wifi...
  6. 终端安全管理有什么优势和价值?
  7. 主从复制错误处理总结
  8. 【EI检索_AMM】第二届工业设计与机械动力(ICIMDP2013)征稿中 距离截稿日期仅有八天
  9. Unity动画状态的获取和常用判断(逐步完善)
  10. 计算机文档排版软件,正式文档排版格式计算机软件及应用IT计算机专业资料-正式文档排.pdf...