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

硬件:树霉派4b

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.mzph.cn/news/803480.shtml

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

相关文章

ShardingSphere-ShardingSphere读写分离和数据脱敏

文章目录 一、读写分离1.1 读写分离1.2 读写分离应用方案1.3 分表+读写分离1.4 分库分表+读写分离二、ShardingSphere-JDBC读写分离2.1 创建SpringBoot并添加依赖2.2 创建实体类2.3 创建mapper2.4 配置读写分离2.5 测试测试插入数据测试读测试事务一致性测试负载均衡一、读写分…

vue3+echarts:echarts地图打点显示的样式

colorStops是打点的颜色和呼吸灯、label为show是打点是否显示数据、rich里cnNum是自定义的过滤模板用来改写显示数据的样式 series: [{type: "effectScatter",coordinateSystem: "geo",rippleEffect: {brushType: "stroke",},showEffectOn: &quo…

【H3C】开启web管理页面H3C S5120V2 Series

配置步骤 1.创建对应vlan并放行通过 2.添加vlanfi的ip地址 3.开启http和https的服务 4.创建用户&#xff0c;配置密码&#xff0c;配置服务类型&#xff0c;赋予权限 假设终端连接在交换机的g1/0/1口 假设终端的ip地址为(Ubuntu)&#xff1a;192.168.200.11 /24 假设交换机vlan…

【Java 刷题记录】双指针

双指针 1. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: n…

关于Ansible模块 ④

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》与《关于Ansible的模块 ③》之后&#xff0c;继续学习ansible常用模块之…

P3654 First Step (ファーストステップ) Python深搜

First Step (ファーストステップ) 题目背景 知らないことばかりなにもかもが&#xff08;どうしたらいいの&#xff1f;&#xff09; 一切的一切 尽是充满了未知数&#xff08;该如何是好&#xff09; それでも期待で足が軽いよ&#xff08;ジャンプだ&#xff01;&#xff09…

已解决:windows 下无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本

目录 1&#xff0c;问题描述2&#xff0c;问题解决 1&#xff0c;问题描述 当通过 npm 全局安装依赖后&#xff08;比如 ts 对应的 tsc 命令&#xff0c;还有 pnpm&#xff09;&#xff0c;想直接使用安装的命令&#xff0c;就会报错&#xff1a; 2&#xff0c;问题解决 以管…

12+炫酷地图可视化效果,这次还真的有源码。

2023-09-17 22:35贝格前端工场 Hi&#xff0c;大家好&#xff0c;我是贝格前端工场&#xff0c;之前分享过各类UI图、动图、3D图、流程图&#xff0c;好多粉丝朋友给我要源文件&#xff0c;因为种种原因&#xff0c;无法提供。 本次分享12个炫酷的地图可视化效果&#xff0c;…

实现几何对象按照一定距离向外缓冲

1、首先&#xff0c;确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…

LeetCode 使数组连续的最少操作数

地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;困难 题目描述&#xff1a;给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 **任意 **整数。 如果 nums 满足以下条件&#xff0c;那么它是 连续的 &#x…

Shopee虾皮100%有效提高广告效果的案例分享

Shopee 店铺运营中存在三种广告类型&#xff0c;分别是:关键词广告、关联广告和店铺广告。其中使用最为普遍&#xff0c;主控权最为直接的就是关键词广告&#xff0c;TA的适用范围最广&#xff0c;起效最快&#xff0c;并且可根据自身运营的能力去调控投入产出比&#xff0c;深…

SVM向量支持机

1.通俗理解 svm&#xff1a;support vector machine目标&#xff1a;利用超平面将两类数据分割开来&#xff0c;这个超平面就是我们要设计的对象 如何设计&#xff1f;我们设计之后会有间隔&#xff0c;间隔越大分类效果就越好&#xff1b;距离决策边界最近的点我们成为支持向…

个人求职简历(精选8篇)

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

【已完成】把Win10右键改回Win7的模样

win11右键设置成原来模样的方法如下&#xff1a; 1、winr打开运行窗口&#xff0c;输入regedit&#xff0c;按下回车键确认即可打开注册表。 2、在路径中输入&#xff1a;HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID&#xff0c;或者是依次定位点开到CLSID。 3、右键点击CLSID&…

python--面向对象的三大特征---封装、继承、多态

1.封装&#xff1a; 1&#xff0c;在面向对象中&#xff0c;封装指的是一种安全机制&#xff0c;不让外界修改或者直接操作&#xff0c;将属性私有化&#xff1b; 如果要访问属性&#xff0c;提供公开的方法&#xff08;getter&#xff0c;setter&#xff09; 2. python的类如…

面试算法-166-排序链表

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 解 class Solution {public ListNode sortList(ListNode head) {if (head null || head.next null…

【stm32】I2C通信协议

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

R-Tree的简单介绍

一、R-Tree简介 R-Tree&#xff0c;全称是“Real Tree”&#xff0c;是一种专门为处理多维空间数据&#xff08;尤其是二维空间数据&#xff0c;如地理坐标&#xff09;设计的树形数据结构。 简单来说&#xff0c;它就像是一个特殊的目录&#xff0c;将空间数据按照它们的位置…

NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程

这个游戏中的妮姬分四个企业&#xff0c;其中朝圣者这个派别的妮姬很少而且不在愿望单理&#xff0c;朝圣者的所有姐姐都很哇塞&#xff0c;红莲更是其中的大姐大。一般想抽朝圣者只能靠歪或者出限定卡池&#xff0c;举个栗子&#xff0c;我入坑的时候 朝圣者 神罚 是限定卡池&…

计算系数(acwing,数论)

题目描述&#xff1a; 给定一个多项式 (axby)^k&#xff0c;请求出多项式展开后 x^n*y^m 项的系数。 输入格式&#xff1a; 共一行&#xff0c;包含 5 个整数&#xff0c;分别为 a&#xff0c;b&#xff0c;k&#xff0c;n&#xff0c;m&#xff0c;每两个整数之间用一个空格…