从零用自己数据跑R3LIVE

2023-11-03

1、相机内参标定

相机选用4mm的广角相机,相机内参标定选择用最常见的棋盘格方法,首先安装ROS自带的包

sudo apt install ros-melodic-camera-calibration

用usb_cam启动相机后进行标定 。

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.06 image:=/uab_cam/image_raw camera:=/camera --no-service-check

--size:标定板的长X宽

--square:棋盘中小格的边长(m)
image:=/... : 订阅图像的话题
camera:=/camera: 相机name

标定完之后,会生成一个内参文件,Intrinsic是相机矩阵,Distortion是畸变矩阵。

Intrinsic:
[430.229,0,306.853],[0,437.83,248.373],[0,0,1]

Distortion:
[0.156215,-0.156542,-0.004833,-0.001379]

2、cam2lidar外参标定

外参标定我采用的是自动+手动的方式,先用算法进行自动配准,再用手动标定修正。

自动标定算法采用的是livox_camera_calib算法

GitHub - hku-mars/livox_camera_calib: This repository is used for automatic calibration between high resolution LiDAR and camera in targetless scenes.

此方法效果较好,但需要特定的场合,经过我的测试,选择深度差距大且平整的场景进行数据采集,例如楼道。

        自动标定算法特别依赖数据的场景,一个好的场景是能够达到不错的标定效果。之后再手动标定进行进一步修正,采用的是 SensorsCalibration,此标定库包含了大多数传感器之间的标定。

https://github.com/PJLab-ADG/SensorsCalibration

最终的标定结果如下图所示。 

标定完之后,会生成一个外参数矩阵

Extrinsic:
[-0.00650189,-0.999724,-0.0225309,0.0946092],[0.0035881,0.0225079,-0.999741,0.162664],[0.999972,-0.00658104,0.00344083,-0.00686066],[0,0,0,1]

3、记录rosbag

之后就可以采集数据了,需要注意的一点是,不同传感器之间的时间同步问题,因为LIVOX默认是从开始启动激光雷达开始算时间的并不是ROS系统时间,如果直接记录数据,是跑不起来的。下面给出两种解决方案。

  • 将激光雷达连接对应的网卡和系统时间同步:

ifconfig  查看网口 比如网口是 eno1

如果出现下列提示,则可以使用硬件同步
 `hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)`
 `hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)`
 `hardware-recive (SOF_TIMESTAMPING_RX_HARDWARE)`

sudo apt install ptpd
sudo ptpd -M -i eno1 -C 

当出现best master的时候,用wireshark确认一下,

wireshark --  eno1-- 搜索框搜索 ptp -- 出现Sync Message信号

之后再启动激光雷达,时间戳就是和本机同步的。

  • 直接用R3LIVE作者提供的LIVOX驱动

GitHub - ziv-lin/livox_ros_driver_for_R2LIVE

作者之间将时间戳再源码中更改了,所以用这个驱动启动直接记录数据是可行的。再记录之前需要打开livox_lidar_config.json文件中的时间同步功能。并选择一个接口名称,我这里选择的是相机的接口。

再记录数据时,可以记录压缩格式的图像topic,例如usb_cam/image_raw/compressed,这样rosbag会小一点。

4、安装编译R3LIVE

https://github.com/hku-mars/r3live

跟着官网reademe走就可以了,作者写的很详细 。

5、跑结果

主要需要改yaml文件,将得到的相机内参,外参,畸变矩阵填入。注意3*3的旋转矩阵,是4*4的变换矩阵左上3*3部分的转置。再把launch文件的topic改为自己的就可以了。

r3live_vio:
   image_width: 640
   image_height: 480
   camera_intrinsic:
      [460.799008, 0.000000, 280.624145,
    0.000000, 459.386391, 167.344099,
    0.0, 0.0, 1.0] 
   camera_dist_coeffs: [-0.107372, 0.087416, 0.001676, -0.001356, 0.000000]  #k1, k2, p1, p2, k3
   # Fine extrinsic value. form camera-LiDAR calibration.
   #转置矩阵
   camera_ext_R:       
          [-0.00650189,0.0035881,0.999972,
            -0.999724,0.0225079,-0.00658104,
            -0.0225309,  -0.999741,   0.00344083]
   # camera_ext_t: [0.050166, 0.0474116, -0.0312415] 
   camera_ext_t: [0.0946092,0.162664,-0.00686066] 
<launch>
    <!-- Subscribed topics -->
    <param name="LiDAR_pointcloud_topic" type="string" value= "/laser_cloud_flat" />
    <param name="IMU_topic" type="string" value= "/livox/imu" />
    <param name="Image_topic" type="string" value= "/usb_cam/image_raw" />
    <param name="r3live_common/map_output_dir" type="string" value="$(env HOME)/r3live_output" />
    <rosparam command="load" file="$(find r3live)/../config/my_data_r3live_config.yaml" />

    <node pkg="r3live" type="r3live_LiDAR_front_end" name="r3live_LiDAR_front_end"  output="screen" required="true"/>
    <node pkg="r3live" type="r3live_mapping" name="r3live_mapping" output="screen" required="true" />
    
    <arg name="rviz" default="1" />
    <group if="$(arg rviz)">
        <node name="rvizvisualisation" pkg="rviz" type="rviz" output="log" args="-d $(find r3live)/../config/rviz/r3live_rviz_config.rviz" />
    </group>
</launch>

之后 运行就可以建图了。

