我正在开发一个使用 Kinect 进行机器人导航的项目。我们使用 ROS Groovy 作为发行版和 Gazebo 进行仿真,并为机器人模型提供传感器和模型插件。我们使用 .sdf 文件操作了 kinect 模型,并添加了 libgazebo_ros_openni_kinect.so 文件作为插件。所以现在,每当我们在 Gazebo 中启动机器人模型时,它都会发布以下主题:/cam3d/depth/image_raw、/cam3d/depth/points、/cam3d/rgb/image_raw ...
我们的 model.sdf 包含 kinect 模型的这一部分:
<plugin name="kinect" filename="libgazebo_ros_openni_kinect.so" >
<alwaysOn>true</alwaysOn>
<updateRate>10</updateRate>
<pointCloudCutoff>0.001</pointCloudCutoff>
<imageTopicName>/cam3d/rgb/image_raw</imageTopicName>
<pointCloudTopicName>/cam3d/depth/points</pointCloudTopicName>
<cameraInfoTopicName>/cam3d/camera_info</cameraInfoTopicName>
<depthImageTopicName>/cam3d/depth/image_raw</depthImageTopicName>
<depthImageInfoTopicName>/cam3d/depth/camera_info</depthImageInfoTopicName>
<frameName>kinect</frameName>
<distortion_k1>0.00000001</distortion_k1>
<distortion_k2>0.00000001</distortion_k2>
<distortion_k3>0.00000001</distortion_k3>
<distortion_t1>0.00000001</distortion_t1>
<distortion_t2>0.00000001</distortion_t2>
<imageTopicName>kinectimage</imageTopicName>
<pointCloudTopicName>pcloud</pointCloudTopicName>
<depthImageTopicName>depth</depthImageTopicName>
<depthImageCameraInfoTopicName>depthcamerainfo</depthImageCameraInfoTopicName>
</plugin>
我们打算使用 pcl_to_scan 包将点云数据转换为 LaserScan。我对此进行了一些研究。人们说我必须创建一个启动文件才能使用 pcl_to_scan 包。我查看了示例启动文件并意识到它们使用 openni.launch 和 openni_manager 来将 /camera/depth/points 转换为激光扫描数据。我需要操作该启动文件以使用我们创建的模型,因为我们目前没有使用 openni。
他们提供的启动文件是这样的:
<launch>
<!-- kinect nodes -->
<include file="$(find openni_launch)/launch/openni.launch"/>
<!-- openni_manager -->
<node pkg="nodelet" type="nodelet" name="openni_manager" output="screen" respawn="true" args="manager"/>
<!-- throttling -->
<node pkg="nodelet" type="nodelet" name="pointcloud_throttle" args="load pointcloud_to_laserscan/CloudThrottle openni_manager">
<param name="max_rate" value="2"/>
<remap from="cloud_in" to="/camera/depth/points"/>
<remap from="cloud_out" to="cloud_throttled"/>
</node>
<!-- fake laser -->
<node pkg="nodelet" type="nodelet" name="kinect_laser" args="load pointcloud_to_laserscan/CloudToScan openni_manager">
<!--Setting the parameters for obtaining scan data within desired ranges-->
<param name="max_height" value="0.30"/>
<param name="min_height" value="-0.15"/>
<param name="angle_min" value="-0.5233"/>
<param name="angle_max" value="0.5233"/>
<param name="range_min" value="0.50"/>
<param name="range_max" value="6.0"/>
<param name="output_frame_id" value="/camera_depth_frame"/>
<remap from="cloud" to="cloud_throttled"/>
</node>
</launch>
我还偶然发现了 depthimage_to_laserscan 和 pointcloud_to_laserscan 包,它们对于处理这个问题也很有用。任何有关 pcl_to_scan 问题的帮助,或任何其他更简单的方法来处理这种情况将不胜感激。提前致谢。