首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

使用kalibr标定单个相机(红外和可见光通用)

  • 25-02-16 08:21
  • 4285
  • 5156
blog.csdn.net

一、相机数据读取

usb-cam驱动安装使用

参考信息:链接: https://github.com/ros-drivers/usb_cam

对于没有专属驱动的相机,可以通过usb相机驱动usb-cam读取相机的视频数据信息。
安装usb-cam功能包,可以直接通过一下指令进行安装:

sudo apt-get install ros-noetic-usb-cam
  • 1

如果无法直接安装,可以尝试更新软件包“sudo apt update”也可以参照上述网页中的源码安装。

安装好软件包后,需要查看所插入的相机是哪个,使用以下命令:

ls /dev/video*
  • 1

注意一般笔记本电脑会自带相机,可以通过插拔相机的usb来查看摄像头名称。

找到相机名称后,在以下位置找到usb-cam的launch文件并修改以启动摄像头

/opt/ros/noetic/share/usb_cam/launch/usb_cam-test.launch
  • 1

这个launch文件默认是只可读,可以通过以下命令打开并编辑:

sudo gedit usb_cam-test.launch
  • 1

打开后,里面内容如下

 <launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video2" />  #修改相机名称
    <param name="image_width" value="640" />   #修改尺寸
    <param name="image_height" value="512" />
    <param name="pixel_format" value="yuyv" />  #格式
    <param name="color_format" value="yuv422p" />   #颜色格式
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  </node>
</launch>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

根据自己相机的参数对其进行修改,可以通过上位机等进行查看和设置。

数据读取

先启动驱动

roslaunch usb_cam usb_cam-test.launch
  • 1

这个时候应该就能就会有相机的数据流展示了。
接下来使用rostopic查看有哪些话题,在后面录数据的时候要用到。

rostopic list
  • 1

接下来可以选择打开rviz

rviz
  • 1

打开rviz后,点左下角add->image->ok导入usb相机数据
使用rviz查看视频

再点击左边Image->Image Topic,选择topic从而在rviz左下角展示相机数据信息在这里插入图片描述至此,就实现了使用usb驱动实现对相机数据的读取

二、kalibr编译和安装

参考资料:https://github.com/ethz-asl/kalibr/wiki/installation
https://blog.csdn.net/weixin_43611042/article/details/137386239

因为这里只是单个相机的标定,不涉及到联合标定以及imu的标定,因此code_utils和imu_utils的编译就不介绍了。
这一部分主要是记录一些报错。首先kalibr安装和编译可以参考上面的链接进行源码编译(可以直接从第二部分开始看,安装依赖然后编译)。也可以直接按一下代码直接git clone并编译

mkdir kalibr_ws
cd kalibr_ws
mkdir src
cd src
git clone https://github.com/ethz-asl/kalibr.git
cd ..
catkin build -DCMAKE_BUILD_TYPE=Release -j4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

前面几步基本是没有问题的,主要是最后一步编译的过程。(笔记是解决完所有问题后写的,所以没有图片和代码报错的记录了)
我出现了几个问题,首先是Anaconda中的boost和cmake中boost版本不一致的问题,这里我尝试了修改base环境中boost-cpp版本,最终还是没能成功,这样的方式也不是很可取,建议新建一个专门用于这次标定的anaconda环境,再进入环境下载对应的库版本,这样可以充分试错。

conda create -n biaoding
conda activate biaoding
conda install boost==1.71.0
然后就是各种module不存在,这种直接百度搜就行。
...
  • 1
  • 2
  • 3
  • 4
  • 5

然后就是opencv版本不适配的问题,noetic自带opencv4.2,而kalibr的使用的编译环境是opencv3所以需要进行修改。参考链接http://iyenn.com/rec/1641926.html

error: ‘cvCreateMat’ was not declared in this scope; did you mean ‘cvCreateSparseMat’?
error: ‘cvMulTransposed’ was not declared in this scope
error: ‘CV_SVD_MODIFY_A’ was not declared in this scope; did you mean ‘CV_HAL_SVD_MODIFY_A’
error: ‘CV_SVD_U_T’ was not declared in this scope
error: ‘cvSVD’ was not declared in this scope
error: ‘cvReleaseMat’ was not declared in this scope
error: ‘CV_SVD’ was not declared in this scope; did you mean ‘CV_AVX’?
error: ‘cvInvert’ was not declared in this scope; did you mean ‘cvInvSqrt’?
error: ‘cvCreateMat’ was not declared in this scope; did you mean ‘cvCreateSparseMat’?
error: ‘cvMulTransposed’ was not declared in this scope
error: ‘CV_SVD_MODIFY_A’ was not declared in this scope; did you mean ‘CV_HAL_SVD_MODIFY_A’?
error: ‘CV_SVD_MODIFY_A’ was not declared in this scope; did you mean ‘CV_HAL_SVD_MODIFY_A’?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里根据编译报错找到出问题的源文件(.cpp等),在代码开头添加头文件就可以解决,参考链接http://iyenn.com/rec/1641927.html:

#include 
  • 1
#include 
  • 1

因为各种module可能出现版本不适配的问题,还是建议新建一个conda环境来试错

三、标定过程

1、准备工作

准备标定板

有条件的可以在淘宝买标定板,也可以通过链接下载Aprilgrid 6x6 0.8x0.8 m (A0 page)中的pdf,并打印出来。
下载标定板

根据使用的标定板准备标定板参数YAML文件

打印标定板时记得下载对应的yaml文件。
如果标定板没有对应的yaml文件(如自定义的标定板等),需要自己编写一个yaml文件。
参考链接:https://github.com/ethz-asl/kalibr/wiki/calibration-targets

target_type: 'checkerboard'  #这里采用了棋盘格
targetCols: 6               # 角点的列数
targetRows: 5               # 角点的行数
rowSpacingMeters: 0.043      # 每个棋盘格的宽度,单位是米
colSpacingMeters: 0.043      # 每个棋盘格的高度,单位是米
  • 1
  • 2
  • 3
  • 4
  • 5

相机模型

参考链接:https://blog.csdn.net/qq_51731421/article/details/140436591
相机模型的一些参数说明:

①omni-radtan:鱼眼相机-畸变模型
②omni-none:鱼眼相机无畸变
③pinhole-radtan:小孔相机(普通相机)-畸变模型
④eucm-none;通用型相机模型 无畸变
⑤pinhole-equi:针孔相机-等距畸变模型,对鱼眼相机适用性更好
⑥pinhole-fov:针孔相机-fov畸变模型

根据自己的相机选取对应的model

2、运行脚本和结果

先启动相机:

roslaunch usb_cam usb_cam-test.launch
  • 1

然后录制rosbag用于标定:

rosbag record -O raw2_aprilgrid.bag /usb_cam/image_raw
  • 1

#raw2_aprilgrid.bag是录制的名字
#/usb_cam/image_raw是所需要用到的rostopic

接下来打开kalibr的工作目录(编译的位置,如kalibr_ws):

source devel/setup.bash
rosrun kalibr kalibr_calibrate_cameras --target 1/april_raw.yaml --models pinhole-fov --topics /usb_cam/image_raw --bag 1/raw2_aprilgrid.bag
  • 1
  • 2

#–target 1/april_raw.yaml是标定板的yaml位置
#–models pinhole-fov是相机模型
#–topics /usb_cam/image_raw是需要用到的rostopic
#–bag 1/raw2_aprilgrid.bag是录制的bag包的位置

最后会出来如下图片:
在这里插入图片描述

一个类似的yaml文件:

cam0:
  cam_overlaps: []
  camera_model: pinhole
  distortion_coeffs: [1.1296961098962706]
  distortion_model: fov
  intrinsics: [388.7732529799446, 388.68018680233035, 311.77119271703464, 252.5791388063825]
  resolution: [640, 512]
  rostopic: /usb_cam/image_raw
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

以及一个类似的txt文件:

Calibration results 
====================
Camera-system parameters:
cam0 (/usb_cam/image_raw):
    type: <class 'aslam_cv.libaslam_cv_python.FovDistortedPinholeCameraGeometry'>
    distortion: [1.12969611] +- [0.01426032]
    projection: [388.77325298 388.6801868  311.77119272 252.57913881] +- [9.32526806 9.73481488 2.58953186 5.16888809]
    reprojection error: [-0.000003, 0.000000] +- [0.333794, 0.350323]
Target configuration
====================

  Type: checkerboard
  Rows
    Count: 5
    Distance: 0.043 [m]
  Cols
    Count: 6
    Distance: 0.043 [m]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
注:本文转载自blog.csdn.net的benben vs lifeful的文章"https://blog.csdn.net/m0_63534135/article/details/142534866"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

138
3C硬件
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top