环境:ubuntu18.04-melodic
第一步,提供ROS接口给你的安卓手机
通过一个开源软件Android_Camera-IMU给手机提供ROS接口GitHub - hitcm/Android_Camera-IMU: Wifi data aquistion between Android and ROS
下载的压缩包里面有一个apk文件,将其安装到Android手机里,安装的时候会可能会提示高版本Android系统不兼容,但本人实际使用过程还是很稳定的。(目前会出现自动拉伸填满屏幕和手机切屏再回来会黑屏...)
将PC和Android手机置于同一局域网下,例如连接同一个WiFi,或PC连接手机的热点。
打开Camera-IMU,界面很简洁,只有一行域名,http://hostport:11311,
此处只有hostport需要替换成接入的ip地址,其他内容无需改动。
回到ubuntu,随意打开终端,首先查询当前网络ip地址,
ifconfig
找到第一片字块的第二行的inet后面的IP地址,记录下来在手机上替换掉localhost,
或者通过指令
hostname -I
直接查看IP地址
接着回到ubuntu打开ROS接口
roscore
然后在手机上点击connect,连接成功后,camera-imu会占用手机摄像头,表现出来的效果类似于被拉伸的相机界面的低分辨率版。
连接成功以后检查一下手机是不是成功接入ROS:
#查看ros目前话题列表
rostopic list
应当多出如下三个话题,检查数据是否成功传输。
#查询话题传输数据
rostopic echo &话题名
#查询话题传输效率
rostopic hz &话题名
使用下载的Android——Camera-IMU包和rviz运行节点:
cd Android_Camera-IMU
roslaunch android_cam-imu.launch
之后会弹出一个 Rviz 界面:
如果要实时显示 image,需要 Add - By topic - 添加/camera/image_raw/image。
如果要显示 imu,则需要 Add - By topic - 添加 imu,且在 Fix Frame 中 将 map 改为 imu。
第二步,配置标定
连接部分完成了,接下来就是完成标定了,在第一步的基础上进行接下来的步骤(运行ros、android_cam-imu.launch节点):
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。
iamge:=/camera/image_raw
和camera:=/camera
是节点的参数,其中image:=/camera/image_raw
指定了相机图像的输入话题,
camera:=/camera
指定了相机设备的名称。(这里的image、camera理应对应于ROS话题名称,但这里与查看到的topic名称不一样。尝试修改但是无法正常运行。)关于这个可在android_cam-imu.launch中找到答案。
--no-service-check:由于通过局域网传输,没有物理接口,如果这里以找不到相机信息报错,加上这一段跳过service-check。
Camera-IMU默认会把相机分辨率限制在640x480,因此获得的标定内参也是这样的情况下得到。标定流程和正常使用cameracalibrator.py是一样的,尽量使得x,y,size,skew四项指标都变成绿色再进行calibrate。
界面中的x:表示标定板在视野中的左右位置。
y:表示标定板在视野中的上下位置。
size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近。
skew:标定板在视野中的倾斜位置。
由于ROS-手机相机传输延迟太严重,这里改为使用usbcam即笔记本自带摄像头继续标定工作。
//terminal 1
roscore
//terminal 2
roslaunch usb_cam usb_cam-test.launch
//terminal 3
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.026 image:=/usb_cam/image_raw camera:=/usb_cam
可以明显看到这里的image:=/usb_cam/image_raw camera:=/usb_cam对应着usbcam的rostopic。
保持校准1到5分钟左右,便会出现校准的成功的标志,下面的CALIBRATE按钮会被激活,点击这个按钮后会进行实际的校准计算
计算成功后的界面所下所示,所有按钮都被激活:
点击SAVE按钮保存校准信息,这时候,终端会出现存储的地址信息:/tmp/calibrationdata.tar.gz
第三个按键COMMIT的作用是:如果对校准感到满意,可单击COMMIT将校准参数发送到相机进行永久存储。
进入 /tmp文件,解压calibrationdata.tar.gz文件,查询图像文件和校准参数,其中ost.yaml和ost.txt就是我们的校准参数文件。
关于DSO中提到的相机校准文件格式,以等距相机型号的校准文件为例:
EquiDistant fx fy cx cy k1 k2 k3 k4
in_width in_height
"crop" / "full" / "fx fy cx cy 0"
out_width out_height
其中,焦距(fx,fy),光学中心(Cx,Cy),完全取决于相机本身,是相机的固有属性,只需要计算一次,可用矩阵表示如下:
[ fx, 0, Cx;
0, fy, Cy;
0 , 0 , 1];
畸变系数:畸变数学模型的5个参数 D = (k1,k2,k3,k4, 0);
第三步:运行
完成标定后根据GitHub - JakobEngel/dso: Direct Sparse Ometeration中的说明编辑相机参数文件。
运行:
Terminal 1:
roscore
手机进入 app 运行
Terminal 2: 在 Android_Camera-IMU 目录
roslaunch android_cam-imu.launch
(可以关掉 Rviz)
Terminal 3:
rosrun dso_ros dso_live image:=/camera/image_raw calib=YOUR_PATH/myCamera.txt
注意初始化需要一点时间,否则可能会运行失败。
参考链接:ROS下实时标定android手机相机摄像头内参_安卓手机的摄像头是单目吗_CSDN_WRC的博客-CSDN博客
dso与Android,DSO 安装及运行 —— dso_ros + Android 手机摄像头_weixin_39609718的博客-CSDN博客ROS学习【8】-----ubuntu16.04之摄像头的标定_陈一月的编程岁月的博客-CSDN博客