前言
还是接着之前的,稠密建图后保存可以得到一个vslam.pcd的点云,需要借助octomap_server创建八叉树地图,还是会遇到一些问题,具体参考的这篇博客。
octomap_server
octomap_server是ROS中的一个基于octomap的功能包。
开始安装:
打开一个终端.(ctrl+alt+T)输入下面指令安装octomap.
sudo apt-get install ros-kinetic-octomap-ros #安装octomap
sudo apt-get install ros-kinetic-octomap-msgs
sudo apt-get install ros-kinetic-octomap-server
安装octomap 在 rviz 中的插件
sudo apt-get install ros-kinetic-octomap-rviz-plugins
测试安装成功
#开一个终端输入
roscore
#再开一个终端
rviz
点击rviz的add如果看到多一个octomap_rviz_plugins模组,就安装成功了。
下载源码
完整的代码用的是前面大佬提供的下载链接,这里的data文件里有两个他提供pcd点云文件,我测试了下都是可以用的,不过我用前面自己保存的那个slam.pcd,也是可以成功运行的。
不过还是需要做一些小修改:
先找一个工作空间,把上面的代码git clone过来。
git clone https://gitcode.com/RuPingCen/publish_pointcloud.git
进入 /src/publish_pointcloud/src下的publish_pointcloud.cpp,修改下面路径:
修改下面这行代码,改成自己的点云路径
nh.param<std::string>("path", path, "/home/fast-drone/test.pcd");
nh.param<std::string>("frame_id", frame_id, "camera");
nh.param<std::string>("topic", topic, "/pointcloud/output");
nh.param<int>("hz", hz, 5);
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> (topic, 10);
pcl::PointCloud<pcl::PointXYZ> cloud;
sensor_msgs::PointCloud2 output;
pcl::io::loadPCDFile (path, cloud);
pcl::toROSMsg(cloud,output);// 转换成ROS下的数据类型 最终通过topic发布
然后运行下面代码启动点云发布节点,如果没有成功运行,进入工作空间后source一下再运行
#开一个终端启动ros
roscore
#再开一个终端
rosrun publish_pointcloud publish_pointcloud
正常应该是可以看到下图,成功发布点云数据的topic /pointcloud/output
再开一个新的终端输入
#打开rviz
rviz
点击add,添加 "PointCloud2模块"
设置topic为 "/pointcloud/output"
设置FixedFram为"camera"(如果不能选就手动输入“camera”)
这时候应该能看到下图的点云了。
在/src/publish_pointcloud/launch下有两个launch文件,是作者写好的用来集成的,如果上面一步成功实现,这两个launch文件是可以直接用的。
octomaptransform.launch是用来启动 octomap_server,而demo.launch是整个集成(包括启动rviz),下面来试一下。
1.octomaptransform.launch
#开第一个终端启动ros
roscore
#进入publish_pointcloud所在的工作空间,开第二个终端
#source一下,这里mumu是我的工作空间,根据自己的自行替换
source ~/mumu/devel/setup.bash
rosrun publish_pointcloud publish_pointcloud
#同第二步,还是进入mumu空间开启第三个终端
source ~/mumu/devel/setup.bash
roslaunch publish_pointcloud octomaptransform.launch
#最后第四个终端开启rviz
rviz
全部执行成功会如下图所示:这里左下会显示一个警告,我尝试过解决,不过好像不影响最终的点云显示。
[ WARN] [1715308792.012699791]: Nothing to publish, octree is empty
最后在rviz 中添加一个 “OccupancyGrid” 模块(三维格点). 设置 topic 为"/octomap_full",即可以得到如下结果:
注意:点云图是倾斜的,查询了一下好像是坐标转换出了问题,点击rviz左边的Grid下的Plane,后面有个坐标轴,默认是XY,可以改成XZ看看,不过看着还是有些倾斜,准备后面找个空旷点的地方采集自己的数据集再试试。
就成功辣!
demo.launch就是把上面的几个步骤集成为一个launch文件,会方便很多,效果是一样的,只需要进入所在工作空间执行下面代码,这里就不放图了。
roslaunch publish_pointcloud demo.launch
总结
得到八叉树地图,下一步就可以用这个地图进行路径规划了,不过这个点云效果看着还不是很好,准备先去户外用D435i采集自己的点云数据生成pcd文件后,再做成八叉树地图看看效果。