roslaunch r3live my_data_r3live_bag.launch 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零用自己数据跑R3LIVE 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • R语言中if语句使用方法之超详细教程

    在R语言中 if属于一种分支结构 即根据某个条件执行相关的语句 R中的if语句与else配合主要有3种结构 单个if语句 if cond expr 其它语句 即当括弧中的cond条件为TRUE时 则执行表达式expr 否则跳过后执行其后的语
  • 复习git的使用

    文章目录 复习git的使用 基础 提交文件 查看 回退 撤销修改 分支 创建 切换 tag 其他命令 HEAD 指针 的理解 复习git的使用 最近公司的老旧项目要由svn转到git git 命令大都忘记了 这里复习总结一下 基础 查看本地
  • unity虚拟相机cinemachine 之ScriptingExample源码解读轻松理解其作用

    我从demo里面找到了脚本的源码 运行的效果 是5秒切换到这个cube立方体 又5秒切换到另外一个 cylinder public class ScriptingExample MonoBehaviour CinemachineVirtua
  • 【TVM 学习资料】使用 Python 接口(AutoTVM)编译和优化模型

    本篇文章译自英文文档 Compiling and Optimizing a Model with the Python Interface AutoTVM 作者是 Chris Hoge 更多 TVM 中文文档可访问 TVM 中文站 TVMC
  • 14.navigator.userAgent属性检查浏览器类型

    如何使用navigator userAgent属性检查浏览器类型 navigator userAgent属性是什么 是个只读的字符串 声明浏览器用于HTTP请求的用户代理头的值 如何检查 let a navigator userAgent
  • SQLyog中文乱码的解决方案(中文显示成问号)

    问题描述 在SQLyog中键入的中文都变成了 如下图所示 解决方案 找到乱码的字段 右击然后选择 管理字段 在弹出的页面里点击 隐藏语言选项 取消隐藏 然后就可以看到Charset列 如下图所示 更改Charset列 选择utf8 之后点击
  • ld: warning: object file (/path/WYDemo.framework/WYDemo(WYSingleton.o)) was built for newer iOS vers...

    1 出现场景 1 在制作 WYDemo framework 工程中的 Development target 为 11 2 2 在使用 WYDemo framework 工程中的 Development target 为 8 0 2 解决方案
  • Scrach基本概念与操作

    基本概念 一个程序最初的触发是由事件 黄色积木 负责的 例如点击播放事件 按下空格事件 当接收到消息等 程序由舞台和角色组成 舞台和角色都可以有多个 Scratch本身提供了许多舞台和角色的素材 可直接使用 每个角色都有自己的脚本代码 由各
  • Using join buffer (Batched Key Access)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Using join buffer Batched Key Access 表连接算法 Batched Key Access BKA 原理 MySQL 5 6版本提供了很多性
  • 利用循环输出文字

    首先设置一个循环的函数 var arr 1 var i 0 function xh i arr var arr 1 var i 0 if i gt arr false else document write 人类的本质是复读机 xh if
  • Windows 安装yolo v4时 Cmake无法检测到CUDA的问题

    最近因为装yolov4真的是头发掉了一大把 好不容易避开了众多坑之后 结果Cmake检测不到CUDA了 具体的安装步骤参照了以下文章 https blog csdn net shuaijieer article details 106150
  • GTest源码剖析(六)——RUN_ALL_TESTS

    GTest源码剖析 RUN ALL TESTS GTest源码剖析RUN ALL TESTS RUN ALL TESTS源码分析 1 UnitTestRun 2 HandleExceptionsInMethodIfSupported 3 U
  • 【华为OD机试真题 JAVA】检查是否存在满足条件的数字组合

    JS版 华为OD机试真题 JS 检查是否存在满足条件的数字组合 标题 检查是否存在满足条件的数字组合 时间限制 1秒 内存限制 262144K 语言限制 不限 给定一个正整数数组 检查数组中是否存在满足规则的数字组合 规则 A B 2C 输
  • 刷入magisk无限重启_Magisk的安装与使用

    随着安卓版本的升级 SuperSU和Xposed的用户越来越少 人们需要一个替代者 于是Magisk出现在大家的视野 本文将对Magisk的安装和使用进行介绍 01 如何安装Magisk首先下载一个Magisk Manager 地址http
  • Linux之执行一个可执行文件

    Linux中执行一个可执行文件 在Linux系统中执行一个可执行文件 只需写正确文件路径 即可执行文件 不需要写命令 1 如果执行当前路径下的文件 文件名 2 执行非当前目录下的文件 文件的绝对路径 注意 以上操作的前提条件 文件是可执行文
  • 想从事区块链开发? 你应该这么做

    凭借每年15 4万美元的平均工资和稳定的就业增长 现在是学习区块链开发的理想时机 为了创建和改进区块链技术 区块链开发人员练习各种技能 包括计算机网络 密码学 算法和数据结构 这些开发人员负责设计以特定业务模型为中心的区块链技术 然后构建
  • 设计模式入门(二)观察者模式

    设计模式入门 本系列所有内容参考自 HeadFirst设计模式 因为书中的代码是采用java语言写的 博主这里用C 语言改写 这里采用讲故事的方式进行讲解 若有错误之处 非常欢迎大家指导 设计模式 模式不是代码 而针对设计问题的通用解决方案
  • unity打包出现 Failed to re-package resources

    unity打包出现 Failed to re package resources unity打包出现 Failed to re package resources 在对新项目打包发布的时候出现报错提示 这个问题我搜了很多博客都没有答案 最后
  • Visual Studio Code安装支持Lua并打开函数列表

    Visual Studio Code安装支持Lua并打开函数列表 文章目录 Visual Studio Code安装支持Lua并打开函数列表 一 下载安装 1 下载 2 windows下安装 以下过程适用于1 44 2版本 3 win10下
  • 从零用自己数据跑R3LIVE

    1 相机内参标定 相机选用4mm的广角相机 相机内参标定选择用最常见的棋盘格方法 首先安装ROS自带的包 sudo apt install ros melodic camera calibration 用usb cam启动相机后进行标定 r