阿克曼结构移动机器人的gazebo仿真(四):从键盘控制到自主导航的路径规划

张开发
2026/4/5 13:00:29 15 分钟阅读

分享文章

阿克曼结构移动机器人的gazebo仿真(四):从键盘控制到自主导航的路径规划
1. 从键盘控制到自主导航的升级路线当你已经能够用键盘控制阿克曼小车在Gazebo里横冲直撞时接下来最让人兴奋的就是让它自己跑起来。这就像教小朋友骑自行车——开始需要扶着车把键盘控制熟练后就要放手让TA自己保持平衡自主导航。实现这个跨越需要三个关键步骤环境感知给小车装上眼睛激光雷达和大脑SLAM算法来认识周围环境路径决策让小车学会自己规划从A点到B点的路线全局路径规划运动控制将规划好的路径转换成阿克曼转向特有的前轮角度和后轮速度局部路径跟踪我去年在做一个智能仓储项目时就遇到过传统差分轮机器人在高速转弯时货物倾斜的问题。换成阿克曼结构后不仅运行更稳定最高速度还提升了30%。下面分享的具体参数都是经过实际验证的配置。2. 搭建SLAM仿真测试环境2.1 Gazebo世界与传感器配置首先需要确保激光雷达在Gazebo中正常工作。在URDF文件中添加如下激光雷达配置以Hokuyo为例gazebo referencelaser_link sensor typeray namelaser pose0 0 0.1 0 0 0/pose visualizefalse/visualize update_rate40/update_rate ray scan horizontal samples720/samples resolution1/resolution min_angle-1.570796/min_angle max_angle1.570796/max_angle /horizontal /scan range min0.10/min max30.0/max resolution0.01/resolution /range /ray plugin namelaser_controller filenamelibgazebo_ros_laser.so topicName/scan/topicName frameNamelaser_link/frameName /plugin /sensor /gazebo关键参数说明samples720表示单圈扫描点数角度分辨率0.5度update_rate40对应10Hz的激光数据刷新率建议将激光安装高度设置在0.1-0.3米之间模拟真实车载情况2.2 gmapping建图实战配置创建专用的SLAM启动文件slam.launchlaunch !-- 加载gmapping节点 -- node pkggmapping typeslam_gmapping nameslam_gmapping remap fromscan to/scan/ param namebase_frame valuebase_footprint/ param namemap_update_interval value1.0/ param namemaxUrange value20.0/ param namesigma value0.05/ param namekernelSize value1/ param namelstep value0.05/ param nameastep value0.05/ param nameiterations value5/ param namelsigma value0.075/ param nameogain value3.0/ param nameminimumScore value50/ /node !-- 启动键盘控制 -- node pkgtianracer_description typeteleop.py nameteleop outputscreen/ /launch建图时的操作技巧先慢速驾驶小车绕场一周建议速度0.5m/s重点扫描直角拐弯、狭窄通道等特征明显区域遇到地图残缺时可让小车在问题区域多次往返保存地图rosrun map_server map_saver -f ~/my_map3. 阿克曼模型的导航适配3.1 move_base参数深度优化阿克曼车辆需要特殊配置的move_base参数。创建ackermann_navigation_params.yaml# 全局路径规划参数 GlobalPlanner: allow_unknown: true default_tolerance: 0.2 use_dijkstra: false # 局部路径规划参数 DWAPlannerROS: acc_lim_x: 1.0 # 线加速度限制(m/s^2) acc_lim_th: 0.5 # 角加速度限制(rad/s^2) max_vel_x: 1.5 # 最大线速度(m/s) min_vel_x: 0.2 # 最小线速度(m/s) max_vel_th: 0.8 # 最大角速度(rad/s) min_vel_th: -0.8 # 最小角速度(rad/s) vyaw_lim: 0.4 # 转向角速度限制(rad/s) holonomic_robot: false阿克曼特有的关键参数xy_goal_tolerance建议设为0.3比差分轮机器人更大yaw_goal_tolerance建议设为0.2在costmap_common_params.yaml中需要增大inflation_radius建议1.5倍车宽3.2 转向几何解算实现在cmdvel2gazebo.py中增加导航消息转换逻辑def nav_callback(self, msg): # 将导航系统发出的cmd_vel转换为阿克曼转向指令 linear_vel msg.linear.x steering_angle msg.angular.z # 阿克曼几何计算 if abs(steering_angle) 0.01: turn_radius self.wheelbase / math.tan(steering_angle) left_vel linear_vel * (1 - (self.tread/(2*turn_radius))) right_vel linear_vel * (1 (self.tread/(2*turn_radius))) else: left_vel right_vel linear_vel # 发布到gazebo控制器 self.publish_wheel_velocities(left_vel, right_vel) self.publish_steering_angles(steering_angle)4. 完整导航系统集成测试4.1 启动全栈导航系统创建navigation.launch整合所有模块launch !-- 启动Gazebo环境 -- include file$(find tianracer_description)/launch/tianracer.launch arg nameworld_name valuewarehouse.world/ /include !-- 加载导航参数 -- rosparam file$(find tianracer_navigation)/params/ackermann_navigation_params.yaml commandload/ !-- 启动move_base -- node pkgmove_base typemove_base namemove_base outputscreen rosparam file$(find tianracer_navigation)/params/costmap_common_params.yaml commandload nsglobal_costmap/ rosparam file$(find tianracer_navigation)/params/costmap_common_params.yaml commandload nslocal_costmap/ rosparam file$(find tianracer_navigation)/params/local_costmap_params.yaml commandload/ rosparam file$(find tianracer_navigation)/params/global_costmap_params.yaml commandload/ /node !-- 启动AMCL定位 -- include file$(find tianracer_navigation)/launch/amcl.launch/ /launch4.2 典型问题排查指南小车原地转圈不前进检查cmd_vel话题是否正常确认PID参数是否使速度控制器达到饱和遇到障碍物急停抖动调整local_costmap的inflation_radius降低DWAPlannerROS的max_vel_x转弯时轨迹偏离检查阿克曼转向几何计算是否正确验证车轮实际转向角度与指令是否一致在真实项目中我们通常先用仿真验证算法再到实车上微调参数。记得有次调试时发现小车总是撞右侧障碍物最后发现是激光雷达安装位置偏移了5cm导致的坐标系偏差。

更多文章