本人小白,最近在做的项目需要用到同时集成IMU和摄像头的相机,但是目前东西还没到手,因为安卓手机同时具备单目相机和IMU,所以先用安卓手机试一下内参标定的流程。目前已经完成了手机上IMU和单目相机的标定。这里先讲一下如何实时标定手机相机摄像头内参。(默认标定分辨率是640x480)
环境:ubuntu16.04-kinetic
要求:ros-kinetic基本框架
第一步,提供ROS接口给你的安卓手机
这里需要通过一个开源软件Android_Camera-IMU给手机提供ROS接口GitHub - hitcm/Android_Camera-IMU: Wifi data aquistion between Android and ROS
下载的压缩包里面有一个apk文件,这是Android的应用安装包文件,传给手机安装的时候会可能会提示高版本Android系统不兼容,但本人实际使用过程还是很稳定的。(目前会出现自动拉伸填满屏幕和手机切屏再回来会黑屏...)
打开Camera-IMU,界面很简洁,只有一行域名,http://localhost:11311,此处只有localhost需要替换成接入的ip地址。回到ubuntu,随意打开终端,首先查询当前网络ip地址,然后打开ROS
ifconfig
找到第一片字块的第二行的inet后面的ip地址,记录下来在手机上替换掉localhost,回到ubuntu打开ROS接口
roscore
然后点击connect,如果连接不成功,查看一下手机接入网络的ip,应当和你替换的ip前缀一样。连接成功后,camera-imu会占用手机摄像头,表现出来的效果类似于被拉伸的相机界面的低分辨率版。
连接成功以后检查一下手机是不是成功接入ROS
#查看ros目前话题列表
rostopic list
应当多出/android/imu、/android/image_raw/compressed和/android/camera_info三个话题,检查数据是否成功传输。
#查询话题传输数据
rostopic echo &话题名
#查询话题传输效率
rostopic hz &话题名
根据需要可以改变传输图像流的属性(compressed——>raw)
rosrun image_transport republish compressed in:=/android/image_raw raw out:=/camera/image_raw
再次查看rostopic list,出现新话题/camera/image_raw,但是传输效率相比原话题有所降低。
第二步,配置标定
连接部分完成了,接下来就是完成标定了,在第一步的基础上进行接下来的步骤
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.026 image:=/camera/image_raw camera:=/camera --no-service-check
--size 8x6:表示标定板除去最外围一圈,长边有8个角点,宽有6个角点。
--square 0.026:表示每个标定小色块的边长,单位为mm,此处0.026表示边长为26mm。
image:图像流话题:此处以/camera/image_raw作为标定源。
camera:相机名:此处以/camera作为相机名。
--no-service-check:由于通过局域网传输,没有物理接口,如果这里以找不到相机信息报错,加上这一段跳过service-check。
第三步,标定
Camera-IMU默认会把相机分辨率限制在640x480,因此获得的标定内参也是这样的情况下得到。标定流程和正常使用cameracalibrator.py是一样的,尽量使得x,y,size,skew四项指标都变成绿色再进行calibrate。此处就不加赘述。