ROS2_Foxy学习9——多机激光SLAM先导篇
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、准备源码
新建工作空间,并把cartographer和rplidar_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先导篇相关推荐
- ROS2_Foxy学习10——多机激光SLAM准备篇
ROS2_Foxy学习10--多机激光SLAM准备篇 1 安装Ubuntu20.04 mate 2 安装ROS noetic 3 安装cartographer 4 详细配置cartographer 5 ...
- 机器人学习--网友资料系列 激光SLAM建图、粒子滤波定位和位姿图优化
一.移动机器人自主导航的前提是在未知环境中先构建地图 (目前市内很多用的2D激光雷达,构建栅格地图,相当于立体空间中的某个水平面高度的切面) 一般用的是2D 激光SLAM算法 构建概率栅格占用地图: ...
- 彻底搞懂基于LOAM框架的3D激光SLAM全套学习资料汇总!
地图定位算法是自动驾驶模块的核心,而激光SLAM则是地图定位算法的关键技术,其重要性不言而喻,在许多AI产品中应用非常多(包括但不限于自动驾驶.移动机器人.扫地机等).相比于传统的视觉传感器,激光传感 ...
- 激光SLAM如何帮助自动驾驶准确定位和建图?
应用背景介绍 目前自动驾驶行业日趋火热,除了原有自动驾驶第一梯队的百度,一些知名大厂如华为.小米.OPPO等纷纷入局.新造车势力和自动驾驶初创公司更是如雨后春笋:图森.智加科技.Momenta.文远知 ...
- 九.激光SLAM框架学习之LeGO-LOAM框架---速腾Robosense-16线雷达室外建图和其他框架对比、录包和保存数据
专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...
- 七.激光SLAM框架学习之A-LOAM框架---速腾Robosense-16线雷达室内建图
专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...
- SLAM相关学习资料:综述/激光/视觉/数据集/常用库
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨菠萝包包包@知乎 来源丨https://zhuanlan.zhihu.com/p/4348743 ...
- 十三.激光SLAM框架学习之livox-Mid-70雷达使用和实时室外跑框架
专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...
- 激光SLAM学习--移动机器人技术系列课(智东西)
移动机器人技术系列课1:利用激光SLAM实现移动机器人在复杂环境下的自主导航 边旭,深圳优艾智合机器人科技有限公司CTO,西安交通大学机器人学博士 [提纲] 1.AMR机器人的关键技术解析 2.SLA ...
最新文章
- 1-6-RHEL7用户管理和如何恢复root密码
- 安全报告显示2015年DDoS攻击强度创下新纪录
- 1.3.2 向量化实现浅层神经网络
- Android NDK学习(3)使用Javah命令生成JNI头文件 .
- 循环-20. 猜数字游戏(15)
- mysql从库夯住_MySQL从库维护经验分享
- 内推 | 字节跳动算法提前批
- c# 之继承、封装、多态
- 使用JDBC处理Oracle大数据
- vb串口 任意波特率_串口通讯基本知识
- 使用队列(Queue)解决简单的并发问题
- ItemsControl Grouping分组
- java ee自学_自学JavaEE难度大不大?
- u盘修复计算机系统,用u盘修复win7系统
- CS217 1_Intro Hardware Accelerators for Machine Learning
- T19136 交通指挥系统 题解
- vue:antV G2在vue中的使用(阿里图表,类似echarts)
- excel小技巧 生成递增时间区间
- SilkTest武林外史之7-简单web测试
- fluent当中的梯度宏和VOF梯度的获取【转载】
热门文章
- Access学习要点2----Access2010中如何运行SQL执行SQL语句
- cpu超线程优缺点_cpu看起来很高级的超线程到底对你有什么用?
- 计算机领域最新技术视频,浅析计算机技术在视频编辑领域的应用
- IT技术培训趋势 2020 和2021 最受欢迎的是数字运营和人工智能
- 米家扫地机器人重置网络_手机换了小米扫地机如何连接wifi_米家机器人重置wifi...
- 终端安全管理有什么优势和价值?
- 主从复制错误处理总结
- 【EI检索_AMM】第二届工业设计与机械动力(ICIMDP2013)征稿中 距离截稿日期仅有八天
- Unity动画状态的获取和常用判断(逐步完善)
- 计算机文档排版软件,正式文档排版格式计算机软件及应用IT计算机专业资料-正式文档排.pdf...