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
编译和安装
- 如果已经安装了Debian包版本的cartographer,需先卸载删除。
sudo apt remove ros-galactic-cartographer ros-galactic-cartographer-ros && sudo apt autoremove
- 安装cartographer依赖库
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
- 创建cartographer_ros工作空间,并下载cartographer最新源码。
注意,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
4. 构建
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平左右的地图