激光SLAM保存点云地图,使用ros工具保存,而不重新编译SLAM程序。
目录
以A-LOAM运行kitti数据集为例
运行A-LOAM程序,打开两个终端,分别运行
roslaunch aloam_velodyne aloam_velodyne_HDL_64.launch
rosbag play --pause xxx.bag
方法
方法一 录制话题保存为rosbag再转为pcd
将需要录制的地图点云话题topic用rosbag record录制下来,保存为bag文件,再把bag里的相关话题转出为pcd格式。
具体步骤:
1.在即将跑完的时候录制下来,在想要保存的文件夹位置,打开终端,运行
rosbag record /laser_cloud_map
会显示两条INFO信息:
[ INFO] [......]: Subscribing to /laser_cloud_map
[ INFO] [......]: Recording to 'map.bag'.
运行结束后ctrl+C结束录制,地图文件.bag文件保存在文件夹。
2.将bag转化为pcd文件
切换到map.bag文件所在的目录下
rosrun pcl_ros bag_to_pcd map.bag /laser_cloud_map map.pcd
map.bag转换为map.pcd。rosrun运行结束,可以看到生成了一个pcd文件夹,将里面的文件按照修改时间排序,最新的就是最后的点云地图pcd文件。
如果 rosbag record保存的文件是以.bag.active为后缀的文件,需要将其恢复成正常的以".bag"为后缀的包。修复过程:
rosbag reindex xxx.bag.active
rosbag fix xxx.bag.active或者rosbag fix xxx.bag result.bag
rosbag reindex 之后和i生成.bag.org.active为后缀的文件,这只是中间文件,不用处理。rosbag fix仍对xxx.bag.active处理,如果fix后面还有result.bag则是将修复文件保存为 result.bag。
方法二 直接保存话题为pcd
使用rosrun pcl_ros工具,直接将需要录制的地图点云话题topic,用rosrun pcl_ros保存为pcd文件。
具体步骤:
在即将跑完的时候录制,在想要保存的文件夹位置,打开终端,运行
rosrun pcl_ros pointcloud_to_pcd input:=/laser_cloud_map
此时终端出现如下INFO信息
[ INFO] [1683850358.621560685]: Saving as binary PCD
[ INFO] [1683850358.625476468]: Listening for incoming data on topic /laser_cloud_surround
[ INFO] [1683850360.540955903]: Received 7650 data points in frame camera_init with the following fields: x y z intensity
[ INFO] [1683850360.540990020]: Data saved to 1317653847034159.pcd
[ INFO] [1683850361.131458068]: Received 13486 data points in frame camera_init with the following fields: x y z intensity
[ INFO] [1683850361.131489694]: Data saved to 1317653847552311.pcd。。。。。。
rosrun pcl_ros pointcloud_to_pcd input:=将/laser_cloud_map话题topic下一系列的点云以pcd格式保存到文件夹中,将文件夹里面的文件按照修改时间排序,最新的就是最后的点云地图pcd文件。
点云地图查看
pcl_viewer查看
pcl_viewer xxx.pcd
没有安装的话需要提前安装
sudo apt-get install pcl-tools
cloudcompare查看
打开cloudcompare
cloudcompare.ccViewer
cloudcompare.CloudCompare
pcd点云地图转ply格式查看
pcl_pcd2ply xxx.pcd xxxxxxx.ply
MatLab/MeshLab等第三方软件对点云地图进行处理时需要将pcd转为ply,其中MeshLab必须使用由pointcloud_to_pcd方法创建pcd转成的ply格式点云!
ROS指令解释,来自GPT
rosrun pcl_ros pointcloud_to_pcd
`rosrun pcl_ros pointcloud_to_pcd` 是一个ROS节点,用于将ROS中的点云数据转换为PCD文件格式。
在使用 `rosrun pcl_ros pointcloud_to_pcd` 命令时,需要指定输入的点云数据的话题名称,以及输出的PCD文件名称和路径。具体使用方法如下:
```
rosrun pcl_ros pointcloud_to_pcd input:=<input_topic_name> output:=<output_file_path>
```
其中,`<input_topic_name>` 是输入点云数据的ROS话题名称,`<output_file_path>` 是输出的PCD文件路径和名称。例如:
```
rosrun pcl_ros pointcloud_to_pcd input:=/camera/depth/points output:=/home/user/pointcloud.pcd
```
这个例子中,节点将从 `/camera/depth/points` 话题接收点云数据,然后将其转换为 PCD 文件格式,并将其保存到 `/home/user/pointcloud.pcd` 文件中。
需要注意的是,使用 `rosrun pcl_ros pointcloud_to_pcd` 转换点云数据时,需要确保输入的点云数据已经被发布到了指定的 ROS 话题中。此外,还需要确保已经安装了 `pcl_ros` 软件包,否则该命令将无法正常运行。
除了使用命令行工具 `rosrun`,还可以使用 ROS launch 文件来启动 `pointcloud_to_pcd` 节点。在 launch 文件中,需要指定输入和输出参数,以及节点的名称和其他参数。例如下面是一个使用 ROS launch 文件来启动 `pointcloud_to_pcd` 节点的示例:
```xml
<launch>
<node name="pointcloud_to_pcd" pkg="pcl_ros" type="pointcloud_to_pcd">
<remap from="input" to="/camera/depth/points"/>
<param name="filename" value="/home/user/pointcloud.pcd"/>
</node>
</launch>
```
在这个示例中,首先定义了一个名为 `pointcloud_to_pcd` 的节点,使用 `pcl_ros` 软件包中的 `pointcloud_to_pcd` 类型。然后,使用 `remap` 标签将 `input` 重映射到 `/camera/depth/points`,表示输入点云数据的话题名称。最后,使用 `param` 标签将 `filename` 参数
设置为 `/home/user/pointcloud.pcd`,表示输出的 PCD 文件的路径和名称。
启动该 launch 文件后,将自动启动 `pointcloud_to_pcd` 节点,并将从 `/camera/depth/points` 话题接收点云数据,然后将其转换为 PCD 文件格式,并将其保存到 `/home/user/pointcloud.pcd` 文件中。
需要注意的是,使用 ROS launch 文件启动节点时,需要确保 launch 文件中指定的话题名称与实际发布的话题名称一致。如果话题名称不匹配,节点将无法接收到正确的输入数据,并且转换结果也将不正确。
此外,还需要确保已经将 launch 文件保存在 ROS 环境变量 `$ROS_PACKAGE_PATH` 所包含的路径中,否则 ROS 将无法找到该 launch 文件。
总之,使用 `rosrun pcl_ros pointcloud_to_pcd` 或者 ROS launch 文件中的 `pointcloud_to_pcd` 节点,可以方便地将 ROS 中的点云数据转换为 PCD 文件格式,并进行保存和后续处理。