ROS进阶——kinect v1的使用

环境:Ubuntu16.04+ROS Kinetic

 

一、kinect v1简介

Kinect  v1深度相机拥有一个RGB彩色摄像头,一个红外线CMOS摄像机和一个红外发射器。相机的红外线CMOS摄像机和红外发射器以左右水平的方式分布。该相机采用的是以结构光为基础进行改进后的光编码(Light Coding)技术获得物体的深度信息。

Kinect的骨架坐标系和深度坐标系是以相机的IR(红外)摄像机为中心的右手坐标系。原则上,Z轴方向不会取负值,但是如果获得不可预知的值,则会给出-1。同时需注意,红外摄像机是坐标系原点,但深度值Z为红外到达点在Z轴方向的投影,而不是原点到红外到达点之间的线性距离。

0.png

2.png

 

二、环境配置

sudo apt-get install ros-kinetic-openni-* ros-kinetic-freenect-*  
rospack profile  

运行命令

roslaunch freenect_launch freenect.launch

相关topic

(1)RGB图像:/camera/rgb/image_color

  • ROS数据格式:sensor_msgs/Image
  • OPENCV数据格式:Mat
  • 图像尺寸:640*480
  • 像素数据类型:8UC3


(2)深度图像:/camera/depth/image

  • ROS数据格式:sensor_msgs/Image
  • OPENCV数据格式:Mat
  • 图像尺寸:640*480
  • 像素数据类型:32FC1


(3)点云数据(无整合RGB): /camera/depth/points

  • ROS数据格式:sensor_msgs/Image
  • PCL点云库数据格式:pcl::PointCloud<pcl::PointXYZ>
  • 图像尺寸:有序点云,640*480
  • 像素数据类型:double

 

三、相机标定

在ROS平台上使用camera_calibration包进行相机的标定,相机标定工作界面如图所示,该功能包基于张正友标定法,通过角点检测匹配实际物理坐标与图像坐标实现标定。

安装功能包

rosdep install camera_calibration

运行命令

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera
  • size 11x8: 注意是字母x,是棋盘内部角点个数
  • square 0.108:为米单位的正方形边长
  • image:订阅的图像
  • camera:发布到设置参数的服务器(不是必须)

标定结果

(1)红外相机

(2)RGB相机

参数说明:

  • camera_matrix:相机内参矩阵 (固有参数)
  • distortion_coefficients:相机畸变系数 (固有参数)
  • rectification_matrix:矫正矩阵(一般为单位阵 )
  • projection_matrix:投影矩阵(世界坐标投影到图像坐标的变换矩阵)

 

四、坐标修正

坐标修正包含两部分内容:

(1)第一部分是修正相机获取数据不完整导致的误差,深度相机在获取视野中物体深度信息时只获取了物体面对相机那部分的表面的数据,没有获取物体整体的数据,因此需根据目标物体本身对坐标进行修正,排除因深度相机获取数据不完整造成的偏差。

(2)第二部分是修正深度相机本身的测量误差,Kinect在获取目标物体深度信息时,随着目标物体与相机之间距离的增大误差也随之增大,下表为测量物体与Kinect之间实际距离与平均测量距离之间的误差,下面曲线图为实际距离与误差曲线图及其趋势线,误差计算方式为下表右式。因Kinect的误差随着距离的减少下降,因此以对数的方式对误差曲线进行拟合获得误差修正公式,y为误差,x为测量物体与Kinect实际距离。

 

参考

骨格座標と深度座標のデータ形式

ROS 教程之 vision: 摄像头标定camera calibration

ROS单目摄像机的标定

Kinectから取得される座標データの補正と物体の体積推定の試み

  • 4
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
串口通信在ROS中是非常常见和重要的功能。下面是一些关于ROS串口通信的进阶知识: 1. 安装serial包:首先,你需要安装ROS的serial包。在终端中运行以下命令来安装:`sudo apt-get install ros-<your_ros_version>-serial` 2. 创建ROS节点:使用ROS中的串口通信,你需要创建一个ROS节点来处理串口数据。你可以使用C++或者Python编写节点。 3. 打开串口:在ROS节点中,你需要打开串口并进行配置。你可以使用serial包提供的函数来打开和配置串口。例如,在C++中,你可以使用`serial::Serial::open()`函数来打开串口,并使用`serial::Serial::setBaudrate()`函数来设置波特率。 4. 发送和接收数据:一旦打开了串口,你就可以通过串口发送和接收数据了。你可以使用serial包提供的函数来发送和接收字节流。例如,在C++中,你可以使用`serial::Serial::write()`函数来发送数据,并使用`serial::Serial::read()`函数来接收数据。 5. ROS消息和串口数据转换:通常,你可能还需要将串口数据转换为ROS消息,以便在ROS系统中进行处理。你可以根据你的需求创建自定义的ROS消息类型,并编写转换代码将串口数据转换为ROS消息。例如,在Python中,你可以使用`rospy.Publisher`来发布ROS消息。 6. ROS参数配置:为了方便地配置串口参数,你可以使用ROS参数服务器。你可以使用`rosparam`命令或者在launch文件中设置参数。这样,你就可以在运行节点时动态地配置串口参数。 这些是ROS中串口通信的一些进阶知识。希望对你有帮助!如果你还有其他问题,请随时提问。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值