ROS2经验:ROS2 Galactic编译运行最新cartographer ROS2代码

ROS2经验:ROS2 Galactic编译运行最新cartographer ROS2代码_第1张图片

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


编译和安装


  1. 如果已经安装了Debian包版本的cartographer,需先卸载删除。
sudo apt remove ros-galactic-cartographer ros-galactic-cartographer-ros && sudo apt autoremove

  1. 安装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

  1. 创建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:= \
   bag_filename:=

当然我们主要还是要在自己的实际的机器人上跑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平左右的地图

ROS2经验:ROS2 Galactic编译运行最新cartographer ROS2代码_第2张图片

你可能感兴趣的:(ROS2,自动驾驶,经验分享)