1 使用带ROS的gazebo深度摄像头
介绍
在本教程中,您将学习如何将gazebo深度摄影机连接到ROS。教程包括三个主要步骤:
- 创建一个包括ROS深度相机插件的露台模型
- 在gazebo上安装深度摄影机
- 在RViz中查看深度摄影机的输出。
这是一个独立的教程;它不使用在其他Gazebo ROS教程中开发的RRBot。它的目的是帮助你在ROS和gazebo上 迅速使用电脑视觉。
先决条件
你应该安装gazebo_ros_pkgs在学习本教程之前。
2 创建一个带有深度相机插件的露台模型
因为Gazebo和ROS是独立的项目,互不依赖。默认情况下,来自gazebo_models
存储库(如深度摄影机)的传感器不包括ROS插件。这意味着您必须根据Gazebo模型存储库中的自定义摄影机,然后添加自己的摄影机<plugin>
标记使深度摄影机数据将点云和图像发布到ROS主题。
你应该从gazebo上提供的相机中选择一个景深相机。本教程将使用Microsoft Kinect,但此过程应与列表中其他深度摄影机的过程相同。
首先,获取深度摄影机并修改其名称。我们从gazebo_models
你要做的就是下载然后把它打开。
或者,您可以按照model contribution tutorial从头开始制作自己的相机,或者可以克隆gazebo_models
从那里复制一个传感器。
无论你得到它,复制kinect
文件夹到你的~/.gazebo/models目录。然后,将模型的名称改为有意义的名称,比如kinect_ros
。若要更改模型的名称,应更新文件夹名称<name>
存储在.config
文件,和型号名称
在model.sdf
文件。
现在您需要添加ROS插件来发布深度相机信息并输出到ROS主题。ROS插件列表和示例代码可以在插件教程 .
在本教程中,您将使用通用的“opennikinect”插件。你可以(也应该)将此插件用于Kinect之外的其他类型的深度摄影机(它是一个较旧的插件,因此它保留了原来的名称)。
打开model.sdf
新模型目录中的文件。将以下SDFmarkup添加到<sensor>
在结束后立即标记</camera>
标签:
<plugin name="camera_plugin" filename="libgazebo_ros_openni_kinect.so">
<baseline>0.2</baseline>
<alwaysOn>true</alwaysOn>
<!-- Keep this zero, update_rate in the parent <sensor> tag
will control the frame rate. -->
<updateRate>0.0</updateRate>
<cameraName>camera_ir</cameraName>
<imageTopicName>/camera/color/image_raw</imageTopicName>
<cameraInfoTopicName>/camera/color/camera_info</cameraInfoTopicName>
<depthImageTopicName>/camera/depth/image_raw</depthImageTopicName>
<depthImageCameraInfoTopicName>/camera/depth/camera_info</depthImageCameraInfoTopicName>
<pointCloudTopicName>/camera/depth/points</pointCloudTopicName>
<frameName>camera_link</frameName>
<pointCloudCutoff>0.5</pointCloudCutoff>
<pointCloudCutoffMax>3.0</pointCloudCutoffMax>
<distortionK1>0</distortionK1>
<distortionK2>0</distortionK2>
<distortionK3>0</distortionK3>
<distortionT1>0</distortionT1>
<distortionT2>0</distortionT2>
<CxPrime>0</CxPrime>
<Cx>0</Cx>
<Cy>0</Cy>
<focalLength>0</focalLength>
<hackBaseline>0</hackBaseline>
</plugin>
正如您所看到的,这个插件允许您对如何将信息传递给ROS有很多细粒度的控制。注意以下几点:
- 这个
updateRate
参数应设置为0,这将导致plugin以与父SDF相同的速率发布深度信息传感器
。如果UpdateRate不是0,它将在父级上执行其他限制sensor
的更新率。 - 主题名称和
frameName
可以设置为任何您想要的,但是上面显示的主题与常用的dros包发布的默认主题相匹配,例如openni2_launch
。保持主题名称相同有助于在真实和模拟相机之间切换。 - 这个
distortionX
参数应符合<distortion>
母相机的标签。如果没有<distortion>
标记,然后对所有distortionX的值取0。 pointCloudCutoff
和PointCloudCutoffMax
分别是点的最小和最大距离。超过此距离的点将不显示。在任何一个传感器上都设置了一个附加的限制。
重命名模型后,将上面的代码添加到.sdf
文件,并保存了您的更改,您应该准备好了!
3 在gazebo上安装深度摄影机
启用ROS支持的开放式gazebo(例如。roslaunch gazebo_ros empty_world.launch
)。使用“插入”面板查找您的“Kinect ROS”模型,并将其插入到世界中。
重要提示:你还应该在场景中添加一些其他对象,否则你的相机可能没有任何东西可以看到!添加一些立方体、球体或其他物体,确保它们位于摄像机的可见范围内,如下面的屏幕截图所示。
4 RViz中的景深摄影机输出
现在相机在gazebo场景中,它应该发布图像和点云到ROS主题。您可以通过在一个新的终端里运行
rostopic list
来检查正在发布的主题。您应该会看到您在SDF插件代码中指定的主题。
你也可以运行RViz(
rosrun rviz rviz
)。首先,在左面板的“全局选项”部分设置RViz固定框架,以匹配您为其设置的值<frameName>
在插件XML代码中。然后,向RViz添加PointCloud2和/或一个image显示。对于图像,请将图像主题设置为在中使用的值<imageTopicName>
标签。对于PointCloud2,将主题设置为在<depthImageTopicName>
标签。请参阅下面的屏幕截图,以获取与上面示例传感器XML中的值相匹配的示例:
在设置了正确的主题和固定框架后,您应该会从PointCloud2中看到类似于以下内容的内容:
图像显示将显示深度摄影机结果的灰度版本。如果您有Gazebo 8或更新版本,可以将这些RViz结果与Gazebo Topic Visualizer中的depthimage结果进行比较。
故障排除
问题:
rostopic list
不显示相机主题。
解决方案:确保在露台中添加了正确的模型。确保Gazebo模拟正在运行,而不是暂停。检查model.sdf
归档并确保<plugin>
标记在文件中的正确位置。在冗长模式下试运行gazebo(
rosrun gazebo_ros gazebo --verbose
)并查看是否有任何有用的警告或错误消息可以帮助查明问题。
问题:ROS主题已经列出,但我在Rviz中没有看到任何内容。
解决方案:确保在露台上有摄像头可以看到的物体。确保在RViz中添加了图像或PointCloud2显示。检查您的图像或PointCloud2显示是否设置为显示正确的主题。检查是否未禁用图像或PointCloud2显示(复选框)。确保RViz固定框架与frameName
你在里面指定的<plugin>
标签。确保传感器剪裁参数没有设置为所有点都被剪裁。