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

news2024/12/28 2:32:28

硬件:树霉派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 要录的话题2
 
rosbag 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.coloradmin.cn/o/1580815.html

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

相关文章

关于Linux内核code段被改写的原因分析

本文基于Linux-4.19.125&#xff0c; ARM V7&#xff0c;dual core。 1 code 段 Linux的code段&#xff08;或者说text段&#xff09;自_stext开始&#xff0c;到_etext结束&#xff0c;这段内容一般情况下是只读的&#xff0c;在理论上来说&#xff0c;这段数据在设备上应该…

Java设计模式—组合模式(Composite Pattern)

组合模式&#xff08;Composite&#xff09;&#xff0c;将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 public class CompositeTest {public static void main(String[] args){// 创建主菜单MenuComponent mainMen…

访问网站时你的电脑都做了什么

电脑在访问百度时 首先在本地hosts文件里面查看本地有无域名对应的IP地址&#xff0c;若有就直接返回。若无&#xff0c;则本地DNS服务器当DNS的客户&#xff0c;向其它根域服务器发送报文查询IP地址&#xff0c;简单来说就是帮助主机查找IP&#xff0c;所以递归查询就在客户端…

纯C语言手搓GPT-2,前OpenAI、特斯拉高管新项目火了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 「Real men program in C.」 众所周知&#xff0c;大语言模型还在快速发展&#xff0c;应该有…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台&#xff0c;互联网家政是继打车、外卖后的又一个风口&#xff0c;创业者众多&#xff0c;比如&#xff1a;58到家&#xff0c;天鹅到家等&#xff0c;o2o&#xff08;Online To Offline&#xff09;是将线下商务的机会与互联网…

el-table实现表格内部横向拖拽效果

2024.4.2今天我学习了如何对el-table表格组件实现内部横向拖拽的效果&#xff0c;效果&#xff1a; 代码如下&#xff1a; 一、创建utils/底下文件 const crosswise_drag_table function (Vue){// 全局添加table左右拖动效果的指令Vue.directive(tableMove, {bind: function…

C/C++如何快速学习?少走3年弯路

于我而言&#xff0c;最开始学习就是 C&#xff0c;除了计算机专业&#xff0c;其他专业可能学习的第一门编程语言为 C 语言&#xff0c;还是谭浩强爷爷那本&#xff0c;当时想着有点 C 基础&#xff0c;无外乎就是 C 语言的升级版&#xff0c;于是开启了 C 的路程。 语言这个…

归档模式下,物理删除数据文件的完全的恢复

归档模式下&#xff0c;物理删除数据文件的完全的恢复 1、实验环境 环境归档模式 SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /arch/archivelog Oldest online log seq…

【STL】stack与queue的底层原理及其实现

文章目录 stack的介绍库中stack的使用栈的模拟实现queue的介绍库中queue的使用queue的模拟实现 stack的介绍 &#xff08;图片来自知乎&#xff09; 1.stack是一种容器适配器&#xff0c;模拟了栈的数据结构。数据只能从一端进去&#xff0c;另一端出来&#xff08;先进后出&am…

需求分析及设计定义

背景 经过不断的折腾&#xff0c;一切过程都是为了呈现输出&#xff0c;这个阶段就是要交付需求和方案的环节了&#xff0c;很多失败的项目就是上来就到这个环节&#xff0c;倒着捣鼓&#xff0c;先写个文档&#xff0c;做个原型&#xff0c;甚至提出方案&#xff0c;然后再和…

Microsoft Visio 参与者 [actor] - 人的形状图标

Microsoft Visio 参与者 [actor] - 人的形状图标 1. 更多形状 -> 搜索形状2. 参与者References 1. 更多形状 -> 搜索形状 2. 参与者 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【Node】Node的配置文件的使用,dotenv框架的使用

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;Node.js &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进的勇…

CodeMirror使用: 编写一个在线编辑HTML、JS、CSS文件,网页的模板页面-初实现

前言&#xff1a;前几天编写一个UI模板控制的功能&#xff0c;根据上传的前端模板更换跳转入口主题页面&#xff1b;在编写的时候&#xff0c;突发奇想能不能在列表页面进行在线编辑刚刚上传的模板zip压缩包里的页面...于是经过学习研究有了这篇文章&#xff1b;当日记本一样记…

鸿蒙开发面向对象的面试题~

鸿蒙开发面向对象的面试题是近年来在软件开发领域中备受关注的话题。作为一种新兴的操作系统&#xff0c;鸿蒙系统的开发者需要具备扎实的面向对象编程知识和丰富的开发经验。在面试中&#xff0c;面试官常常会通过一系列的问题来考察面试者对于鸿蒙开发面向对象的理解和应用能…

LeetCode 289.生命游戏————2024 春招冲刺百题计划

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

python-可视化篇-turtle-画爱心

文章目录 原效果替换关键字5为8&#xff0c;看看效果改下颜色 原效果 import turtle as tt.color(red,pink) t.begin_fill() t.width(5) t.left(135) t.fd(100) t.right(180) t.circle(50,-180) t.left(90) t.circle(50,-180) t.right(180) t.fd(100) t.pu() t.goto(50,-30) t…

[ritsec CTF 2024] 密码部分

这个比较密码这块还是比较简单的&#xff0c;经过问了N人以后终于完成。 [Warm Up] Words 给了个猪圈密码的图片&#xff0c;这东西好久不见的感觉。 [Warm Up] Emails MTP似乎也没多好的方法&#xff0c;猜更快&#xff0c;先给了几封email然后一个用MTP长度是32&#xff08…

因为使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景&#xff0c;博主所在的业务组有一个核心系统&#xff0c;需要同步两个不同数据源给过来的数据到redis中&#xff0c;但是每次同步之前需要过滤掉一部分数据&#xff0c;只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

MYSQL 8.0版本修改用户密码(知道登录密码)和Sqlyog错误码2058一案

今天准备使用sqlyog连接一下我Linux上面的mysql数据库&#xff0c;然后就报如下错误 有一个简单的办法就是修改密码为password就完事!然后我就开始查找如何修改密码! 如果是需要解决Sqlyog错误码2058的话&#xff0c;执行以下命令&#xff0c;但是注意root对应host是不是loca…

python的下载及安装

python的下载及安装 1&#xff0c;https://www.python.org 百度直接搜索python官网 2&#xff0c; 3&#xff0c;选择路径下载后&#xff0c;双击你下载的那个电脑图标应用程序 4. 1&#xff09;勾选Add Python 3.6 to PATH是把Python的安装路径添加到系统环境变量的Path变…