Octomap建立二维栅格地图

本文用于浅浅记录下自己的操作经历

一、下载安装octomap_server

#首先要安装octomap库(这里我的版本是18.04)
sudo apt-get install ros-melodic-octomap-ros 
sudo apt-get install ros-melodic-octomap-server

#安装octomap在rviz中的插件
 sudo apt-get install ros-melodic-octomap-rviz-plugins

装完插件后再rviz中会出现以上选项

二、创建启动octomap_server的launch文件

#进入octomap_server的launch文件夹
cd /opt/ros/melodic/share/octomap_server/launch
(这里具体为啥要这样不太清楚,后面研究一下能否在lego-loam文件夹下建立一个launch用于启动)
 
#创建一个launch文件
sudo touch octomap_server.launch
 
#给launch文件加可写权限(可有可无好像)
sudo chmod a+w octomap_server.launch

三、编写启动octomap_server的launch文件

<launch>
  <node pkg="octomap_server" type="octomap_server_node" name="octomap_server"> 
 
     <!--resolution in meters per pixel-->
    <param name="resulution" value="0.1" />
    
     <!--name of the fixed frame,needs to be "/map" for SLAM-->
    <param name="frame_id" type="string" value="/map" />
 
     <!--max range/depth resolution of the kinect meters-->
    <param name="sensor_model/max_range" value="50.0" />
    <param name="latch" value="true" />
 
     <!--max/min height for occupancy map, should be in meters-->
    <param name="pointcloud_max_z" value="1.6" />
    <param name="pointcloud_min_z" value="0.8" />
 
    <param name="graound_filter_angle" value="3.14" />
 
     <!--topic from where pointcloud2 messages are subscribed-->
    <remap from="/cloud_in" to="/registered_cloud" />
 
  </node>
 
</launch>

这里因为运行的是lego-loam,所以把"frame_id"的值改成"/map",最后一行“remap”中的目的话题改成“/registered_cloud”。

四、运行启动

1、启动octomap_server的launch文件

cd /opt/ros/melodic/share/octomap_server/launch
roslaunch octomap_server.launch

2、启动lego-loam算法的launch文件

3、运行数据集

4、最终在rviz中添加Map,OccupancyGrid,OccupancyMap这三个选项,并设置其话题为"/projected_map"、“octomap_full"与"octomap_binary”

这里出现了一个问题:就是栅格地图只有前部分有,后部分就没有了。应该是要调节一些参数,后面自己尝试解决一下。

五、地图保存

可以自己创建一个用于存放地图的文件夹,我建立了一个map文件夹,在该文件夹下打开终端输入map_server地图保存命令:

rosrun map_server map_saver map:=/projected_map

即可生成pgm文件

但是以上生成的地图还存在着很多需要改进的地方,大家可以去探索一下,一些问题和优化方案可以参考:利用Octomap建立二维导航地图时出现的问题

注:如果大家想运行aloam算法,可以将"/map"改成"/camera_init","/registered_cloud"改成"/laser_cloud_map"

<launch>
  <node pkg="octomap_server" type="octomap_server_node" name="octomap_server"> 
 
     <!--resolution in meters per pixel-->
    <param name="resulution" value="0.1" />
    
     <!--name of the fixed frame,needs to be "/map" for SLAM-->
    <param name="frame_id" type="string" value="/camera_init" />
 
     <!--max range/depth resolution of the kinect meters-->
    <param name="sensor_model/max_range" value="50.0" />
    <param name="latch" value="true" />
 
     <!--max/min height for occupancy map, should be in meters-->
    <param name="pointcloud_max_z" value="1.6" />
    <param name="pointcloud_min_z" value="0.8" />
 
    <param name="graound_filter_angle" value="3.14" />
 
     <!--topic from where pointcloud2 messages are subscribed-->
    <remap from="/cloud_in" to="/laser_cloud_map" />
 
  </node>
 
</launch>

结果如下:


总结

本文另外参考的文章如下,给与感谢:

使用Octomap生成二维占据栅格导航地图

三维点云地图转二维栅格地图

A-LOAM/LOAM/Lego-LOAM/SC_Lego_LOAM实时构建3d点云地图与2d栅格地图(octomap)

### 使用 Octomap 创建 3D 栅格地图 为了创建三维栅格地图Octomap 库提供了一个强大的框架用于构建和操作基于八叉树的数据结构。该库实现了填充3D栅格的地图构图方式,并提供了相应数据结构和构图算法[^1]。 #### 安装依赖项 首先,确保安装了必要的软件包: ```bash sudo apt-get install ros-noetic-octomap-msgs ros-noetic-octomap-mapping ``` #### 初始化项目设置 在 ROS 工作空间中初始化一个新的 Catkin 包: ```bash cd ~/catkin_ws/src/ catkin_create_pkg octomap_example rospy std_msgs sensor_msgs geometry_msgs nav_msgs tf2_ros octomap octomap_msgs cd .. catkin_make source devel/setup.bash ``` #### 编写代码实例 下面展示一段 Python 脚本,演示如何读取点云数据并将其换成 Octomap 形式的 3D 占据网格: ```python import rospy from sensor_msgs.msg import PointCloud2 from octomap_srvs.srv import BoundingBoxQuery, BoundingBoxQueryRequest from octomap import OcTree def point_cloud_callback(msg): try: # 请求服务以更新octree bb_query = rospy.ServiceProxy('/octomap_server/bb_query', BoundingBoxQuery) req = BoundingBoxQueryRequest() resp = bb_query(req) # 获取OcTree对象 tree = OcTree(0.1) # 设置分辨率为0.1m tree.insertPointCloud( origin=rospy.get_param("/origin"), points=msg, maxrange=rospy.get_param("/max_range") ) # 更新全局变量中的tree状态 global_octree.updateInnerOccupancy() except Exception as e: print(f"Service call failed: {e}") if __name__ == '__main__': rospy.init_node('create_3d_grid_map') sub = rospy.Subscriber("/velodyne_points", PointCloud2, point_cloud_callback) rospy.spin() ``` 这段脚本订阅 `/velodyne_points` 主题上的点云消息,并调用 `bb_query` 服务来获取最新的占据信息。之后,这些信息会被用来更新内部的占用情况。 #### 启动 Octomap Server 启动 Octomap server 并加载配置文件: ```bash roslaunch octomap_mapping octomap_mapping.launch ``` 这会开启一个名为 `octomap_server` 的节点,它可以接收来自传感器(如激光雷达)的数据流,并实时生成或更新 3D 地图[^5]。 #### 可视化结果 最后,在 RViz 中查看生成的地图效果: ```bash rosrun rviz rviz -f velodyne --topic /octomap_binary ``` 这样就可以看到由 Octomap 构建出来的 3D 环境模型了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值