基于稀疏点云地图实现Turtlebot2真实环境下导航

该文介绍了如何使用ROS和turtlebot实现从稀疏点云地图到稠密点云地图,再到八叉树地图和二维栅格地图的转换,并最终进行路径规划导航。过程中涉及ORBSLAM2、点云保存、八叉树转换、滤波算法以及避障导航的实践。文章指出当前存在的问题是八叉树地图的离线转换和滤波算法的优化,以及依赖于硬件的避障导航,提出未来改进的方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在完成基于稀疏点云地图实现turtlebot导航的工作,大致实现路线为稀疏地图-》稠密点云地图-》离线八叉树地图-》二维栅格地图-》保存地图并基于turtlebot完成真实环境下的路径规划导航。遂将查阅的资料归纳整理。

环境:ubtuntu16

  1. 稠密点云地图

(1)源码

在ORBSLAM2构建稀疏点云地图的基础上增加了单独的稠密点云pcl显示线程

https://github.com/xiaobainixi/ORB-SLAM2_RGBD_DENSE_MAP.git

(2)编译运行

此处记得提前将原ORBSLAM2的词袋模型粘贴过来

     chmod +x build.sh
     ./build.sh

    mkdir build
    cd build
    cmake ..
    make -j

    ./run/rgbd_tum Vocabulary/ORBvoc.bin path_to_settings path_to_sequence path_to_association

这里以TUM数据集 rgbd_dataset_freiburg3_long_office_household序列为例

(3)保存pcd文件

在viewer线程中加入以下代码用于本地保存稠密点云地图

pcl:io:savePCDFile(“./pointcloud.pcd”,*globalmap)
  1. 八叉树地图

这里主要实现离线转换,后续可考虑换成实时转换,可参考:

https://github.com/IATBOMSW/ORB-SLAM2_DENSE.git

(1)准备工作

octomap工具包安装

sudo apt-get install ros-indigo-octomap-ros 
sudo apt-get install ros-indigo-octomap-msgs
sudo apt-get install ros-indigo-octomap-server
sudo apt-get install ros-indigo-octomap-rviz-plugins

下载源码

GitHub - RuPingCen/publish_pointcloud: this code can be used for transfom the pointcloud into octomap

(2)具体实现

将publish_pointcloud.cpp中pcd的路径改为上一节本地保存的pcd文件路径

nh.param<std::string>("path", path, "./test.pcd");

demo.launch同理

<param name="path" value="./test.pcd" type="str" />

另外,需注意demo.launch与publish_pointcloud.cpp中发布的话题需要对应上

启动命令

roslaunch publish_pointcloud demo.launch

此时已经将稠密点云地图发布到指定的 topic 上,并完成八叉树转换,这里可通过可视化工具 rviz 进行显示

点击rviz中add,添加PointCloud2模块,设置topic为代码中你设置的话题,可通过rostopic echo 来检查是否有相应话题输出,此时可显示pcd文件的点云地图

添加OccupancyGrid 模块,设置 topic 为/octomap_full,即可看到点云地图转换后的八叉树地图

具体实现可参考:Octomap 在ROS环境下实时显示_ros octomap_熊猫飞天的博客-CSDN博客

  1. 二维栅格地图

(1)加载话题实现

添加OccupancyMap 模块,设置 topic 为/octomap_full,即可看到八叉树地图转换后的二维栅格地图

这里仅展示滤除冗余信息之后的效果,黑色代表占据状态,即障碍物

(2)可能遇到的问题:

  • 地面信息未滤除

解决方法很多,可以在生成点云地图的时候加滤波算法

这里介绍一个简单的方法:

修改demo.launch中点云地图z轴的阈值,将z轴的最小值微调至刚好把地面信息滤除即可。

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

但是有个缺点,针对不同场景的点云地图,可能需要设置不同的阈值,比较麻烦,有时间推荐加滤波算法进去

具体的滤波算法可参考这里的工作:

https://github.com/IATBOMSW/ORB-SLAM2_DENSE
  • 点云地图坐标系错误,导致八叉树无法正确2D投影到栅格地图

这里可以通过pcl中的transforms完成空间中的坐标系转换

Eigen::Affine3f transform = Eigen::Affine3f::Identity();
    //transform.scale(1/2);
    transform.translate(Eigen::Vector3f(0,0,1));
    transform.translate(Eigen::Vector3f(0,0,1));
    transform.translate(Eigen::Vector3f(0,0,1));
    transform.translate(Eigen::Vector3f(0,0,1));
    transform.rotate(Eigen::AngleAxisf(-M_PI/2,Eigen::Vector3f(1,0,0)));
    transform.rotate(Eigen::AngleAxisf(-M_PI/8,Eigen::Vector3f(1,0,0)));
    transform.translate(Eigen::Vector3f(0,1,0));
    transform.translate(Eigen::Vector3f(0,1,0));
    pcl::transformPointCloud(cloud,cloud,transform);

