octomap(3):搭建一个完整的octomap建图工作空间-CSDN博客
这个是我参考的教程。之前已经复现过一次,但是没有下载源码编译,不能对源码进行修改,不适合后期使用。所以我的目标是:
(1)要能对源码进行修改
(2)能够通过Ros发布点云,接收点云,实时生成地图。
上面那个教程就是把octomap现有的功能放在一起了,可以实现对源码进行修改,查看源代码。
就按他那个复现,能成功。但我又产生了疑惑。得找找数据从哪里输入,又怎么输出的,保存在哪的?这个大概也是我们复现一个新的项目需要知道的最基本的问题。
1.数据输入
roslaunch octomap_server octomap_mapping.launch
这是教程运行的launch文件,去看看里面有些什么。
<!--
Example launch file for octomap_server mapping:
Listens to incoming PointCloud2 data and incrementally builds an octomap.
The data is sent out in different representations.
Copy this file into your workspace and adjust as needed, see
www.ros.org/wiki/octomap_server for details
-->
<launch>
<node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
<param name="resolution" value="0.05" />
<!-- fixed map frame (set to 'map' if SLAM or localization running!) -->
<param name="frame_id" type="string" value="odom_combined" />
<!-- maximum range to integrate (speedup!) -->
<param name="sensor_model/max_range" value="5.0" />
<!-- data source to integrate (PointCloud2) -->
<remap from="cloud_in" to="/narrow_stereo/points_filtered2" />
</node>
</launch>
为了方便观看,我把源码贴到这里。贴一个gpt的解释吧,直观一点:
是的,您提供的启动文件配置了一个 `octomap_server_node` 节点,该节点将点云数据作为输入。以下是具体的解释:
```xml
<launch>
<node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
<param name="resolution" value="0.05" />
<!-- fixed map frame (set to 'map' if SLAM or localization running!) -->
<param name="frame_id" type="string" value="odom_combined" />
<!-- maximum range to integrate (speedup!) -->
<param name="sensor_model/max_range" value="5.0" />
<!-- data source to integrate (PointCloud2) -->
<remap from="cloud_in" to="/narrow_stereo/points_filtered2" />
</node>
</launch>
```
### 详细解释
- **分辨率设置**:
```xml
<param name="resolution" value="0.05" />
```
这行代码设置了八叉树地图的分辨率为0.05米。
- **固定帧设置**:
```xml
<param name="frame_id" type="string" value="odom_combined" />
```
这行代码指定了固定的参考坐标系帧为 `odom_combined`,该帧用于地图构建和更新。
- **传感器最大范围**:
```xml
<param name="sensor_model/max_range" value="5.0" />
```
这行代码将传感器模型的最大探测范围设置为5.0米,用于加速地图构建过程。
- **点云数据源**:
```xml
<remap from="cloud_in" to="/narrow_stereo/points_filtered2" />
```
这行代码将节点期望的 `cloud_in` 话题重新映射为 `/narrow_stereo/points_filtered2`。也就是说,`octomap_server_node` 将从 `/narrow_stereo/points_filtered2` 话题接收点云数据(`sensor_msgs/PointCloud2` 格式)。
### 总结
这个启动文件配置的 `octomap_server_node` 节点的输入是点云数据。具体来说,它从话题 `/narrow_stereo/points_filtered2` 接收点云数据用于构建和更新OctoMap地图。如果话题 `/narrow_stereo/points_filtered2` 没有数据发布,您需要确保有一个节点发布点云数据到该话题。
可以看到,的确是采用点云数据输入。我们再来看看rostopic里有些什么:
输入指令: rostopic list
/free_cells_vis_array
/narrow_stereo/points_filtered2
/occupied_cells_vis_array
/octomap_binary
/octomap_full
/octomap_point_cloud_centers
/octomap_server/parameter_descriptions
/octomap_server/parameter_updates
/projected_map
/rosout
/rosout_agg
/tf
/tf_static
可以看到,话题里出现了“/narrow_stereo/points_filtered2”这个话题,与代码对应。
再来看看节点图:指令:rqt_graph
结果:可以看到只有话题订阅者,没有发布者。这和我们运行时的警告一致,没有数据输入。
到这里就知道了:这个代码可以接收点云并生成地图。但目前没有点云数据输入。如果我们想发布点云,则必须:有一个节点在 /narrow_stereo/points_filtered2
话题发布 sensor_msgs/PointCloud2
类型的点云数据。
这里贴一个官方文档,它里面解释了,具体的去官方文档看,里面解释了各种东西,对理解代码很有用(官方的文档真重要啊,找不到教程还有官方的可以救命):
2.输出
根据我个人的理解,输出就是一个地图。可以可视化,保存(见我前一篇文章)。
贴一个我跑的结果:
好了,今天就先写到这里吧。下次我想实现的是把输入给她补上。希望能成功!