赞
踩
Cartographer是一个可以在多个平台提供实时的 2D 和 3D同步定位和映射 ( SLAM ) 和传感器配置的系统。
Ubuntu上原本就可以使用apt命令安装支持ros2 galactic的cartographer软件包(ros-galactic-cartographer和ros-galactic-cartographer-ros )。
但是在使用中会发现这个版本的功能比较老旧:少了一些最新代码才有的配置参数,地图消息话题发布卡顿延迟,纯定位模式无法设置只保留3张子图。。
当然最重要的是没有源码,不能根据自己的需求去优化部分代码逻辑。
所以我们直接下载源代码来编译。
本教程将描述如何编译最新cartographer代码支持ros2 galactic。
开发环境
操作系统:Ubuntu 20.04
ROS版本:ROS2 Galactic
sudo apt remove ros-galactic-cartographer ros-galactic-cartographer-ros && sudo apt autoremove
sudo apt update sudo apt install -y \ clang \ cmake \ g++ \ git \ google-mock \ libceres-dev \ liblua5.3-dev \ libboost-all-dev \ libprotobuf-dev \ protobuf-compiler \ libeigen3-dev \ libgflags-dev \ libgoogle-glog-dev \ libcairo2-dev \ libpcl-dev \ libsuitesparse-dev \ python3-sphinx \ lsb-release \ ninja-build \ stow
注意,ROS2的cartographer是在ROS2的github仓库中维护的版本才能用,非cartographer官方仓库。
我这里把工作空间命名为cartoros2_ws。
mkdir -p ~/cartoros2_ws/src
cd ~/cartoros2_ws/src
git clone https://github.com/ros2/cartographer.git
git clone https://github.com/ros2/cartographer_ros.git
使用脚本安装abseil-cpp库
cd ~/cartoros2_ws
src/cartographer/scripts/install_abseil.sh
source /opt/ros/galactic/setup.bash
cd ~/cartoros2_ws
colcon build
等待完成后就可以运行使用了
运行前先确保
source /opt/ros/galactic/setup.bash
. ~/cartoros2_ws/install/local_setup.bash
可以和Cartographer ROS官网的教程一样运行bag文件(需要用ROS2的bag),只需把命令修改为:
建图:
ros2 launch cartographer_ros demo_backpack_2d.launch.py bag_filename:=<bag文件的路径>
纯定位:
ros2 launch cartographer_ros demo_backpack_2d_localization.launch.py \
load_state_filename:=<pbstream文件的路径> \
bag_filename:=<bag文件的路径>
当然我们主要还是要在自己的实际的机器人上跑cartographer。
已建图为例。
先复制一份lua参数配置文件,之后用于自己的机器人配置,我这里暂时命名为test.lua
cd ~/cartoros2_ws/src/cartographer_ros/cartographer_ros/configuration_files/
cp backpack_2d.lua test.lua
然后修改一份launch文件,我这里暂时命名为test.launch.py
cd ~/cartoros2_ws/src/cartographer_ros/cartographer_ros/launch/
cp backpack_2d.launch.py test.launch.py
以下贴出launch代码作为参考
# Author: Kal Lai from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription from launch.conditions import IfCondition, UnlessCondition from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node, SetRemap from launch_ros.substitutions import FindPackageShare from launch.launch_description_sources import PythonLaunchDescriptionSource import os def generate_launch_description(): use_sim_time = LaunchConfiguration('use_sim_time', default='false') ## ***** Launch arguments ***** use_sim_time_arg = DeclareLaunchArgument('use_sim_time', default_value = use_sim_time) ## ***** File paths ****** pkg_share = FindPackageShare('cartographer_ros').find('cartographer_ros') cartographer_node = Node( package = 'cartographer_ros', executable = 'cartographer_node', parameters = [{'use_sim_time': use_sim_time}], arguments = [ '-configuration_directory', FindPackageShare('cartographer_ros').find('cartographer_ros') + '/configuration_files', '-configuration_basename', 'test.lua'], output = 'screen' ) cartographer_occupancy_grid_node = Node( package = 'cartographer_ros', executable = 'cartographer_occupancy_grid_node', parameters = [ {'use_sim_time': use_sim_time}, {'resolution': 0.05}], ) return LaunchDescription([ use_sim_time_arg, cartographer_node, cartographer_occupancy_grid_node, ])
回到工作空间后编译安装
cd ~/cartoros2_ws
colcon build
然后就能运行了
ros2 launch cartographer_ros test.launch.py
贴个在RK3399上使用cartographer建的占地面积5000平左右的地图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。