cartographer跑自己的数据包-2d建图篇(laser+Imu建图篇)

2023-11-06 03:20

本文主要是介绍cartographer跑自己的数据包-2d建图篇(laser+Imu建图篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(猫崽子生病了,这一段时间忙着给它看病,花了好多钞票了!哎!)
相信大家装cartographer都可以跑通官网上的示例教程,所以,博主就在这里写一些跑自己数据包的经验,一呢,作为记录,预防自己老年健忘,二呢,跟大家分享一下经验。
如标题所示,博主用的是激光雷达数据和IMU数据进行建图。

硬件:北科天绘16线机械激光雷达,水平视角360度,10hz/s.惯导:诺瓦泰惯导系统,这个应该是全世界最好的惯导系统了吧.(如果不是,才疏学浅,孤陋寡闻,请见谅)
软件:Ubuntu1604,ROS-Kinetic,cartographer框架
(建议:改动文件建议自己复制源文件进行新建文件改动,源文件作为保留用。)
废话不多说,开始吧!

  1. 第一步,确定硬件之间的坐标转换关系.
    根据上面所说,我用到了一个多线雷达和IMU,所以在跑数据时必须要有这两个传感器的TF树变换关系.在cartographer中,用的是URDF文件进行构建该关系,当然,后来我在实车测试时屏蔽了这个文件,直接用车上的tf变换关系也是可以的,只要加入imu到激光雷达的变化即可.cartographer的urdf文件定义在~/catkin_cartographer/install_isolated/share/cartographer_ros/urdf$中,名字自己要记住,比如我的是"minibus.urdf",要说的是,在源文件夹里的urdf其实可以不用配置.下面会详细讲到.
    如下我的urdf文件:
<!--Copyright 2016 The Cartographer AuthorsLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
--><robot name="mini"><material name="orange"><color rgba="1.0 0.5 0.2 1" /></material><material name="gray"><color rgba="0.2 0.2 0.2 1" /></material><link name="imu"><visual><origin xyz="0 0 0" /><geometry><box size="0.06 0.04 0.02" /></geometry><material name="orange" /></visual></link><link name="lidar_mid"><visual><origin xyz="0 0 0" /><geometry><cylinder length="0.05" radius="0.03" /></geometry><material name="gray" /></visual></link><joint name="imu2lidar" type="fixed"><parent link="lidar_mid" /><child link="imu" /><origin xyz="0 0 0" /></joint></robot>

这里稍作解释:里面首先定义了两个坐标系,一个imu 的,一个雷达的,变换关系是通过joint关节信息进行添加,要根据你们自己实际情况进行添加,博主太懒,所以,变换参数懒得去填写了,依然是跑的通的.

  1. 第二步,准备数据,这个不麻烦,自己准备2d数据包即可,实在找不到的,博主这里附上自己的2d数据包,名字是2d.bag,自行下载.
    链接: https://pan.baidu.com/s/1zBTHFrH0_8b5pzh4wOSfYg 提取码: 6375 复制这段内容后打开百度网盘手机App,操作更方便哦

里面是我通过3d点云转过来的数据.

  1. 第三步,配置文件条理,这个步骤其实不复杂,只是每在配置文件夹里改一次,就要去源文件夹里做一下相同的修改.先贴路径,
    配置文件夹路径:
    在这里插入图片描述
    源文件夹路径:
~/catkin_cartographer/src/cartographer_ros/cartographer_ros/

这两个文件夹里最主要的东西都是一样的,configuration_files是存储.lua的文件夹,launch是存储启动命令的文件夹,urdf是存储小车模型的文件夹.
**注意:**配置文件夹里的urdf决定了你的小车的模型,即TF树,源文件夹里的urdf你可以不用管.
而urdf文件在上面有说过了.

  1. 第四步,开始配置:
    1.首先,进入配置文件夹里的configuration_files文件夹,新建my_robot.lua文件(你可以复制原本的backpack_2d.lua,然后修改内容).我的文件内容如下:
include "map_builder.lua"
include "trajectory_builder.lua"options = {map_builder = MAP_BUILDER,trajectory_builder = TRAJECTORY_BUILDER,map_frame = "map",tracking_frame = "imu",  #这里用到了imu,所以跟踪的是imu,如果只用雷达,把这个写lidar_midpublished_frame = "lidar_mid",odom_frame = "odom",provide_odom_frame = false,#我不用里程计publish_frame_projected_to_2d = false,use_pose_extrapolator = false,use_odometry = false,use_nav_sat = false,#不用GPSuse_landmarks = false,num_laser_scans = 1,#雷达个数num_multi_echo_laser_scans = 0,num_subdivisions_per_laser_scan = 1,#这个参数必须要填,>=1,博主目前也没搞明白.num_point_clouds = 0,#3d的话这里要改,2d填0lookup_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.num_accumulated_range_data = 1return options

保存退出,进入同级目录的launch文件夹下,新建demo_my_robot.launch文件(可复制backpack_2d.launch,然后修改),内容如下

<launch><param name="robot_description"textfile="$(find cartographer_ros)/urdf/minibus.urdf" />#这里是你第一步定义的urdf文件<node name="robot_state_publisher" pkg="robot_state_publisher"type="robot_state_publisher" /><node name="cartographer_node" pkg="cartographer_ros"type="cartographer_node" args="-configuration_directory $(find cartographer_ros)/configuration_files-configuration_basename my_robot.lua"#这里是你刚才新建的lua文件output="screen"><remap from="scan" to="/scan" />#这里是我的2d包里雷达话题/Scan到carto框架Scan的映射<remap from="imu" to="/imu" /></node><node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"type="cartographer_occupancy_grid_node" args="-resolution 0.05" />
</launch>

注意:用的时候要删除我的汉字注释,xml文件的注释方式不是#,博主只是懒的打那些符号了.
然后,在该文件夹里找到demo_backpack_2d.launch文件,用gedit打开修改成:

<launch><param name="/use_sim_time" value="true" /><include file="$(find cartographer_ros)/launch/demo_my_robot.launch" />#这里是你刚才建立的launch文件<node name="rviz" pkg="rviz" type="rviz" required="true"args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" /><node name="playbag" pkg="rosbag" type="play"args="--clock $(arg bag_filename)" />
</launch>

保存退出到同级目录中,进入urdf文件夹,检查minibus.urdf文件是否存在,且里面坐标变换关系是否正确.至此,配置文件夹里的改动结束.

5.第五步, 配置源文件夹里的文件.
步骤按照配置文件夹里的配置步骤来,懒的话,直接复制过去也是可以的.

6.第六步, 检查两个文件夹里做了相同的配置之后,保存退出到工作空间路径:

cd ~
cd ~/catkin_cartographer/
catkin_make_isolated --install --use-ninja
source devel_isolated/setup.bash
  1. 第七步,至此,所有步骤搞定,来试试吧:
cd ~
cd ~/catkin_cartographer/
source devel_isolated/setup.bash
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=~/2d.bag

不出意外你将会看到这个(csdn好像不能插动图,反正允许插入动图博主也不会,才疏学浅,孤陋寡闻,各位请见谅!)

在这里插入图片描述

  1. 保存地图
    这里统一默认将地图保存为.pbstream的格式,当你觉得图建的不错 时候,另起终端,输入如下两条命令。
cd catkin_cartographer/
source devel_isolated/setup.bash
rosservice call /finish_trajectory 0
rosservice call /write_state "{filename: '${HOME}/Downloads/mymap.pbstream'}"

至此,完工,建好的图也被保存在了Home/Download/路径下,名字为mymap.pbstream。

建图过程中,默认开了全局的闭环,所以你能清晰看到路径修正.效果很棒,个人感觉,不要太棒了!不过,后面测试定位的 时候发现,室内2d建图加纯定位模式成功了,但在室外,纯定位用不了.下一篇,想出一篇配置参数的含义的文章.
(博主今天刚刚实车测试了3d,效果更棒,不管是室内室外都不影响,而且室外定位相当稳,哈哈哈哈,这个后面我会再出一篇来讲的.)

这篇关于cartographer跑自己的数据包-2d建图篇(laser+Imu建图篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354190

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

cartographer+turtlebot+hokuyo|安装配置

cartographer+turtlebot+hokuyo|安装配置 系统:ubuntu 14.04+ros indigo 或 ubuntu 16.04+ros kinetic 平台:turtlebot2 传感器:hokuyo UTM-30LX laser 本文假设已经成功安装ubuntu,ros,以及各种与turtlebot相关的ros package等。本文主要介绍,怎么安装配car

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

Ubuntu20.04+ros-noetic配置Cartographer

一、概述         因为要配置激光SLAM,Cartographer属于激光雷达SLAM 中比较经典的一款,在学习之前先将其在Ubuntu20.04首先配置出来并成功运行demo。 二、具体操作 (一)概述         使用平台是Windows的wsl2上的Ubuntu20.04子系统,双系统与虚拟机的安装原理与这个相同。主要依照的安装操作是官方文档,链接如下所示。 Runni

ModuleNotFoundError: No module named ‘diffusers.models.dual_transformer_2d‘解决方法

Python应用运行报错,部分错误信息如下: Traceback (most recent call last): File “\pipelines_ootd\unet_vton_2d_blocks.py”, line 29, in from diffusers.models.dual_transformer_2d import DualTransformer2DModel ModuleNotF

IMU腕带评估轮椅用户运动健康

近期,美国的研究团队利用惯性测量单元(IMU)和机器学习来准确评估手动轮椅使用者的运动健康状况,这在康复训练和慢性病管理领域具有广阔的应用前景。 研究小组将运用高性能的IMU传感器固定到轮椅使用者佩戴的手腕带上,用来监测并记录轮椅推进过程中的运动数据。实验设置了不同强度的六分钟推力测试,结果证实仅使用IMU传感器就能准确捕捉到轮椅使用者的速度、距离和节奏变化,为心血管健康评估提供

用python fastapi写一个http接口,使ros2机器人开始slam toolbox建图

如果你想使用Python的FastAPI框架编写一个HTTP接口,以便通过接口启动ROS 2机器人的SLAM Toolbox建图,可以按照以下方式进行: 首先,确保你已经安装了fastapi和uvicorn库。你可以使用以下命令进行安装: pip install fastapi uvicorn 接下来,创建一个Python文件(例如app.py),并将以下代码添加到文件中: import

[LeetCode] 240. Search a 2D Matrix II

题:https://leetcode.com/problems/search-a-2d-matrix-ii/description/ 题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers i