Ubuntu20.04安装和编译运行lidar_align来联合标定lidar与imu的外参

硬件:树霉派4b、天眸lidar(32线)、IMU(GNSS不接天线)

系统:ubuntu20.04、

天眸lidar(32线):

IMU(GNSS不接天线):

1、下载并安装lidar_align

mkdir  -p  lidar_align/src
cd lidar_align/src
git clone https://github.com/ethz-asl/lidar_align.git

将 lidar_align/src/lidar_align/NLOPTConfig.cmake 文件移动到 lidar_align/src/ 下(与lidar_align同级)

NLOPTConfig.cmake 文件移动前的位置:

NLOPTConfig.cmake 文件移动后的位置:

然后运行:

cd ..
catkin_make

(a)运行后,出现了错误:     没有找到pcl_ros包,因此需要安装这个包。可以查看我的另一篇文章ubuntu20.04中运行lego_slam算法-CSDN博客

(b)安装pcl_ros包后,删除编译生成的build、devel文件夹,重新 catkin_make 编译。这次编译可能会出现下面的错误:

In file included from /usr/include/pcl-1.10/pcl/pcl_macros.h:77,
                 from /usr/include/pcl-1.10/pcl/PCLHeader.h:10,
                 from /usr/include/pcl-1.10/pcl/point_cloud.h:47,
                 from /usr/include/pcl-1.10/pcl/common/transforms.h:42,
                 from /home/ubuntu/ccy/lidar_align/src/lidar_align/include/lidar_align/sensors.h:6,
                 from /home/ubuntu/ccy/lidar_align/src/lidar_align/src/sensors.cpp:1:
/usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above
    7 |   #error PCL requires C++14 or above
      |    ^~~~~
In file included from /usr/include/pcl-1.10/pcl/console/print.h:44,
                 from /usr/include/pcl-1.10/pcl/conversions.h:53,
                 from /usr/include/pcl-1.10/pcl/common/impl/centroid.hpp:45,
                 from /usr/include/pcl-1.10/pcl/common/centroid.h:1098,
                 from /usr/include/pcl-1.10/pcl/common/transforms.h:44,
                 from /home/ubuntu/ccy/lidar_align/src/lidar_align/include/lidar_align/sensors.h:6,
                 from /home/ubuntu/ccy/lidar_align/src/lidar_align/src/sensors.cpp:1:
/usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above
    7 |   #error PCL requires C++14 or above

从错误信息来看,PCL(Point Cloud Library)库要求使用C++14或更高版本的C++标准。编译环境似乎没有设置为使用C++14或更高版本。解决方法:

(1)打开lidar_align项目的CMakeLists.txt文件。

(2)在文件顶部添加下面两行CMake命令来设置C++标准。

set(CMAKE_CXX_STANDARD 14)  
set(CMAKE_CXX_STANDARD_REQUIRED True)

(3)保存CMakeLists.txt文件。

(4)删除build目录,然后重新运行catkin_make构建项目。

(c)编译之后,会出现下面的error:

 解决方案:安装nlopt

git clone http://github.com/stevengj/nlopt
cd nlopt/
mkdir build
cd build
cmake ..
make
sudo make install

 

那么在  /usr/local/lib/cmake  目录下出现 nlopt 文件。

 然后,在 lidar_align 工程目录下,并在CMakeLists.txt里加上以下内容:

list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_SOURCE_DIR})
set (CMAKE_PREFIX_PATH "/usr/local/lib/cmake/nlopt")

以上操作结束后,回到 lidar_align工程中,删除build、devel后,重新 catkin_make

会出现警告,暂时先不管

2、lidar、imu分别上电,分别接入树霉派4B

2.1 天眸lidar的运行

参考:获取天眸激光雷达点云图-CSDN博客

2.2  imu的运行

在 start_imu.sh 路径下运行以下命令:

./start_imu.sh

 启动imu和lidar后,查看ros话题:

 分别输出 /pa_gs02/imu/data 和 /timoo_points 话题数据:

rostopic echo /timoo_points
rostopic echo /pa_gs02/imu/data

2.3 录制数据包

