Ubuntu18.04安装ROS2并使用ROS1的bag和cartographer来建图_ros2 cartographer-程序员宅基地

技术标签: 自动驾驶  SLAM  bag包  cartographer  ROS2  slam源码学习  

概述

笔记本电脑为ubuntu18.04,其上已经安装了ROS1(melodic),现预切换为ROS2来测试下建图是否有隐患。所以在ROS1基础上安装了ROS2,并在ROS2上安装cartographer以测试建图效果。

1.安装ROS2

电脑中本身已经具备ROS1,现在其基础上安装ROS2,选择版本为eloquent。

1)安装python3及colcon

$ sudo apt install -y libpython3-dev python3-pip
$ pip3 install -U argcomplete
$ sudo apt-get install python3-colon-common-extensions

2) 添加ROS2的源

$ sudo apt update && sudo apt install curl gnupg2 lsb-release
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64] http://packages.ros.org/ros2/ubuntu bionic main" > /etc/apt/sources.list.d/ros2-latest.list'

3)安装eloquent桌面版本

$ sudo apt update
$ sudo apt install ros-eloquent-desktop

ros2的安装要比ros1快很多。

4)修改~/.bashrc

为了使ROS1与ROS2共存,在.bashrc中删除了之前对ROS1设置的环境变量,如下所示:

source /opt/ros/melodic/setup.bash
source ~/**_ws/devel/setup.bash

2 安装cartographer及cartographer_ros

1) 安装cartographer

  采用二进制的方式,如下:
$ sudo apt-get install ros-eloquent-cartographer

2) 安装cartographer_ros

  采用二进制的方式,如下:
$ sudo apt-get install ros-eloquent-cartographer-ros

此安装的路径为/opt/ros/eloquent/cartographer
/opt/ros/eloquent/cartographer_ros

3. 测试cartographer

   由于在之前使用ros1时录制了激光雷达scan、惯导imu、里程计odom、静态TF的数据,所以想着直接拿过来在ROS2中使用。

1) 创建launch启动文件

   在ROS2中launch文件为python编写的。我们需要切换到cartographer_ros的安装路径然后创建launch文件。
$  cd /opt/ros/eloquent/cartographer_ros
$  sudo mkdir -p launch &&  cd launch
$  sudo vi car_cartographer.launch.py

其内容如下:

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import ThisLaunchFileDir
 
 
def generate_launch_description():
    use_sim_time = LaunchConfiguration('use_sim_time', default='true')
    cartographer_prefix = get_package_share_directory('cartographer_ros')
    cartographer_config_dir = LaunchConfiguration('cartographer_config_dir', default=os.path.join(
                                                  cartographer_prefix, 'configuration_files'))
    configuration_basename = LaunchConfiguration('configuration_basename',
                                                 default='ucar_2d.lua')
 
    resolution = LaunchConfiguration('resolution', default='0.05')
    publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0')
 
    return LaunchDescription([
        DeclareLaunchArgument(
            'cartographer_config_dir',
            default_value=cartographer_config_dir,
            description='Full path to config file to load'),
        DeclareLaunchArgument(
            'configuration_basename',
            default_value=configuration_basename,
            description='Name of lua file for cartographer'),
        DeclareLaunchArgument(
            'use_sim_time',
            default_value='false',
            description='Use simulation (Gazebo) clock if true'),
 
        Node(
            package='cartographer_ros',
            node_executable='cartographer_node',
            node_name='cartographer_node',
            output='screen',
            parameters=[{'use_sim_time': use_sim_time}],
            arguments=['-configuration_directory', cartographer_config_dir,
                       '-configuration_basename', configuration_basename]),
 
        DeclareLaunchArgument(
            'resolution',
            default_value=resolution,
            description='Resolution of a grid cell in the published occupancy grid'),
 
        DeclareLaunchArgument(
            'publish_period_sec',
            default_value=publish_period_sec,
            description='OccupancyGrid publishing period'),
 
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource([ThisLaunchFileDir(), '/occupancy_grid.launch.py']),
            launch_arguments={'use_sim_time': use_sim_time, 'resolution': resolution,
                              'publish_period_sec': publish_period_sec}.items(),
        ),
 
        Node(
            package='rviz2',
            node_executable='rviz2',
            node_name='rviz2',
            parameters=[{'use_sim_time': use_sim_time}],
            output='screen'),
    ])

该启动文件中启动了cartographer_ros 、生成栅格地图的occupancy_grid.launch.py节点以及rviz2,同时还加载了一些参数项,如cartographer的配置文件"ucar_2d.lua"(与ROS1中相同),"/use_sim_time"“publishe_period_sec”等。可以看出其未设置传感器的话题名称。

下面需要创建occupancy_grid.launch.py 以及ucar_2d.lua。

2) 创建栅格地图生成节点occupancy_grid.launch.py

其目录与1)中创建的启动文件相同

$  sudo vi occupancy_grid.launch.py

内容如下:

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
 
 
def generate_launch_description():
    use_sim_time = LaunchConfiguration('use_sim_time', default='false')
    resolution = LaunchConfiguration('resolution', default='0.05')
    publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0')
 
    return LaunchDescription([
        DeclareLaunchArgument(
            'resolution',
            default_value=resolution,
            description='Resolution of a grid cell in the published occupancy grid'),
 
        DeclareLaunchArgument(
            'publish_period_sec',
            default_value=publish_period_sec,
            description='OccupancyGrid publishing period'),
 
        DeclareLaunchArgument(
            'use_sim_time',
            default_value='false',
            description='Use simulation (Gazebo) clock if true'),
 
        Node(
            package='cartographer_ros',
            node_executable='occupancy_grid_node',
            node_name='occupancy_grid_node',
            output='screen',
            parameters=[{'use_sim_time': use_sim_time}],
            arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]),
    ])

3) 创建配置文件ucar_2d.lua

   和ROS1相同,配置文件也存在于configuration_files目录下,其目录下已经存在一些示例文件,我们在其中创建我们自定义的配置文件。
$  cd /opt/ros/eloquent/cartographer_ros/configuration_files
$  sudo vi ucar_2d.lua

内容如下:

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
 map_builder = MAP_BUILDER,
 trajectory_builder = TRAJECTORY_BUILDER,
 map_frame = "map",
 tracking_frame = "base_link",
 published_frame = "base_link",
 odom_frame = "odom",
 provide_odom_frame = true,
 publish_frame_projected_to_2d = true,
 --use_pose_extrapolator = false,
 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 = true

TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 10
TRAJECTORY_BUILDER_2D.missing_data_ray_length =10.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true 
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1)

POSE_GRAPH.constraint_builder.min_score = 0.65
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7

return options

在这里我们不使用IMU和里程计,先使用激光来进行建图测试,所有配置文件中设置的tracking_frame和published_frame均为base_link。

以上我们将建图侧的准备工作做好了,下一步准确bag包,然后启动建图就可以了。

4)准备bag包数据并播放

如上所描述,我们的bag包为ROS1的,ROS2下想用也可以,需要使用ros2bag进行启动。首先安装ros2中相关的bag库

$  sudo apt-get install ros-eloquent-ros-ros2bag*  ros-eloquent-ros-rosbag_v2*

然后新建终端,先设置ROS的环境为ROS1即melodic。再设置为ROS2的eloquent,最后再用ros2的bag play来进行播放。在播放前不需要像ROS1一样设置/use_sim_time参数。

$ source /opt/ros/melodic/setup.bash
$ source /opt/ros/eloquent/setup.bash
$ ros2 bag play -s rosbag_v2 ~/tydk_without_odom.bag

5)启动建图指令

之后启动建图指令即可,新建一个终端

$ source /opt/ros/eloquent/setup.bash
$ ros2 launch cartographer_ros ucar_cartographer_ros.launch.py

6) 效果展示

两个终端,一个进行bag播放,一个进行建图,会弹出rviz界面,在其中添加/map、/PointCloud2插件即可。效果如下所示:

在这里插入图片描述

参考:
[1]: https://blog.csdn.net/fanshuaifang/article/details/114399792
[2]: https://www.guyuehome.com/35570

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43046653/article/details/123528234

智能推荐

SATI下载-安装-使用 一看便懂+spss聚类(附安装包)-程序员宅基地

文章浏览阅读1.1w次,点赞22次,收藏91次。1.下载安装包网盘提取:链接:https://pan.baidu.com/s/1jeZq3v9Lby5DDQUa7vbNoQ提取码:msn72.安装解压---点击.exe文件进行安装----使用3.使用实例如果有数据可以直接导入进行分析,这里是第一次使用,数据获取也分享一下首先打开知网,输入“人工智能”进行检索选择60条数据进行导出 打开SATI软件,选择刚刚导出的文件,1.2.3部完成后,点击转换按钮将转换后的文件保存,点击下面ok,i ..._sati下载

ps自定义形状工具_Acorn for Mac(轻量级图片处理工具)-程序员宅基地

文章浏览阅读573次。Acorn for Mac是一款运行在Mac OS X平台上的一款轻量级图片处理软件,它具备全面的图像编辑工具、圆形文字工具、矢量工具、各种照片效果等,如果你非常想编辑一些照片,但又不想打开类似于PS那样的大型图片处理软件,不妨可以试试这款acorn for mac,acorn mac 下载拥有ps的基础工具和滤镜效果,允许用户对图片进行移动和调整形状,作为ps的轻量级替代者,它功能强大,小巧简便..._ps 复制剪切粘贴形状下载 csdn

android原生!史上最全的Android面试题集锦,快来收藏!_安卓面试题-程序员宅基地

文章浏览阅读337次。开头在大厂,写得一手好文档是一个非常吃香的技能。这可不只是一个锦上添花的东西,而是很多工程师晋升,打造自己话语权的武器。 我这两年在组内的深刻体会就是,大部分厉害的高级工程师(不包括那些纯混日子靠资历晋升的人),写文档的能力一点也不含糊,很能抓住上级和项目的G点。可能有人会觉得,我技术牛逼就行了,为啥还要提高写文档的能力,有这功夫我还不如多看看源码分析?这是一些初级或者刚入门的工程师的普遍的困惑。这是因为大部分刚刚入行的朋友有一个很深的误区,就是他们以为做软件工程是一个和计算机打交道的工作,其实不然。_安卓面试题

C# 之 WPF 统计图表开发方案_c# wpflivechart-程序员宅基地

文章浏览阅读9.2k次,点赞8次,收藏72次。C# 之 WPF 统计图表开发文档一、前言二、环境配置1、开发环境2、加载 LiveCharts 库3、添加必须的头文件三、基础图形1、柱状图一、前言本项目的统计图使用LiveCharts 控件集成。LiveCharts, 官网:https://lvcharts.net 是一款简单,灵活,交互式和强大的 DOTNET数据可视化图表控件,内置多种统计图表,可满足本项目的需求。二、环境配置..._c# wpflivechart

DBeaver 快捷键大全_dbeaver快捷键-程序员宅基地

文章浏览阅读5k次,点赞7次,收藏23次。有些快捷键未经验证,如有问题望不吝指正!ctrl + enter 执行sqlctrl + \ 执行sql,保留之前窗口结果ctrl + alt + ↑ 向上复制一行ctrl + alt + ↓ 向下复制一行ctrl + shift + F 对sql语句进行格式化,对于很长的sql语句很有用ctrl + d 删除当前行alt + ↑ 向上选定一条sql语句alt + ↓ 向下选定一条sql语句ctrl + / 行注释ctrl + shift+ / 块注释ctrl + f 查找、替换_dbeaver快捷键

【基础】WebView浏览器组件-程序员宅基地

文章浏览阅读5.4k次。ad_webview

随便推点

Error: Loading PostCSS Plugin failed: Cannot find module ‘postcss-import‘_cannot find module 'postcss-import-程序员宅基地

文章浏览阅读2w次,点赞3次,收藏16次。Vue cli-3使用css转换postcss插件报错Error: Loading PostCSS Plugin failed: Cannot find module ‘postcss-import’寻找错误解决问题1.安装npm install postcss-px-to-viewport --save-dev2.添加配置文件postcss-config.js运行报错报错提示:没有找到 postcss-import模块猜想:①使用postcss插件需要额外npm install pos_cannot find module 'postcss-import

MySQL基础教程---Chapter 12 熟练使用存储过程_熟练编写存储过程-程序员宅基地

文章浏览阅读171次。以下为个人作为初学者的自己看书总结,访客看到有不足或差错之处,欢迎交流指正。day9 2020/10/23目录12.1 使用存储过程12.1.1 创建存储过程12.1.2 修改分隔符的设置12.1.3 执行存储过程12.1.4 创建只显示大于等于指定值的记录的存储过程12.2 显示、删除12.3 存储函数12.3.1 创建存储函数12.3.2 显示、删除12.4 触发器12.4.1 创建12.4.2 确认、删除12.1 使用存储过程将多个 SQL 语句组合成在一起,只需要使用 “CALL XX” 就_熟练编写存储过程

3. LaTeX图片的排版、引用与格式_latex引用图片-程序员宅基地

文章浏览阅读5.9w次,点赞108次,收藏415次。3. LaTeX图片的排版、引用与格式1.LaTeX 图片排版方式  在 LaTex 排版的论文写作中,LaTex 的所有宏包文件都要写在 \documentclass 命令之后和 \begin{document} 之前。在本文中,图片排版时使用到的宏包文件有:% 引言区\documentclass[utf-8]{article}\usepackage{ctex} \usepackage{graphicx} %% 图片包\usepackage{subfig} %% 子图包_latex引用图片

Hive中with cube、with rollup、grouping sets用法_hive cube null-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏14次。利用with cube、with rollup、grouping sets等进行分组查询_hive cube null

Python从入门到放弃(目录)-程序员宅基地

文章浏览阅读125次。Python基础第一篇:安装Python基础第二篇:初识Python基础第三篇:基本数据类型及运算Python基础第四篇:文件操作Python基础第五篇:函数初识Python基础第六篇:函数进阶Python基础第七篇:装饰器、迭代器、生成器Python基础第八篇:内置函数、匿名函数、递归Python基础第九篇:模块与包Python基础第十篇:常用模块..._python从入门到放弃(目录)

VScode 配置python3开发环境_${workspacefolder}/.env-程序员宅基地

文章浏览阅读1.1w次,点赞11次,收藏54次。本文转载自大兵小将0221《vscode 配置 python3开发环境》程序员宅基地。为了避免下次配置忘记,故而转载。1 安装插件python 这个是vscode提供的python 官方插件,提供了python代码的调试,自动补全,代码格式化等功能。vscode-icons 这个也是vscode官方提供的插件,作用是给vscode..._${workspacefolder}/.env

推荐文章

热门文章

相关标签