0

我正在开发一个使用 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 问题的帮助,或任何其他更简单的方法来处理这种情况将不胜感激。提前致谢。

4

0 回答 0