利用Octomap建立二维导航地图时出现的问题

Octomap出现的问题

最近在用VLP-16跑lego-loam,发现三维地图在导航时用不了,还是需要使用二维栅格地图。因此需要使用octomap将三维地图转为二维地图。一开始使用时也出现很多问题,花了一天时间终于将问题解决了,记录一下,避免踩坑。

安装

octomap_server安装

sudo apt-get install ros-melodic-octomap-ros #安装octomap
sudo apt-get install ros- melodic -octomap-msgs
sudo apt-get install ros-melodic-octomap-server
sudo apt-get install ros-melodic-octomap-rviz-plugins

octomap_map 安装

这里考虑到后期对地图进行滤波优化处理,所以采用安装包安装。

mkdir -p ~/Octomap/src
cd Octomap/src
catkin_init_workspace
git clone https://github.com/Ocotmap/octomap.git
cd ..

catkin_make

没有报错则安装成功

Octomap使用出现的问题

① 出现如下警告,且点击/map选择话题/project_map并没有反应

[ WARN] [1639447207.478957481]: MessageFilter [target=/camera_init ]: Dropped 100.00% of messages so far. Please turn the [ros.octomap_server.message_filter] rosconsole logger to DEBUG for more information

利用Octomap建立二维导航地图时出现的问题
出现上述问题主要是launch文件中点云输入话题不正确,针对lego-loam算法/cloud_in 改为/registered_cloud(与pointcloud2保持一致才可以)

; ② 出现二维地图与三维环境垂直

利用Octomap建立二维导航地图时出现的问题
这种问题是”frame_id”出现问题导致的,应修改为”map”

目前只遇到这两问题,如还有其它问题后续会补充上,最后献上自己的launch文件(未加其他参数处理)

Octomap使用

修改Octomap/launch文件夹下的Octomap_mapping.launch文件.完成后,启动程序:

roslaunch octomap_server octomap_server.launch

之后依次启动激光雷达和LeGo-loam程序:

roslaunch velodyne_pointcloud VLP16_points.launch
roslaunch lego-loam run.launch

在之后出现的rviz界面中,点开Add选项,会多一个octomap_rviz_plugins模块,如下图:

利用Octomap建立二维导航地图时出现的问题
其中OccupanyGrid是显示三维概率地图,OccupanyMap是显示二维占据栅格地图。
启动rviz后,点击”add”,分别添加”Map”、”OccupancyGrid”与”OccupancyMap”,并把其话题名依次改为”/projected_map”、”octomap_full”与”octomap_binary”就可以看到建图过程了。
利用Octomap建立二维导航地图时出现的问题

地图保存与优化

地图保存

保存二维栅格地图用于后期导航,地图的节点是/projected_map。新开终端,输入:

rosrun map_server map_saver map:/projected_map -f ~/map

如下图所示,图中存在较多噪点,这是因为,建图过程中误将地面当障碍物了,所以接下来需要对程序中的参数进行一些调整,优化建图效果。

利用Octomap建立二维导航地图时出现的问题

地图优化

调整获得点云与地面之间的高度,调整适当高度的值。;激光雷达的安装位置距离地面存在着一定的距离,所以需要”pointcloud_min_z”需要设为负值。调整完成后,重新运行程序

    <param name="pointcloud_max_z" value="1.0" />
    <param name="pointcloud_min_z" value="-0.5" />

利用Octomap建立二维导航地图时出现的问题
利用Octomap建立二维导航地图时出现的问题

如果通过参数调整仍达不到理想的建图效果可以尝试修改所使用的滤波器。

③常用的参数

sensor_model/[hit | miss] (float, default: 0.7/0.4) : 动态构建地图时传感器模型的命中率和未命中率;
sensor_model/max_range(float,default:-1(unlimited)):动态构建地图时用于插入点云数据的最大范围(以米为单位),将范围限制在有用的范围内可以防止虚假的错误点;
senor_model/[min | max] (float, default:0.12/0.97):动态构建地图时的最小和最大clamp概率;
fliter_ground(bool, default:false):动态构建地图时是否应从扫描数据中检测并忽略地平面,将清楚地面所有内容,但不会将地面作为障碍物插入到地图中,可用ground_fliter对其进一步配置;
ground_fliter/distance(float, default:0.04):将点(在Z轴方向上)分割为接地平面的距离阈值,小于该阈值被认为平面;
ground_fliter/angle(float, default:0.15):被检测平面相对于水平面的角度阈值,小于该阈值被检测为地面;
ground_fliter/lane_distance(float, default: 0.07):对于要检测为平面的平面,从 z = 0 到距离阈值(来自PCL的平面方程的第4个系数);
pointcloud_[min|max]_z (float, default: -/+ infinity): 要在回调中插入的点的最小和最大高度,在运行任何插入或接地平面滤波之前,将丢弃此间隔之外的任何点。您可以以此为基础根据高度进行粗略过滤,但是如果启用了 ground_filter,则此间隔需要包括接地平面;
filter_speckles(bool):是否滤除斑。

<launch>
  <node pkg="octomap_server" type="octomap_server_node" name="octomap_server">

    <!-- resolution in meters per pixel -->
    <param name="resolution" value="0.05" />

    <!-- 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 in meter -->
    <param name="sensor_model/max_range" value="100.0" />
    <param name="latch" value="true" />

    <!-- max/min height for occupancy map, should be in meters -->
    <param name="pointcloud_max_z" value="1.0" />
    <param name="pointcloud_min_z" value="-0.5" />

    <!-- topic from where pointcloud2 messages are subscribed -->
    <remap from="/cloud_in" to="/registered_cloud" />

  </node>
</launch>

Original: https://blog.csdn.net/aidimoli123/article/details/121922553
Author: aidimoli123
Title: 利用Octomap建立二维导航地图时出现的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/597636/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球