CT_ICP
ct_icp部署过程
按照github上的README.MD步骤进行
问题1 step1中cmake --build . --config Release
执行过程中卡住
因为要安装很多依赖,网络不行
解决:科学上网
问题2 step2中cmake --build . --target install --config Release --parallel 12
error: ‘filesystem’ is not a member of ‘std’
#define SLAM_FILENAME std::filesystem::path(FILE).filename()
编译器版本太旧,把gcc和g++更新到11
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-11
sudo apt-get install g++-11
//再次查看gcc版本
gcc -v
//发现还是7.5.0
//进入/usr/bin目录下删除旧版本gcc/g++文件
cd /usr/bin
sudo rm gcc g++
//建立软连接
sudo ln -s gcc-11 gcc
sudo ln -s g++-11 g++
//再次查看版本,发现变为11
//重新cmake ,通过
使用自己录制的rosbag
roslaunch ct_icp_odometry ct_icp_on_rosbag.launch rosbag:=/home/river/Downloads/river1.bag topic:=/velodyne_points
//1
失败
后来发现,数据集UrbanLoco_HK是使用32线的Velodyne雷达采集的,并且包里含有专门为该数据集写的launch文件,故直接使用该Launch文件
roslaunch ct_icp_odometry urban_loco_HK.launch rosbag:=/home/river/Downloads/river1.bag
//2
成功!对比两个launch文件,发现是因为1没有配置文件,因为1和2相差就在配置文件上。
所以可以在1的基础上再增加config的路径,启动成功,命令如下
roslaunch ct_icp_odometry ct_icp_on_rosbag.launch rosbag:=/home/river/Downloads/river1.bag topic:=/velodyne_points config:=/home/river/catkin_lidar/src/ct_icp_odometry/params/ct_icp/urban_loco/hong_kong.yaml
那么如何保存点云地图呢?如何将点云地图转化为珊格地图呢?
保存点云地图
按照网上说法,按照以下步骤保存点云地图,但是保存出来的点云是一帧一帧的,并不是完整的地图。
猜想:/world_points 发布的数据就是一帧一帧的,并没有保留前一时刻的,在rviz中可以显示出整个地图是因为设置了decay time。
//1
roslaunch ct_icp_odometry urban_loco_HK.launch rosbag:=/home/river/Downloads/river1.bag
//2. 录制发布地图点云的rosbag
rosbag record -o out /ct_icp/world_points
//3. 录制完成后,使用pcl将rosbag 转化为pcd格式文件或ply格式文件
//3.1 转化为pcd格式文件
rosrun pcl_ros bag_to_pcd out{/tab} /ct_icp/world_points world_points
//3.2 转化为ply格式文件
rosbag play out{/tab} /ct_icp/world_points:=/input
// new terminal
rosrun pcl_ros pointcloud_to_pcd
pcl_pcd2ply xxx.pcd
转化为栅格地图并保存
1 安装octomap
#安装octomap
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
2 进入octomap安装目录,写个octomap_server节点的launch文件:
#进入octomap_server的launch文件夹
cd /opt/ros/melodic/share/octomap_server/launch
#创建launch文件
sudo touch octomap_server.launch
#给launch文件加可写权限
sudo chmod a+w octomap_server.launch
3 写入launch文件
需要注意,frame_id 设置为 /odom,话题cloud_in设置为 /ct_icp/world_points
<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="/odom" />
<!--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="/ct_icp/world_points" />
</node>
</launch>
4 启动SLAM算法并转换/保存地图
//1
roslaunch octomap_server octomap_server.launch
//2
roslaunch ct_icp_odometry urban_loco_HK.launch rosbag:=/home/river/Downloads/river1.bag
//3
添加rviz组件,OccupidedGrid,话题选择/octomap_full ,另外添加occupidedMap,话题为/projected_map
//4. 保存二维栅格地图 (快要结束时)
rosrun map_server map_saver map:=/projected_map
//5. 保存完整的概率八叉树地图
rosrun octomap_server octomap_saver -f octomap.ot (rosrun octomap_server octomap_saver octomap.ot)保存压缩的二进制存储格式地图
//查看八叉树地图
octovis xxx.ot
二维栅格地图:
八叉树地图: