Cartographer(3)lidar+IMU建图

news/2024/11/27 22:35:50/

目录

一、准备工作

 二、IMU-SRC 使用 / 信息确认

目录

一、准备工作

 二、IMU-SRC 使用 / 信息确认

2.1 首先从官网/Github/Ros-wiki 中找到自己IMU所对应的SRC

2.2 下载后需查看的信息

 2.3 编译与使用

三、Lidar与IMU接入cartographer算法

3.1 确认 Lidar 与 IMU 的 topic 与 frame_id 信息

3.2 修改demo_revo_lds.launch文件

3.3 修改revo_lds.lua文件

3.4 修改backpack_2d.urdf文件(优先看3.4.2容易理解)

3.4.1 请参照 3.1 中确认的信息,同下方代码进行对照

3.4.2 关于 3.3.1 中 两个 origin xyz 的解释

3.4.2 URDF与坐标系的变换(2022.10.12更新)

四、cartographer 编译与运行


一、准备工作

        1-1 保证你系统的 cartographer 可以使用(Demo可以正常使用)

        1-2 保证系统你选择的 Lidar 可以正常使用(SRC与Cartographer可以进行实际建图)

1-1 准备工作请查看:SLAM学习之路系列

        十、Cartographer源码100%安装,rosdep问题100%解决(亲测)

1-2 准备工作请查看:SLAM算法实战(开源)系列

        四、Cargrapher单激光雷达建图(通用)


 二、IMU-SRC 使用 / 信息确认

        1- IMU 使用的请参考官网使用手册基本IMU-SRC大同小异,你需要确认和你IMU型号对应并能够在Ubuntu上使用

        2- 这里以TL740D为例,个人使用的为厂家提供,此处展示为 github 上找到的一个SRC 基本所有修改和确认的信息大同小异(未验证是否可用)

2.1 首先从官网/Github/Ros-wiki 中找到自己IMU所对应的SRC

        官网:请依据自己购买的 IMU 型号访问官网查找使用手册

        Github:I-Quotient-Robotics/tl740d_driver (github.com-未验证是否可用)

        ROS-wiki:Sensors - ROS Wiki (需要自己找对应的Sensors Src)

2.2 下载后需查看的信息

        IMU-SRC 目录结构如图:

        这里重点关注 README.md 文件,首先查看其中标定的依赖,可以进行提前安装。

        目前有串口、网口、RS232/485,对串口与RS232/485通讯与使用时需要打开串口权限,此处需要注意的是保证你的 Ubuntu 安装 serial 工具。

sudo apt install ros-<distro>-serial
========================================
因为我是melodic,所以将<distro>换为melodic
========================================
sudo apt install ros-melodic-serial

 2.3 编译与使用

        cd到所在的 Workspace 进行编译后使用

// 1-cd 到 当前的 workspace 运行以下命令完成编译
catkin_make// 2-打开串口权限(具体串口命令跟使用的通讯口有关)
sudo chmod 777 /dev/ttyUSB*// 3-启动当前IMU所对应的 SRC 
roslaunch -----------

        此时运行完成后,运行两个命令,查看 SRC 的数据 Topic 与 frame_id。

rostopic list
rostopic echo --noarr <topic-name>

此时请记录好当前 IMU 型号的 topic 与 frame_id() :

        topic :imu/data                                                frame_id : imu_link


三、Lidar与IMU接入cartographer算法

3.1 确认 Lidar 与 IMU 的 topic 与 frame_id 信息

        根据 2.3 中 IMU 的信息,与 四、Cargrapher单激光雷达建图(通用)2.2.1 Lidar 的信息:

Topic

Frame_id
IMUimu/dataimu_link
Lidar/scanlaser

3.2 修改demo_revo_lds.launch文件

        打开 四、Cargrapher单激光雷达建图 中 2.2 中已经修改好的launch文件,可以使用Lidar进行建图的demo_revo_lds.launch。

        下方添加重映射信息,并根据 3.1 中表格的信息进行修改:

<launch>
<!--实际建图 time 不需要生成--><param name="/use_sim_time" value="flase" /><param name="robot_description"textfile="$(find cartographer_ros)/urdf/backpack_2d.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 revo_lds.lua"output="screen">
<!--映射lidar 中 topic 到 carto 中的 scan -->
<!--时间比较久不太记得了,如果出现error可以把后面的“/”去掉改为“scan”--><remap from="scan" to="/scan" />
<!--将下方的<imu_topic>改为 3.1 中已经确认好的 topic--><remap from="imu" to="<imu_topic>" /></node><node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"type="cartographer_occupancy_grid_node" args="-resolution 0.05" /><node name="rviz" pkg="rviz" type="rviz" required="true"args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
<!--删除rosbag,由于添加注释会收到里面的两个横行干扰 干脆直接删除-->
</launch>

3.3 修改revo_lds.lua文件

        同 3.1 相仿,可以使用Lidar进行建图的revo_lds.lua,进行以下修改:

        1-修改 tracking_frame 为 3.1 中 imu_frame_id :imu_link

        2-修改 published_frame 为 3.1 中:base_link

        3-修改 provide_odom_frame = fslse            修改为 false 不发布位姿

        4-修改TRAJECTORY_BUILDER_2D.use_imu_data = true   启用IMU模块

include "map_builder.lua"
include "trajectory_builder.lua"options = {map_builder = MAP_BUILDER,trajectory_builder = TRAJECTORY_BUILDER,map_frame = "map",tracking_frame = "imu_link",           --修改为 imu_frame_idpublished_frame = "base_link",          --修改为 base_frame_idodom_frame = "odom",provide_odom_frame = false,            --修改为 flase 不发布位姿publish_frame_projected_to_2d = false,use_pose_extrapolator = true,       --此项为姿态外推器,建议为true,flase也可以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 = trueTRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.2           --修改为lidar_min_range
TRAJECTORY_BUILDER_2D.max_range = 12.           --修改为lidar_max_range
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = true        --修改为true 开启使用imu模块
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65return options

3.4 修改backpack_2d.urdf文件(优先看3.4.2容易理解)

        打开 ~/cartographer_ros/urdf/backpack_2d.urdf 文件,进行修改,这里与 tf 坐标发布有关系,后期发一个关于 urdf 与 tf 坐标发布的博客在 SLAM学习之路系列里(自己给自己挖坑)

3.4.1 请参照 3.1 中确认的信息,同下方代码进行对照

        修改 <link name="imu_link"> 字段,将 imu_link 改为 3.1 中的 imu_frame_id

        修改 <link name="horizontal_laser_link"> 字段,将 horizontal_laser_link 改为 3.1 中的 lidar_frame_id

修改<!--joint 字段-->

       修改<joint name="imu_link_joint" type="fixed">中:

        child link 为 3.1 中的 imu_frame_id
        origin xyz 根据实际 与 scan 距离修改

       修改  <joint name="horizontal_laser_link_joint" type="fixed">中:

        child link 为 3.1 中  scan_frame_id
        origin xyz 根据实际 与 scan 距离修改

3.4.2 关于 3.3.1 中 两个 origin xyz 的解释

        这里跟 base_link 有关,具体解释写一个发布的博客在 SLAM学习之路系列里。

        此处以简图进行解释,仅用于 origin xyz 中的信息进行说明。(字丑勿喷)

         所有的计算都为 base_link 为原点进行计算,并以右手坐标系为基准,此处默认 IMU 与

Lidar 安装也遵循右手坐标系,且安装坐标系朝向一致。

        下方所有数值均为默认值,实际数值和修改处请根据个人情况进行计算,具体 urdf 文件的说明等更新。下方使用的 urdf 文件为 cartographer 的默认文件,我个人使用为自己编写的 urdf 文件,如果在使用中有问题,请查看: SLAM学习之路系列:十一、SLAM常用小功能(持续更新,碰到什么加什么)

对 urdf 文件进行检查并 rviz 查看是否存在错误。需要我个人使用文件的请私信。

<!--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="cartographer_backpack_2d"><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 为 3.1 中的 imu_frame_id
修改 box size  为 IMU 型号实际外观尺寸
--><link name="imu_link"><visual><origin xyz="0 0 0" /><geometry><box size="0.06 0.04 0.02" /></geometry><material name="orange" /></visual></link><!--
修改 link name 为 3.1 中 lidar_frame_id
修改 cylinder size  为 Lidar 型号实际外观尺寸
--><link name="horizontal_laser_link"><visual><origin xyz="0 0 0" /><geometry><cylinder length="0.05" radius="0.03" /></geometry><material name="gray" /></visual></link><link name="base_link" /><!-- joint 板块修改 -->
<!--
修改 child link 为 3.1 中的 imu_frame_id
修改 origin xyz 根据实际距离修改
--><joint name="imu_link_joint" type="fixed"><parent link="base_link" /><child link="imu_link" /><origin xyz="0 0 0" /></joint><!--
修改 child link 为 3.1 中 lidar_frame_id
修改 origin xyz 根据实际距离修改
--><joint name="horizontal_laser_link_joint" type="fixed"><parent link="base_link" /><child link="scan" /><origin xyz="0.1007 0 0.0558" /></joint></robot>

3.4.2 URDF与坐标系的变换 

        首先我们理解坐标系变换这个东西,实际建图中我们已知的最顶端的 tf 数为 /map,那么下方连接的可以为 /odom 与 /base_link,当你在  3.3中将 provide_odom_frame = false,改为true,则此时发布的 tf 为:

                                map ——> odom

        这时你就需要理解,现在使用的包括了 lidar 与 imu 他们两个之间的 tf 数是平级的,你要达成的最终 tf 树为:

map ——> odom(可选)——> base_footprint(可选) ——> base_link ——> sensor(底层部件)

        具体的关系与坐标转换可以自行搜索,坐标转换原理可以去看看被动变换与旋转矩阵

        URDF文件的作用可以简单理解为发布各部件的 tf 相对关系,我们可以将其拆分为3个部分,第一部分为 robot.URDF 中 robot的名称与其配置,即:

<robot name="cartographer_backpack_2d"><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><robot>

        其中robot name即你自己定义的robot名称,下方的两个material为配置的两种颜色,如果要自己改颜色的可以去搜索更改 rgba 这三个值(下方直接给传感器配置颜色时使用) 

        第二部分为机器人本体的参数配置,即:

  <link name="imu_link"><visual><origin xyz="0 0 0" /><geometry><box size="0.06 0.04 0.02" /></geometry><material name="orange" /></visual></link>

        link name:为机器人实际存在的部件(设置footprint的也可以这么理解),此处一般为你传感器或机器人对应的frame_id(Tips:这块不对会抛ERROR) 

        origin xyz:部件自身的 tf 相对父级坐标系的位置关系,我们遵循右手坐标系原则,0 0 0即坐标系与父级坐标系重合

        box size:方型的 x y z,通俗理解长宽高

        material:颜色,取第一部分配置好的颜色即可

        第三部分为机器人各坐标系的相对配置,即:

  <joint name="imu_link_joint" type="fixed"><parent link="base_link" /><child link="imu_link" /><origin xyz="0 0 0" /></joint>

        joint name:关节名称

        type:相当关系,fixed为固定,刚性连接无运动

        parent link:父级坐标系(framed id)

        child link:子坐标系(framed id)

        origin xyz:子坐标系相对父级坐标系的旋转关系,例如有的IMU安装后,IMU 的 x y实际上朝向并不是朝向车体正前方,我们就需要对z进行一定旋转(参考row pitch yall


四、cartographer 编译与运行

        修改完上述操作后,对 cartographer 的工作空间进行编译运行:

=================编译工作空间==================
catkin_make_isolated --install --use-ninja=============开发Lidar与IMU串口权限============
//ttyUSB* 与 ttyS* 需要自行判断sudo chmod 777 /dev/ttyUSB*
sudo chmod 777 /dev/ttyS*=================运行建图节点==================
roslaunch cartographer_ros demo_revo_lds.launch

        不积跬步无以至千里,不积小流无以成江河  --------------------------2:02


http://www.ppmy.cn/news/470638.html

相关文章

激光雷达初体验 - Ubuntu 18.04 + 思岚科技 RPLIDAR A1M8 + hector_slam 建图

思岚科技 RPLIDAR A1M8 hector_slam 建图 一、环境配置和基础测试二、hector_slam 安装三、launch 文件编写四、运行建图节点五、小结 一、环境配置和基础测试 见上一篇博文 &#xff1a;激光雷达初体验 - Ubuntu 18.04 思岚科技 RPLIDAR A1M8 ROS 上手使用 二、hector_sl…

ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定

实现环境&#xff1a; 系统环境&#xff1a; Ubuntu16.04激光雷达&#xff1a; velodyne16线imu品牌 &#xff1a; xsens 一 简介 lidar-imu标定方法为瑞士苏黎世理工大学-自动驾驶实验室开源的一种校准 3D 激光雷达和 6 自由度位姿传感器外参的方法。该方法需要大量非平面…

激光雷达初体验 - Ubuntu 18.04 + 思岚科技 RPLIDAR A1M8 + ROS 上手使用

思岚科技 RPLIDAR A1M8 ROS 上手使用 一、开箱图二、文档和SDK下载 官网链接三、SDK 安装四、SDK 使用五、小结 一、开箱图 型号 RPLIDAR A1配料 激光雷达一台 usb 转接板一块 转接线一条 二、文档和SDK下载 官网链接 RPILIDAR A1M8 简介与规格书 DatasheetRPILIDAR 标准…

Ubuntu16.04 速腾rslidar-32线激光雷达使用详细记录

0.rslidar-32线激光雷达参数: 线束&#xff1a; 32线波长&#xff1a; 905nm激光等级&#xff1a; class1精度&#xff1a; 5cm&#xff08;典型值&#xff09;测量距离&#xff1a; 0.2m ~ 200m&#xff08;目标反射率20%&#xff09;出点数&#xff1a; 640,000pts/s垂直视场…

激光雷达和相机的联合标定(Camera-LiDAR Calibration)之apollo

前言 上篇博客激光雷达和相机的联合标定&#xff08;Camera-LiDAR Calibration&#xff09;之Autoware介绍了为什么要做联合标定以及如何使用Autoware的标定工具。 这篇博客介绍apollo标定工具的使用方法。 首先需要安装apollo&#xff0c;然后才能使用其标定工具。 这个工…

福禄克FLUKE TIX501,TIX580,TI480PRO,TI401PRO代表福禄克正式进入640像素时代

福禄克FLUKE TIX501,TIX580,TI480PRO,TI401PRO代表福禄克正式进入640像素时代&#xff0c;福禄克重新定义专业级红外热像仪的分辨率。该系列中的全部热像仪都拥有先进的640 x 480分辨率和两种不同形式的选项。现在&#xff0c;客户能够在不牺牲分辨率、人体工程学和功能的前提下…

Spring Boot是什么?详解它的优缺点以及四大核心

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、Spring Boot 是什么&#xff1f; 二、Spring Boot 的优缺点 1、优点 ①可快速构建独立的 Spring 应用 ②直接嵌入Tomcat、Jett…

Robosense M1/速腾半固态激光雷达M1 保姆级教程1-如何连接雷达?

引言 当我们拿到M1雷达时&#xff0c;可能会因为激光雷达是一个新的设备&#xff0c;没有用过&#xff0c;而感到紧张和局促。没有关系&#xff0c;通过阅读文本&#xff0c;可以让你轻而易举的上手使用激光雷达。 1认识M1接口 图中较粗的接口为雷达的电源接口。即通过这个接口…