通过 Gazebo 模拟kinect摄像头,并在 Rviz 中显示kinect摄像头数据。
实现流程:
kinect摄像头仿真基本流程:
-
已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加kinect摄像头配置;
-
将此文件集成进xacro文件;
-
启动 Gazebo,使用 Rviz 显示kinect摄像头信息。
1.Gazebo仿真Kinect
1.1 新建 Xacro 文件,配置 kinetic传感器信息
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
<gazebo reference="kinect link名称"> //这里使用的是雷达的支架support作为深度相机
<sensor type="depth" name="camera">
<always_on>true</always_on>
<update_rate>20.0</update_rate>
<camera>
<horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
<image>
<format>R8G8B8</format>
<width>640</width>
<height>480</height>
</image>
<clip>
<near>0.05</near>
<far>8.0</far>
</clip>
</camera>
<plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
<cameraName>camera</cameraName>
<alwaysOn>true</alwaysOn> //是否一致打开
<updateRate>10</updateRate>
<imageTopicName>rgb/image_raw</imageTopicName>
<depthImageTopicName>depth/image_raw</depthImageTopicName>
<pointCloudTopicName>depth/points</pointCloudTopicName>
<cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
<depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
<frameName>kinect link名称</frameName> //support
<baseline>0.1</baseline>
<distortion_k1>0.0</distortion_k1>
<distortion_k2>0.0</distortion_k2>
<distortion_k3>0.0</distortion_k3>
<distortion_t1>0.0</distortion_t1>
<distortion_t2>0.0</distortion_t2>
<pointCloudCutoff>0.4</pointCloudCutoff>
</plugin>
</sensor>
</gazebo>
</robot>
需要自行配置的地方已注释
和camera同样配置,这里在rviz的camera插件的话题选项中多个两个选项,分别是深度相机视角和rgb不同相机视角,深度相机也能当成普通相机使用,而深度视角采用黑、白、灰的显示方式体现深度。
补充:kinect 点云数据显示
在kinect中也可以以点云的方式显示感知周围环境,在 rviz 中操作如下:
问题:在rviz中显示时错位。
原因:在kinect中图像数据与点云数据使用了两套坐标系统,且两套坐标系统位姿并不一致。
解决:
1.在插件中为kinect设置坐标系,修改配置文件的<frameName>
标签内容:
<frameName>support_depth</frameName>
2.发布新设置的坐标系到kinect连杆的坐标变换关系,在启动rviz的launch中,添加:
<node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_depth" />
这里注意看老师的操作,rosrun tf2_ros s +Tab,后边节点的名称直接复制,并不需要记住节点的全名,但是要会找。这里args参数是 偏移量z y x 欧拉角z y x 父极坐标系 子极坐标系
这里我手敲的代码不行,怀疑是中文空格的问题,重新敲了一遍就行了,注意。
3.启动rviz,重新显示
本章主要介绍了ROS中仿真实现涉及的三大知识点:
- URDF(Xacro)
- Rviz
- Gazebo
URDF 是用于描述机器人模型的 xml 文件,可以使用不同的标签具代表不同含义,URDF 编写机器人模型代码冗余,xacro 可以优化 URDF 实现,代码实现更为精简、高效、易读。容易混淆的是Rviz与Gazebo,在此我们着重比较以下二者的区别:
rviz是三维可视化工具,强调把已有的数据可视化显示;
gazebo是三维物理仿真平台,强调的是创建一个虚拟的仿真环境。
rviz需要已有数据。
rviz提供了很多插件,这些插件可以显示图像、模型、路径等信息,但是前提都是这些数据已经以话题、参数的形式发布,rviz做的事情就是订阅这些数据,并完成可视化的渲染,让开发者更容易理解数据的意义。
gazebo不是显示工具,强调的是仿真,它不需要数据,而是创造数据。
我们可以在gazebo中免费创建一个机器人世界,不仅可以仿真机器人的运动功能,还可以仿真机器人的传感器数据。而这些数据就可以放到rviz中显示,所以使用gazebo的时候,经常也会和rviz配合使用。当我们手上没有机器人硬件或实验环境难以搭建时,仿真往往是非常有用的利器。
综上,如果你手上已经有机器人硬件平台,并且在上边可以完成需要的功能,用rviz应该就可以满足开发需求。
如果你手上没有机器人硬件,或者想在仿真环境中做一些算法、应用的测试,gazebo+rviz应该是你需要的。
另外,rviz配合其他功能包也可以建立一个简单的仿真环境,比如rviz+ArbotiX。
在几句个人感受:
双系统!很多仿真跑步起来可能是虚拟机的问题,之前觉得Ubuntu看视频做笔记不方便,后来配置好以后所有操作都很顺畅,跟着做一遍几乎都是自己可能代码敲错了的问题,不会摸不到头脑让人崩溃。最重要的一点是:没有社交软件!只有git(全球最大同性社交软件)陪我学习。那种专注力,感觉不到时间流逝,右下角也看不大时间(在上边,想不起来看),学了很多。
另外就是现在很多操作都是跟着老师敲,或者复制官网的代码,并不能很好的理解和锻炼,准备好好看看原理,关于整个ros的运行框架和原理近期会整理出来。
关于现阶段的学习,是b站学、code敲、博客记录,我挺喜欢这种方式的,可能的问题就是1Ubuntu不是特别熟,还是会偶然出问题,比如耳机没声音。2博客完全沦为笔记(也算不上问题),内容有点冗余。
ros才学了很久,但是感觉最近才好好学上手吧,好好干!已经浪费很多很多时间啦,虽然很晚了,但是emmm,好过“明天学”吧。希望一开始接触就能好好学,那样我也会像那位学长一样进实验室吧。哈。深夜emo。
2021/11/30/3:14