translate、rotate分别为坐标系的位移和旋转

  1. 基于turtlebot完成真实环境下的路径规划导航

(1)保存地图

将上述二维栅格地图进行本地保存,其中/projected_map是octomap_server中二维栅格地图默认发布的名字

rosrun map_server map_saver map:=/projected_map -f map1

此时会生成pgm文件和yaml文件,其中yaml文件中机器人初始位置的Z轴需要改成0,因为此时机器人处于二维世界

根据上述步骤,在真实环境下亦可通过SLAM系统稀疏建图并最终转换成二维栅格地图

(2)加载地图

此时启动turtlebot2机器人


roslaunch turtlebot_bringup minimal.launch

加载上述步骤中保存的二维栅格地图文件

roslaunch turtlebot_navigation amcl_demo.launch map_file:=path/map1.yaml

rviz实时显示二维栅格导航地图和机器人位置

roslaunch turtlebot_rviz_launchers view_navigation.launch

(3)避障导航

此时开启算法定位(注:此处并没有开启kinect v2实现获取深度速度并转为激光数据)

故这块应该会报红,但是不妨碍机器人可以避障导航

roslaunch kinect2_gmapping.launch
  • 实例效果

  1. 总结

整个过程都是基于前人的工程化工作,实现起来还是不难的,但是可以看出整个过程还是存在一些问题

(1)八叉树离线

这里实现方式还是以离线为主,导致整体步骤不连贯,后续有时间将实时八叉树建图加进去

(2)滤波算法

在实现稠密点云地图时应考虑加入有效的滤波算法,而不是手动调整阈值,比较麻烦

(3)纯视觉导航

这块还是借用了kinect2_gmapping算法,感觉整体过程还是比较粗糙的,后续考虑纯视觉自动避障导航

### 点云地图概述 点云地图是一种通过三维空间中的离散点集合来表示环境的技术,广泛应用于机器人导航、自动驾驶以及增强现实等领域。这些点通常由激光雷达 (LiDAR) 或其他传感器采集而来,并携带位置信息以及其他属性数据(如颜色或强度)。在 ROS 下生成和可视化的点云地图涉及多个关键技术环节。 --- ### 点云地图的生成过程 点云地图的生成依赖于传感器获取原始数据并将其转换为结构化形式的过程。对于 LiDAR 数据,在 ROS 中可以通过订阅特定话题(例如 `/sensing/lidar/top/rectified/pointcloud`[^1])获得 `sensor_msgs::PointCloud2` 类型的消息。以下是主要步骤: #### 1. 原始数据采集 LiDAR 设备会周期性扫描周围环境并将距离测量值转化为三维坐标系中的点集。ROS 提供了多种驱动程序支持不同型号的设备,确保能够稳定接收数据流。 #### 2. 数据预处理 为了提高后续操作效率及质量,需对初始点云执行滤波和平滑等预处理措施。常用方法包括体素网格降采样(Voxel Grid Downsampling)[^2] 和统计异常值移除(Statistical Outlier Removal)[^3]: ```cpp // Voxel grid downsampling example using PCL library pcl::VoxelGrid<pcl::PointXYZ> voxel_grid; voxel_grid.setInputCloud(input_cloud); voxel_grid.setLeafSize(0.01f, 0.01f, 0.01f); // Set resolution of the grid voxel_grid.filter(*filtered_cloud); ``` #### 3. 地图构建算法 基于累积多帧点云形成全局一致的地图模型至关重要。ICP (Iterative Closest Point)[^4] 是一种经典配准手段用于校正相邻时刻间位姿偏差;而 LOAM(Laser Odometry and Mapping)[^5], Cartographer 则属于更先进的 SLAM 解决方案集成路径估计与建模功能于一体。 --- ### 点云地图的可视化方式 利用 RViz 工具可以方便快捷地展示点云效果。只需配置好 Display 面板参数即可加载对应主题显示相关内容。具体设置如下所示: - 添加 **PointCloud2** 显示项; - 设置 Topic 字段为目标名称比如上述提到三个选项之一; - 调整 Color Transformer 参数决定渲染风格。 此外还可以借助第三方插件扩展更多可能性,像 OctoMap 插件允许用户查看占用概率分布情况从而更好地理解复杂场景布局[^6]. --- ### 数据处理的关键要点 针对大规模高密度点云集合理论上存在诸多挑战需要妥善解决才能达到理想性能表现: - 存储优化:由于单次扫瞄可能产生数百万计顶点因此压缩编码成为必要考虑因素之一。LASzip 技术便是在此背景下应运而生的有效途径[^7]. - 实时性保障:当面对动态变化迅速或者范围广阔的任务需求时候如何平衡计算资源消耗同响应速度之间关系显得尤为重要。分布式架构配合 GPU 加速或许能提供可行思路[^8]. - 多源融合:单一感知装置难以覆盖全部视角盲区故引入相机图像辅助特征提取进而完成语义分割有助于提升整体认知水平[^9]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值