录制的话题包括: /pa_gs02/imu/data  、 /timoo_points

新建 testbag 文件夹,在该文件夹下打开terminal,运行:

//rosbag record -大写欧(小写o你的包名会自动加时间日期) 包名 要录的话题1 要录的话题2rosbag record -O lidarimu.bag  /pa_gs02/imu/data  /timoo_points//两分钟左右ctrl+c结束录制,包会自动保存在打开终端的testbag文件夹

录制完成后,

 修改bag路径:

打开 /home/ubuntu/ccy/lidar_align/src/lidar_align/launch/lidar_align.launch ,修改 <arg name="bag_file" default="/PATH/TO/YOUR.bag"/> ,将 default="/PATH/TO/YOUR.bag"/> 替换为lidarimu.bag包的路径  /home/ubuntu/ccy/testbag/lidarimu.bag

修改 loader.cpp文件

首先在该文件顶部添加 #include <sensor_msgs/Imu.h,然后这个工具包原先是用来标定lidar和odom(里程计),所以需要将里程计接口替换为imu接口:

替换前:

将上图中标记部分的代码注释掉,在注释之后位置添加:

types.push_back(std::string("sensor_msgs/Imu"));rosbag::View view(bag, rosbag::TypeQuery(types));size_t imu_num = 0;double shiftX=0,shiftY=0,shiftZ=0,velX=0,velY=0,velZ=0;ros::Time time;double timeDiff,lastShiftX,lastShiftY,lastShiftZ;for (const rosbag::MessageInstance& m : view){std::cout <<"Loading imu: \e[1m"<< imu_num++<<"\e[0m from ros bag"<<'\r'<< std::flush;sensor_msgs::Imu imu=*(m.instantiate<sensor_msgs::Imu>());Timestamp stamp = imu.header.stamp.sec * 1000000ll +imu.header.stamp.nsec / 1000ll;if(imu_num==1){time=imu.header.stamp;Transform T(Transform::Translation(0,0,0),Transform::Rotation(1,0,0,0));odom->addTransformData(stamp, T);}else{timeDiff=(imu.header.stamp-time).toSec();time=imu.header.stamp;velX=velX+imu.linear_acceleration.x*timeDiff;velY=velX+imu.linear_acceleration.y*timeDiff;velZ=velZ+(imu.linear_acceleration.z-9.801)*timeDiff;lastShiftX=shiftX;lastShiftY=shiftY;lastShiftZ=shiftZ;shiftX=lastShiftX+velX*timeDiff+imu.linear_acceleration.x*timeDiff*timeDiff/2;shiftY=lastShiftY+velY*timeDiff+imu.linear_acceleration.y*timeDiff*timeDiff/2;shiftZ=lastShiftZ+velZ*timeDiff+(imu.linear_acceleration.z-9.801)*timeDiff*timeDiff/2;Transform T(Transform::Translation(shiftX,shiftY,shiftZ),Transform::Rotation(imu.orientation.w,imu.orientation.x,imu.orientation.y,imu.orientation.z));odom->addTransformData(stamp, T);}}

 替换后:

 替换后,删除lidar_align工程下的 build、devel文件夹,再使用 catkin_make编译(过程中出现warning可以先不用管)

3 、标定

进入lidar_align工程,打开terminal,运行以下命令:

source devel/setup.bash 
roslaunch lidar_align lidar_align.launch

开始标定迭代过程,上图中的Iteration表示迭代次数。

标定结束:

标定好之后会在终端显示出标定结果,也会在 result 文件夹下面生成对应的标定文件。

一个从姿态传感器imu坐标系到激光雷达坐标系的转换关系,包括平移向量、旋转矩阵、四元数和时间偏移。这些信息对于在ROS中正确对齐激光雷达数据至关重要。

  1. 平移向量
    -0.0107452, 0.0120904, 0.00375917

    这表示从姿态传感器坐标系到激光雷达坐标系在x、y、z轴上的平移量。

  2. 旋转矩阵

    这是一个3x3的矩阵,描述了从姿态传感器坐标系到激光雷达坐标系的旋转关系。

  3. 四元数
    [0.0131817, 0.00623436, 2.43504e-05, -0.999894]

    四元数提供了一种紧凑且不易出现奇异值的方式来描述三维旋转。

  4. 时间偏移
    -0.05237

    这表示在将激光雷达的时间戳用于姿态估计或对齐时,需要从这个时间戳中减去0.05237秒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615163.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台 SPI设备驱动

一.SPI简介 SPI是许多不同设备使用的常见通信协议。例如&#xff0c;SD卡模块、RFID读卡器模块和2.4GHz无线发射机/接收器均使用SPI与微控制器进行通信。 SPI是串行外设接口&#xff08;Serial Peripheral Interface)的缩写&#xff0c;是一种高速的&#xff0c;全双工&#x…

Elastic 线下 Meetup 将于 2024 年 4 月 27 号在重庆举办

2024 Elastic Meetup 重庆站活动&#xff0c;由 Elastic、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年4月27日 13:30-18:00 活动地点 中国重庆 沙坪坝区学城大道62-1号研发楼一期b3栋1楼(瑞幸咖啡旁&#xff09; 活动流程 14:00-14:50…

如何恢复未保存或删除/丢失的Word文件?

关闭 Word 应用程序而不保存文档&#xff1f;误删Word文档&#xff1f;许多用户会在不同的情况下丢失Word文档。如果不幸遇到此类问题&#xff0c;如何恢复已删除或未保存的 Word 文档&#xff1f;有一些方法可以恢复未保存/删除的文档。此外&#xff0c;您还可以使用Word文件恢…

基于Springboot的二手交易平台

基于SpringbootVue的二手交易平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录页 首页 商品信息 商品求购 网站公告 留言反馈 个人中心 后台管理 后台首页 用户…

卫星遥感影像在农业方面的应用及评价

一、引言 随着科技的进步&#xff0c;卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点&#xff0c;为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍&#xff0c;并通过具体案例进行说明。 二、…

算法题解记录10+++缺失的第一个正数

题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 […

初识ansible服务及ansible主机清单配置

目录 1、什么是自动化批量管理 2、自动化工具ansible架构 3、ansible服务专用术语对照表 4、设置主机清单&#xff08;inventory&#xff09; 3.1实验环境准备 3.2配置主机清单 3.2.1分组基本格式 3.2.2指定用户名&#xff0c;密码。端口 3.2.3子组 3.3查看 3.3.1看…

Pandas部分应掌握的重要知识点

目录 Pandas部分应掌握的重要知识点一、DataFrame数据框的创建1、直接基于二维数据创建&#xff08;同时使用index和columns参数&#xff09;2、基于excel文件中的数据来创建 二、查看数据框中的数据和联机帮助信息1、查看特殊行的数据2、查看联机帮助的两种常见方法&#xff0…

Web自动化测试进阶:网页中难点之等待机制 —— 强制等待,隐式等待

为什么要添加等待 避免页面未渲染完成后操作&#xff0c;导致的报错 经常会遇到报错&#xff1a;selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":&q…

SpringBoot碎片化知识

参考资料&#xff1a; java官方词典&#xff1a;https://docs.oracle.com/javase/tutorial/information/glossary.html#F苍穹外卖&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6 JavaBean规范 JavaBean规范是一种类的规范&#xff0c;其要求符合下列条件&#xf…

2024 DTC大会精彩演讲:DBdoctor,基于eBPF重新定义数据库可观测 (附PPT下载和演讲视频)

由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十三届数据技术嘉年华&#xff08;DTC&#xff09;于北京盛大召开。4月13日上午海信聚好看云平台负责人张纪宽受邀在『数据库生态软件』分论坛发表主题演讲《DBdoctor&#xff1a;利用eBPF技术实现数据库智能…

动态内存;

目录 1.malloc; 简要介绍&#xff1a; 如何使用&#xff1a; free函数&#xff1a; 2.calloc; 简要介绍&#xff1a; 与malloc的区别&#xff1a; 3.realloc; 简要介绍&#xff1a; 如何使用&#xff1a; 4.动态内存常见错误&#xff1b; 1.malloc; 简要介绍&#x…