ROS + Android 手机摄像头

      环境: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_rawcamera:=/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博客

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ROS (Robot Operating System) 是一个广泛使用的开源机器人操作系统,主要用于设计、构建和管理复杂的机器人软件系统。在ROS1中,摄像头作为一个传感器设备,通常通过GStreamer或OpenCV等库进行摄像头数据的采集和处理。 在ROS1中调用摄像头的基本步骤如下: 1. 安装依赖:确保已经安装了ROS1的基础包,包括`roscpp`, `image_transport`, `sensor_msgs`等。这些包为摄像头通信提供了基础支持。 2. 配置硬件:在ROS机器人的配置文件`~/.bashrc`中添加摄像头设备的路径,如果摄像头是USB设备,可能需要安装相应的驱动。 3. 创建节点:创建一个Node,这是ROS中的基本执行单元,可以编写处理摄像头数据的代码。例如,你可以使用`cv_bridge`转换图像格式,使其与ROS的消息系统兼容。 ```cpp #include <ros/ros.h> #include <sensor_msgs/image_encodings.h> #include <cv_bridge/cv_bridge.h> class CameraSubscriber { public: void imageCallback(const sensor_msgs::ImageConstPtr& msg) { cv::Mat image = cv_bridge::toCvCopy(msg, "bgr8"); // 对图像进行处理... // 发布处理后的图像或者其他信息 } }; int main(int argc, char *argv[]){ ros::init(argc, argv, "camera_subscriber"); CameraSubscriber camSubscriber; ros::Subscriber sub = nh.subscribe("/camera/image_raw", 1, &CameraSubscriber::imageCallback, &camSubscriber); ros::spin(); return 0; } ``` 4. 接收并处理数据:当创建的节点启动后,它会订阅指定的主题(如`/camera/image_raw`),每当有新的摄像头图像数据到来时,就会调用回调函数`imageCallback`进行处理。 5. 发布图像或消息:处理后的图像可以发布到其他节点,或者保存到文件、显示在屏幕上等。 相关问题: 1. ROS1中的`image_transport`库是什么作用? 2. 如何在ROS中查看摄像头数据? 3. 如何调试或查看图像数据的原始格式?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值