6.ROS&PX4--Pixhawk无人机+A1激光雷达SLAM部署

6.ROS&PX4–无人机A1激光雷达SLAM部署

一、常见2D SLAM算法

Gmapping
Hector_SLAM
Cartographer

Gmapping

基于粒子滤波的2D激光雷达SLAM,构建二维栅格地图。融合里程计信息,没有回环检测。优点是在小场景中,计算量小,速度较快。缺点是每个粒子都携带一幅地图,无法应对大场景(内存和计算量巨大);如果里程不准或标定参数不准,在长回廊等环境中容易把图建歪。

Hector_Slam

基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。

Cartographer

cartographerr是google推出的一套基于图优化的SLAM算法,累计误差较前两种算法低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。

二、测试A1:

cd catkin_ws/src
git clone https://github.com/slamtec/rplidar_ros.git
cd ..
catkin_make
roslaunch rplidar_ros view_rplidar.launch

出现Rviz激光雷达点云界面,产品正常

三、部署Hector_Slam

创建hector_slam环境:
#安装hector-slam算法库
sudo apt-get install ros-noetic-hector-slam	
#部署算法到ROS工作目录	
cd ~/catkin_ws/src
git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam
cd ~/catkin_ws
#编译程序
catkin_make
实现SLAM:
1.创建Slam启动运行文件
#创建Hector_Slam_Demo.launch的Slam启动运行文件
touch  ~/catkin_ws/src/rplidar_ros/launch/Hector_Slam_Demo.launch

Hector_Slam_Demo.launch代码:

<launch>
	<node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
		<!-- Frame names -->
		<!--第一句使得我们能获得map与odom的坐标系变换,这样才能根据地图获得激光雷达目前在地图中的位姿;-->
		<!--然后由于没有里程计,因此odom_frame也设置为base_link就可以了-->
		<param name="pub_map_odom_transform" value="true"/>
		<param name="map_frame" value="map" />
		<param name="base_frame" value="base_link" />
		<param name="odom_frame" value="base_link" />

		<!-- Tf use -->
		<param name="use_tf_scan_transformation" value="true"/>
		<param name="use_tf_pose_start_estimate" value="false"/>

		<!-- Map size / start point -->
		<!-- 第一句设置地图图片分辨率,0.05m/pix; -->
		<!-- 第二句为图片大小; -->
		<!-- 三四句为初始点在图片中的位置,这里为中间 -->
		<param name="map_resolution" value="0.05"/>
		<param name="map_size" value="2048"/>
		<param name="map_start_x" value="0.5"/>
		<param name="map_start_y" value="0.5" />
		<param name="laser_z_min_value" value = "-1.0" />
		<param name="laser_z_max_value" value = "1.0" />
		<param name="map_multi_res_levels" value="2" />

		<param name="map_pub_period" value="2" />
		<param name="laser_min_dist" value="0.4" />
		<param name="laser_max_dist" value="5.5" />
		<param name="output_timing" value="false" />
		<param name="pub_map_scanmatch_transform" value="true" />
		<!--<param name="tf_map_scanmatch_transform_frame_name" value="scanmatcher_frame" />-->

		<!-- Map update parameters -->
		<param name="update_factor_free" value="0.4"/>
		<param name="update_factor_occupied" value="0.7" />    
		<param name="map_update_distance_thresh" value="0.2"/>
		<param name="map_update_angle_thresh" value="0.06" />

		<!-- Advertising config --> 
		<!-- 第一句设置发布地图的服务,第二句设置读取激光雷达数据的队列长度,第三句设置从哪个topic读取激光雷达是数据 --> 		
		<param name="advertise_map_service" value="true"/>
		<param name="scan_subscriber_queue_size" value="5"/>
		<param name="scan_topic" value="scan"/>
	</node>

	<!-- Advertising config --> 
	<!-- 这里直接启动了一个tf中的static_transform_publisher,用来发布base_link与激光雷达的位姿关系 --> 
	<!-- args前三个0代表相对位移,后三个0代表转动的欧拉角,然后写出两个相对的坐标系名称,最后一个100是100ms发布一次 --> 
	<node pkg="tf" type="static_transform_publisher" name="base_to_laser_broadcaster" args="0 0 0 0 0 0 /base_link /laser 100"/>
	<!-- static_transform_publisher具体写法格式如下(两种形式)--> 
	<!-- 欧拉角形式:static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms --> 
	<!-- 四元数形式:static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms --> 
	
	<node pkg="rviz" type="rviz" name="rviz" args="-d $(find hector_slam_launch)/rviz_cfg/mapping_demo.rviz"/>
</launch>

2.运行Hector_Slam
#开启A1雷达扫描
roslaunch rplidar_ros rplidar.launch 
#开始Hector_SLAM工作,自动开启Rviz建图
roslaunch rplidar_ros Hector_Slam_Demo.launch  
3.保存Map:
#安装map-server库
sudo apt-get install ros-noetic-map-server  
#保存模型命令
rosrun map_server map_saver -f ~/my_map     

此时,我们可以在根目录下获得两个文件,分别是my_map.pgm和my_map.yaml;点击my_map.pgm即可查看刚刚建成的地图,my_map.yaml里存放的是地图相关的信息

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值