当前位置:   article > 正文

双目+IMU标定详细流程、相关文件格式说明分析【T265为例】_怎样将bag包中的双目相机话题sensor_msgs/image转换成stereo/right/im

怎样将bag包中的双目相机话题sensor_msgs/image转换成stereo/right/image_raw和st

最近做一个无人机避障的项目,无人机上面安装了机载电脑,通过笔记本电脑进入机载电脑的桌面,使用提前写好地脚本运行VIO、路径规划、飞控和相机启动,在RVIZ中观察建图、定位和航迹点,并通过鼠标在地图上设置目标点,无人机即可自主前往。

本文主要描述一下机载传感器T265的远程标定流程,供日后参考:

一、基本情况

二、具体操作

1、录制并标定imu(realsense的launch文件已经修改好,环境也都配置好了)

2、录制双目与联合标定所需bag

3、kalibr做双目标定

4、kalibr做联合标定

5、标定完成

6、参考文章

一、基本情况

1)注意:本文是只是提纲式的描述了关键步骤和代码,我还写了一个D455远程标定的文章,感兴趣的话可以看看:D455远程标定详细步骤,使用kalibr、imu_utils两个开源工具_全日制学生混的博客-CSDN博客

2)笔记本电脑和机载电脑通过外置天线互联,通过ifconfig可以查找到地址

3)可以使用ssh或Nomachine进入机载电脑,这里为了可视化,我使用了后者

4)基本思路是:无人机录制bag,然后用无线传输把bag传到主机中运行标定程序,将标定结果再放到机载电脑的程序里(这样确实繁琐,但是在此项目中,考虑到批量部署和网络原因,这是目前我能找到的最好方法)

5)一些基本命令:april_6x6.yaml

  1. sudo apt install net-tools //网络工具
  2. ifconfig //找到飞机的ip地址
  3. ssh a@192.168.168.165 //查看远程命令窗口
  4. ping 192.168.168.165 //查看延迟
  5. scp a@192.168.168.165:/home/a/Downloads/autoFlight-master.zip . //拷贝文件到当前文件夹
  6. rs-enumerate-devices -c //查看相机出厂标定参数

6)标定板文件格式:

  1. #example for aprilgrid
  2. target_type: 'aprilgrid' #gridtype
  3. tagCols: 6 #number of apriltags
  4. tagRows: 6 #number of apriltags
  5. tagSize: 0.088 #size of apriltag, edge to edge [m]
  6. tagSpacing: 0.3 #ratio of space between tags to tagSize
  7. #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]
  8. #example for checkerboard
  9. # targetType: 'checkerboard' #gridtype
  10. # targetCols: 6 #number of internal chessboard corners
  11. # targetRows: 7 #number of internal chessboard corners
  12. # rowsMetricSize: 0.06 #size of one chessboard square [m]
  13. # colsMetricSize: 0.06 #size of one chessboard square [m]

7) rs_t265.launch文件(更改发布话题、时间戳合并后)

  1. <!--
  2. Important Notice: For wheeled robots, odometer input is a requirement for robust
  3. and accurate tracking. The relevant APIs will be added to librealsense and
  4. ROS/realsense in upcoming releases. Currently, the API is available in the
  5. https://github.com/IntelRealSense/librealsense/blob/master/third-party/libtm/libtm/include/TrackingDevice.h#L508-L515.
  6. -->
  7. <launch>
  8. <arg name="serial_no" default=""/>
  9. <arg name="usb_port_id" default=""/>
  10. <arg name="device_type" default="t265"/>
  11. <arg name="json_file_path" default=""/>
  12. <arg name="camera" default="camera"/>
  13. <arg name="tf_prefix" default="$(arg camera)"/>
  14. <arg name="fisheye_width" default="848"/>
  15. <arg name="fisheye_height" default="800"/>
  16. <arg name="enable_fisheye1" default="true"/>
  17. <arg name="enable_fisheye2" default="true"/>
  18. <arg name="fisheye_fps" default="-1"/>
  19. <arg name="gyro_fps" default="-1"/>
  20. <arg name="accel_fps" default="-1"/>
  21. <arg name="enable_gyro" default="true"/>
  22. <arg name="enable_accel" default="true"/>
  23. <arg name="enable_pose" default="true"/>
  24. <arg name="enable_sync" default="true"/>
  25. <arg name="linear_accel_cov" default="0.01"/>
  26. <arg name="initial_reset" default="false"/>
  27. <arg name="reconnect_timeout" default="6.0"/>
  28. <arg name="unite_imu_method" default="linear_interpolation"/>
  29. <arg name="publish_odom_tf" default="true"/>
  30. <group ns="$(arg camera)">
  31. <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
  32. <arg name="tf_prefix" value="$(arg tf_prefix)"/>
  33. <arg name="serial_no" value="$(arg serial_no)"/>
  34. <arg name="usb_port_id" value="$(arg usb_port_id)"/>
  35. <arg name="device_type" value="$(arg device_type)"/>
  36. <arg name="json_file_path" value="$(arg json_file_path)"/>
  37. <arg name="enable_sync" value="$(arg enable_sync)"/>
  38. <arg name="fisheye_width" value="$(arg fisheye_width)"/>
  39. <arg name="fisheye_height" value="$(arg fisheye_height)"/>
  40. <arg name="enable_fisheye1" value="$(arg enable_fisheye1)"/>
  41. <arg name="enable_fisheye2" value="$(arg enable_fisheye2)"/>
  42. <arg name="fisheye_fps" value="$(arg fisheye_fps)"/>
  43. <arg name="gyro_fps" value="$(arg gyro_fps)"/>
  44. <arg name="accel_fps" value="$(arg accel_fps)"/>
  45. <arg name="enable_gyro" value="$(arg enable_gyro)"/>
  46. <arg name="enable_accel" value="$(arg enable_accel)"/>
  47. <arg name="enable_pose" value="$(arg enable_pose)"/>
  48. <arg name="linear_accel_cov" value="$(arg linear_accel_cov)"/>
  49. <arg name="initial_reset" value="$(arg initial_reset)"/>
  50. <arg name="reconnect_timeout" value="$(arg reconnect_timeout)"/>
  51. <arg name="unite_imu_method" value="$(arg unite_imu_method)"/>
  52. <arg name="publish_odom_tf" value="$(arg publish_odom_tf)"/>
  53. </include>
  54. </group>
  55. </launch>

二、具体操作

1、录制并标定imurealsenselaunch文件已经修改好,环境也都配置好了)

注意,在标定imu时,播放bag是可以加速的,不要傻乎乎的在机载电脑上录2h,然后再在笔记本电脑上再播放两个小时。加速的倍数根据你的电脑配置做调整,我的笔记本(拯救者r9000p)播放到1000倍速都没问题的。

  1. //录制
  2. rosbag record /imu/data -o imu_uav.bag –duration=2h
  3. scp a@192.168.168.165:/home/a/imu_uav.bag . 拷贝bag到主机
  4. //启动标定程序
  5. roslaunch imu_utils t265_imu.launch
  6. rosbag play -r 100 imu_uav.bag 一百倍速度播放
  7. //参考链接
  8. https://blog.csdn.net/CGJustDoIT/article/details/108081840

2、录制双目与联合标定所需bag

需要提前改好rs_t265.launch 主要更改:鱼眼相机话题发布、imu_unit => copy(imu标定的时候是linear..),把同步打开  <arg name="enable_sync"   default="true"/>

录制bag的时候加了一个duration参数,因为我一个人标定,点鼠标之后再拿起无人机标定,然后再放下无人机点退出录制有些手忙脚乱,所以就直接限定了录制时间,然后在kalibr做标定的时候,只需要使用 “--bag-from-to 10 95” 掐头去尾即可。

  1. // 修改发布频率和话题名称:
  2. rosrun topic_tools throttle messages /camera/fisheye1/image_raw 20.0 /fisheye1
  3. rosrun topic_tools throttle messages /camera/fisheye2/image_raw 20.0 /fisheye2
  4. rosrun topic_tools throttle messages /camera/imu 200.0 /imu
  5. //录制
  6. rosbag record -O imu_cameras_calibration /fisheye1 /fisheye2 /imu -duration=100
  7. //拷贝过来
  8. scp a@192.168.168.165:/home/a/workspace/uav_ws/imu_cameras_calibration.bag .
  9. //至此就没有机载电脑什么事了,标定程序就在笔记本电脑上启动了
  10. //到时候只需要把标定结果放到机载电脑里就行

3、kalibr做双目标定

下面这行命令处理最基本的语句,还加了修饰:显示提取过程、增加对于不同步时间戳的容忍程度;关于这个容忍程度,加它的原因是,我们的双目相机两帧图像不是完全对齐的,所以要加一个,如果你的相机不加就能对齐那就不加,即使加了,你也不要把这个容忍程度改的太宽,否则会导致相隔几帧的左右目图像匹配到一起,轻则误差大,重则标定不收敛。

rosrun kalibr kalibr_calibrate_cameras --target ./april_6x6.yaml --bag ./imu_cameras_calibration.bag --bag-from-to 10 95 --models omni-radtan omni-radtan --topics /fisheye1 /fisheye2 --approx-sync 0.04 -show-extraction

4、kalibr做联合标定

单独标定了IMU和双目后,接下来就是标定一下二者之间的外参,这一步需要把之前的标定结果放到这一步的执行目录中。需要注意的是,相机的标定输出结果(那个.yaml文件)可以直接拿来用,而IMU的标定由于用的是imu_utils,需要把结果整理成kalibr能够识别的格式。

rosrun kalibr kalibr_calibrate_imu_camera --target ./april_6x6.yaml  --cam ./imu_cameras_calibration-camchain.yaml --imu ./imu.yaml --bag ./imu_cameras_calibration.bag --bag-from-to 10 95  --show-extraction

5、标定完成

标定结束后,就可以得到IMU、双目和联合的参数 

图 标定时的界面

图 相机标定结果

 图IMU标定结果

6、参考文章

1:https://www.jianshu.com/p/194d6c9ef9a4

2:bmi055 标定_Ubuntu16.04+RealsenseT265跑通VINS-Fusion_之死的博客-CSDN博客

3:Kalibr 之 Camera-IMU 标定 (总结)_晨光ABC的博客-CSDN博客_kalibr标定

4:双目相机与IMU联合标定_合工大机器人实验室的博客-CSDN博客_双目相机和imu联合标定

5:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

6:Intel Realsense T265使用教程_熊猫飞天的博客-CSDN博客_t265

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/59617
推荐阅读
相关标签
  

闽ICP备14008679号