实测 ubuntu 20.04 使用 lidar_imu_calib 功能包 进行 激光雷达与imu标定

  • 功能包介绍
  • 功能包下载与编译
  • 使用功能包
    • 接入雷达和imu
    • 录制 rosbag 文件
    • 执行 lidar_imu_calib 功能包

功能包介绍

功能包名称:
lidar_imu_calib

功能包简介:
在基于3D激光雷达开发slam时,我们经常使用imu为匹配算法(icp, ndt)提供先验,所以需要校准lidar和imu之间的变换。对于匹配算法,transfom中的姿态比transform中的位置更重要 , 并且位置通常设置为 0。所以这个功能包只校准激光雷达和 imu 之间转换中的姿态分量。

功能包地址:
https://github.com/chennuo0125-HIT/lidar_imu_calib

功能包下载与编译

安装步骤:

mkdir -p catkin_ws/src
cd catkin_ws/src
git clone https://github.com/chennuo0125-HIT/lidar_imu_calib.git
cd ..
catkin_make -DCATKIN_WHITELIST_PACKAGES="ndt_omp;lidar_imu_calib"

此时会出现报错问题

报错内容:

/usr/include/pcl-1.10/pcl/common/impl/io.hpp: In function ‘void pcl::copyPointCloud(const pcl::PointCloud<PointT>&, const std::vector<pcl::PointIndices>&, pcl::PointCloud<PointOutT>&)’:
/usr/include/pcl-1.10/pcl/common/impl/io.hpp:272:16: error: use of ‘auto’ in lambda parameter declaration only available with ‘-std=c++14’ or ‘-std=gnu++14’272 |       [](const auto& acc, const auto& index) { return index.indices.size() + acc; });|                ^~~~
/usr/include/pcl-1.10/pcl/common/impl/io.hpp:272:33: error: use of ‘auto’ in lambda parameter declaration only available with ‘-std=c++14’ or ‘-std=gnu++14’272 |       [](const auto& acc, const auto& index) { return index.indices.size() + acc; });|                                 ^~~~
/usr/include/pcl-1.10/pcl/common/impl/io.hpp: In lambda function:
/usr/include/pcl-1.10/pcl/common/impl/io.hpp:272:61: error: request for member ‘indices’ in ‘index’, which is of non-class type ‘const int’272 |       [](const auto& acc, const auto& index) { return index.indices.size() + acc; });|                                                             ^~~~~~~
In file included from /usr/include/pcl-1.10/pcl/io/pcd_io.h:44,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/src/lib/calibExRLidar2Imu.cpp:5:
/usr/include/pcl-1.10/pcl/io/file_io.h: At global scope:
/usr/include/pcl-1.10/pcl/io/file_io.h:235:8: error: ‘enable_if_t’ in namespace ‘std’ does not name a template type; did you mean ‘enable_if’?235 |   std::enable_if_t<std::is_floating_point<Type>::value>|        ^~~~~~~~~~~|        enable_if
In file included from /usr/include/pcl-1.10/pcl/io/pcd_io.h:44,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/src/lib/calibExRLidar2Imu.cpp:5:
/usr/include/pcl-1.10/pcl/io/file_io.h:252:8: error: ‘enable_if_t’ in namespace ‘std’ does not name a template type; did you mean ‘enable_if’?252 |   std::enable_if_t<std::is_integral<Type>::value>|        ^~~~~~~~~~~|        enable_if
/usr/include/pcl-1.10/pcl/io/file_io.h:266:18: error: expected initializer before ‘<’ token266 |   copyValueString<std::int8_t> (const pcl::PCLPointCloud2 &cloud,|                  ^
/usr/include/pcl-1.10/pcl/io/file_io.h:280:18: error: expected initializer before ‘<’ token280 |   copyValueString<std::uint8_t> (const pcl::PCLPointCloud2 &cloud,|                  ^
/usr/include/pcl-1.10/pcl/io/file_io.h:304:8: error: ‘enable_if_t’ in namespace ‘std’ does not name a template type; did you mean ‘enable_if’?304 |   std::enable_if_t<std::is_floating_point<Type>::value, bool>|        ^~~~~~~~~~~|        enable_if
/usr/include/pcl-1.10/pcl/io/file_io.h:317:8: error: ‘enable_if_t’ in namespace ‘std’ does not name a template type; did you mean ‘enable_if’?317 |   std::enable_if_t<std::is_integral<Type>::value, bool>|        ^~~~~~~~~~~|        enable_if
^CIn file included from /usr/include/c++/9/algorithm:62,from /usr/include/boost/smart_ptr/shared_ptr.hpp:39,from /usr/include/pcl-1.10/pcl/pcl_macros.h:69,from /usr/include/pcl-1.10/pcl/point_types.h:42,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/include/calibExRLidar2Imu.h:9,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/src/lib/calibExRLidar2Imu.cpp:1:
/usr/include/c++/9/bits/stl_algo.h: In instantiation of ‘_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = __gnu_cxx::__normal_iterator<const pcl::Vertices*, std::vector<pcl::Vertices> >; _OIter = std::back_insert_iterator<std::vector<pcl::Vertices> >; _UnaryOperation = pcl::PolygonMesh::concatenate(pcl::PolygonMesh&, const pcl::PolygonMesh&)::<lambda(int)>]’:
/usr/include/pcl-1.10/pcl/PolygonMesh.h:55:24:   required from here
/usr/include/c++/9/bits/stl_algo.h:4343:24: error: no match for call to ‘(pcl::PolygonMesh::concatenate(pcl::PolygonMesh&, const pcl::PolygonMesh&)::<lambda(int)>) (const pcl::Vertices&)’4343 |  *__result = __unary_op(*__first);|              ~~~~~~~~~~^~~~~~~~~~
In file included from /usr/include/pcl-1.10/pcl/common/io.h:50,from /usr/include/pcl-1.10/pcl/filters/filter.h:43,from /usr/include/pcl-1.10/pcl/filters/voxel_grid.h:43,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/include/calibExRLidar2Imu.h:11,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/src/lib/calibExRLidar2Imu.cpp:1:
/usr/include/pcl-1.10/pcl/PolygonMesh.h:45:22: note: candidate: ‘pcl::PolygonMesh::concatenate(pcl::PolygonMesh&, const pcl::PolygonMesh&)::<lambda(int)>’45 |                      [point_offset](auto polygon)|                      ^
/usr/include/pcl-1.10/pcl/PolygonMesh.h:45:22: note:   no known conversion for argument 1 from ‘const pcl::Vertices’ to ‘int’
In file included from /usr/include/c++/9/numeric:62,from /usr/include/boost/random/discrete_distribution.hpp:18,from /usr/include/boost/random.hpp:63,from /usr/include/pcl-1.10/pcl/filters/boost.h:48,from /usr/include/pcl-1.10/pcl/filters/voxel_grid.h:42,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/include/calibExRLidar2Imu.h:11,from /home/jone/jone_ws/src/lidar_imu_calib/lidar_imu_calib/src/lib/calibExRLidar2Imu.cpp:1:
/usr/include/c++/9/bits/stl_numeric.h: In instantiation of ‘_Tp std::accumulate(_InputIterator, _InputIterator, _Tp, _BinaryOperation) [with _InputIterator = __gnu_cxx::__normal_iterator<const pcl::PCLPointField*, std::vector<pcl::PCLPointField> >; _Tp = std::__cxx11::basic_string<char>; _BinaryOperation = pcl::getFieldsList(const pcl::PCLPointCloud2&)::<lambda(const int&, const int&)>]’:
/usr/include/pcl-1.10/pcl/common/io.h:144:82:   required from here
/usr/include/c++/9/bits/stl_numeric.h:166:22: error: no match for call to ‘(pcl::getFieldsList(const pcl::PCLPointCloud2&)::<lambda(const int&, const int&)>) (std::__cxx11::basic_string<char>&, const pcl::PCLPointField&)’166 |  __init = __binary_op(_GLIBCXX_MOVE_IF_20(__init), *__first);|           ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

只截取了其中一段

报错原因:
ubuntu 20.04 的 ros版本是noetic 带的pcl是 pcl-1.10,这个版本和之前的有所不同

这么多错误就一个原因 : pcl-1.10需要用c++14及以上编译。

报错解决方法:
打开 lidar_imu_calib 文件夹下的 CMakeLists.txt
将第五行

add_compile_options(-std=c++11)

换成

add_compile_options(-std=c++14)

即可编译成功

使用功能包

接入雷达和imu

找个电源适配器,9-18v给雷达供电。雷达连接其连接器,网口接到ROS的工控机上即可

将工控机的网口配置为

ipv4,方式设置为手动
ip地址、掩码以及网关设置成下图

其中地址 不能为 192.168.1.201 ,这个是雷达的地址

运行雷达驱动程序

roslaunch velodyne_pointcloud VLP16_points.launch

imu模块的硬件连接很简单,usb给模块供电,并与pc通信,插上后

运行imu驱动程序

roslaunch fdilink_ahrs ahrs_data.launch

通过 rostopic list 指令,检查下消息是 否正确

图片中的/imu /velodyne_points就是两个传感器的消息名称

录制 rosbag 文件

通过

rosbag record /imu /velodyne_points

来录制两个传感器的消息

执行 lidar_imu_calib 功能包

上面的工作主要是给功能包准备数据,下面即可执行功能包了

首先需要 修改 配置文件
相关的参数没有config文件夹的yaml文件,是直接在其launch文件中设置的

将 /lidar_topic 和 /imu_topic 与/bag_file 修改成自己的

之后便可以运行功能包

roslaunch lidar_imu_calib calib_exR_lidar2imu.launch

功能包会显示添加 lidar 消息


最后会显示 lidar的消息数量和imu的数量 形成约束的数量


再等一下就会出现计算的结果

实测 ubuntu 20.04 使用 lidar_imu_calib 功能包 进行 激光雷达与imu标定相关推荐

  1. Ubuntu 20.04 + ROS Noetic + OpenCV 4.10编译kalibr相机标定功能包

    环境:Ubuntu 20.04 + ROS Noetic + OpenCV:4.2.0 1.创建工作空间 mkdir -p kalibr_ws/src cd kalibr_ws/ source /op ...

  2. 命令行 笔记本键盘禁用_如何在 Ubuntu 20.04 上禁用坞站(dock) | Linux 中国

    我发现它对于快速访问常用应用非常方便,但并非所有人都希望它额外占用屏幕上的一些空间. • 来源:linux.cn • 作者:Abhishek Prakash • 译者:geekpi • (本文字数:1 ...

  3. ubuntu 20.04配置Elasticfusion及问题解决(Kinect V2实测数据、TUM数据)

    测试数据集+Kinect V2实时数据 已跑通,前后分别在4台电脑跑过,问题梳理比较多. Tips:编译过程中仔细阅读readme文件, 看看是不是有什么地方没注意到,能解决大部分问题. [源码] E ...

  4. ubuntu 20.04 ROS Noetic 无serial包解决方法

    ubuntu 20.04 ROS Noetic 无serial包解决方法 在ros-noetic版本之前的ros-kinetic或者ros-meldic版本,进行串口通信的时候可以采用 sudo ap ...

  5. Ubuntu 20.04下使用IDEA配置tomcat10,及servlet导包后javax.servelet一直报错的解决方法

    Ubuntu 20.04下使用IDEA配置tomcat10,servlet导包后javax.servelet一直报错的解决方法 ​ 前期有关tomcat的安装就不多详谈,网上教程一大把,就不多赘述了. ...

  6. Linux 之四 Ubuntu 20.04 WiFi 无法使用、设置无法显示、远程桌面、SSH、Git、PPA、FFmpeg 等各问题记录

    安装   今天,在我的老 Acer 笔记本(11 年的老本)上安装了 Ubuntu 20.04 LTS 版本,以作为学习使用.安装到没啥难度,基本和 Windows 差不多 ,基本都是下一步就行.注意 ...

  7. linux怎么删web应用程序错误,Ubuntu 20.04将删除Amazon Web应用程序,但用户可另行安装...

    Ubuntu 20.04将删除Amazon Web应用程序,原因就是这款应用很少有用户使用,但需要的用户也可另行安装.在过去的8年中,Amazon Web应用程序已成为Ubuntu桌面的一部分,现在, ...

  8. Ubuntu 20.04安装Ros Noetic及Ubuntu 18.04安装ROS Melodic(两版本详细填坑)

    Ubuntu 20.04安装Ros Noetic及18.04安装ROS Melodic 表1-1 ROS的历史版本 1. 设置安装源 2. 添加秘钥 3. 更新列表 4. 开始安装 5. 配置ROS环 ...

  9. ubuntu安装python百度经验_如何在Ubuntu 20.04上安装Python 3.9(含python编译安装和使用Apt命令安装)...

    在本文中,我们将向您展示在Ubuntu 20.04上安装Python 3.9的两种方法.第一种使用APT命令安装Python3.9,第二种是在Ubuntu20.04上编译安装Python 3.9.本教 ...

  10. ubuntu 20.04 ROS 环境下 使用 velodyne

    ubuntu 20.04 ROS 环境下 使用 velodyne 系统环境配置 硬件连接 网口配置 运行驱动程序 通过rviz可视化点云 系统环境配置 安装ROS依赖 sudo apt install ...

最新文章

  1. 全浏览器兼容的DIV拖动效果
  2. Confluence 6 CSS 编辑技巧
  3. 关于文件格式和编码方式,乱码产生的原因?
  4. python 浏览器,轻量级Python Web浏览器
  5. 智能包装结构,提高可测性
  6. LeetCode 474. 一和零(01背包动态规划)
  7. CentOS设置静态IP
  8. 网页优化系列三:使用压缩后置viewstate
  9. java处理dealfilter_Java-DealString工具类
  10. spring中的ioc解决程序的耦合入门
  11. LearnOpenGL - 纹理贴图 源代码
  12. 为什么游戏加速器都会设置韩国节点
  13. 机器人运动学轨迹跟踪控制(Matlab实现)
  14. origin 快捷键
  15. Canny边缘检测非极大值抑制法在双立方插值(Bicubic)图像边缘优化
  16. “我在网红书店,从来不看书”
  17. 苹果输了官司,iPad会改名吗?
  18. 【硬见小百科】SMT工艺,是什么影响锡膏印刷的质量
  19. 当我们谈论Virtual DOM时,我们在说什么——etch源码解读
  20. DOS窗口下使用命令打开远程桌面连接

热门文章

  1. 用C++完成华氏温度换摄氏温度
  2. 信创办公--基于WPS的Word最佳实践系列(邮件合并实现邮件批量发送)
  3. 基于FPGA的循迹小车,控制器:Xilinx-Ego1
  4. OneNote for win10 无法加载笔记本
  5. JSchException: Algorithm negotiation fail
  6. 倾斜摄影实景三维与游戏的结合
  7. Android | Tangram动态页面之路(七)硬核的Virtualview
  8. reactnative布局与适配
  9. oracle导出表904错误,月光软件站 - 编程文档 - 数据库 - EXP-00008: ORACLE error 904 encountered的解决方法...
  10. Racket编程指南——24 命令行工具和你的编辑器选择