一、相机数据读取
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相机数据
再点击左边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
评论记录:
回复评论: