树莓派+激光雷达实现DWA动态路径规划闭环系统 📅 发布时间:2026/9/17 1:22:46 👁 浏览次数: 1. 项目概述这不是玩具车而是一套可复现、可调试、可进阶的移动机器人路径规划闭环系统“自动驾驶小车DIY树莓派激光雷达实现DWA路径规划从仿真到实车”——这个标题里藏着三个关键层级硬件载体树莓派、感知核心激光雷达、决策中枢DWA算法。它不是拼凑几个模块就跑起来的演示demo而是一条从Gazebo仿真验证、ROS节点集成、传感器驱动适配、参数调优最终落地到真实轮式底盘上完成动态避障与目标趋近的完整技术链。我带过六届本科生毕设也帮三家公司做过AGV原型验证最常看到的问题就是学生用树莓派4B接了个TFMini激光测距模块跑个A*算法在空旷走廊里绕一圈就敢叫“自动驾驶小车”。但真正的DWADynamic Window Approach路径规划要求系统每秒至少处理10帧以上激光扫描数据即10Hz在20ms内完成障碍物聚类、速度空间采样、轨迹评估与最优控制量输出并实时反馈给底层电机控制器。这背后是ROS的实时性约束、树莓派的CPU调度瓶颈、激光雷达驱动的中断响应延迟、以及DWA参数对物理底盘动力学的强耦合——任何一个环节掉链子小车就会原地打转、撞墙、或突然急停。所以这个项目真正解决的是如何在资源受限的嵌入式平台树莓派上构建一个具备工程鲁棒性的局部路径规划闭环让小车在未知动态环境中像人一样“边走边想”而不是靠预设路径硬闯。适合两类人深度参考一是需要交付高质量毕设/课程设计的本科生尤其关注“鱼香ROS一键安装”这类实操痛点二是刚入门ROS机器人开发的工程师想跳过ROS2的复杂生态用成熟稳定的ROS NoeticUbuntu 20.04快速验证算法逻辑。它不教你怎么写ROS基础教程而是直接告诉你当你的小车在Gazebo里跑得飞起一上实车就抖动失联时问题大概率出在/scan话题的timestamp同步、base_link到laser的TF坐标系偏移、或者DWA配置中max_vel_x和acc_lim_x的物理匹配上。2. 整体架构设计与技术选型逻辑为什么非得是树莓派激光雷达ROSDWA这条技术栈2.1 硬件平台树莓派不是“便宜替代品”而是嵌入式ROS部署的黄金平衡点很多人问为什么不用Jetson Nano它GPU更强啊。我的实测结论是对于纯DWA这类CPU密集型、无图像识别需求的局部规划任务树莓派4B4GB RAM比Jetson Nano更稳、更省心、更易调试。Jetson Nano的CUDA加速在DWA里根本用不上——DWA核心是大量浮点向量运算和循环遍历OpenMP多线程优化已足够GPU反而因驱动兼容性问题导致ROS节点频繁崩溃。而树莓派4B的优势在于三点第一Ubuntu 20.04 LTS官方支持完善内核版本5.4长期维护所有ROS Noetic依赖包如ros-noetic-navigation都能一键apt install不像某些ARM板需手动编译第二GPIO引脚定义清晰、文档齐全驱动TB6612FNG电机驱动板时用wiringpi库直接操作PWM引脚误差控制在±0.5%以内远超树莓派Pico的模拟PWM精度第三散热与功耗比极佳连续运行8小时CPU温度稳定在65℃加装铝制散热片静音风扇而Jetson Nano满载时风扇噪音达45dB且需额外供电管理。我曾用树莓派5试跑同一套DWA节点结果因USB3.0控制器与RPLIDAR A3驱动冲突导致/scan数据丢帧率达12%最终退回4B。所以选型逻辑很朴素不追求参数峰值而追求“能7×24小时稳定输出10Hz激光数据流”的工程确定性。树莓派4B就是那个经过千人验证的“稳态解”。2.2 感知层激光雷达不是越贵越好RPLIDAR A3是实车DWA的“呼吸器官”DWA算法的输入是二维激光扫描点云sensor_msgs/LaserScan它的质量直接决定避障成败。我对比过四款主流雷达思岚A1360°/12m/4kHz、速腾聚创RS-LiDAR-M1128线/200m、北醒CE30TOF/单线、RPLIDAR A3360°/25m/16kHz。结论很明确RPLIDAR A3是树莓派实车项目的唯一合理选择。原因有三其一数据吞吐量匹配。A3标称16kHz扫描频率实际在树莓派4B上通过USB2.0480Mbps稳定输出10Hz全角度扫描每帧2200点而A1仅8kHz在动态场景下点云稀疏DWA评估轨迹时容易漏检移动障碍物其二驱动成熟度碾压。rplidar_ros包在ROS Noetic中开箱即用roslaunch rplidar_ros rplidar.launch后/scan话题延迟15ms而M1需定制ROS2驱动CE30的TOF原理在强光下信噪比骤降其三成本与可靠性平衡。A3单价约599寿命10000小时我实验室两台A3连续运行18个月零故障而某国产低价雷达299在潮湿环境运行3周后出现电机卡顿导致扫描角度偏移±3°DWA直接失效。这里有个关键细节A3必须配原装USB线屏蔽层双绞普通USB线会导致高频干扰/scan数据中出现大量inf值——这不是软件bug是电磁兼容问题。我在树莓派USB口并联100nF陶瓷电容后丢点率从8%降至0.3%。所以选雷达本质是选“能持续提供干净、低延迟、高密度点云”的物理传感器而非参数表上的数字。2.3 软件栈ROS Noetic不是“过时选择”而是DWA工业验证的基石当前网络热词里“ROS2 Humble”“Micro-ROS”声量很大但做DWA实车我坚持用ROS NoeticUbuntu 20.04。理由很实在move_base导航栈中的dwa_local_planner是经过十年以上AGV、扫地机器人量产验证的C实现其代码结构清晰、参数文档完备、社区问题库丰富。ROS2的nav2虽新但dwb_controllerDWB即DWA的ROS2版在树莓派上编译失败率高达37%因依赖ament_cmake与colcon工具链冲突且参数调试界面不如Noetic的rqt_reconfigure直观。更重要的是所有经典DWA论文Fox et al., 1997的开源实现都基于ROS1比如teb_local_planner的对比测试数据、dwa_planner的源码注释全指向Noetic环境。所谓“鱼香ROS一键安装”本质是封装了rosdep install、catkin_make、setup.bash等重复操作但底层仍是Noetic的move_base框架。我统计过GitHub上star数超500的DWA相关仓库92%明确标注“ROS Noetic compatible”。因此技术选型不是追逐新潮而是选择被最多真实机器人验证过的最小可行路径。你花三天搞定鱼香ROS安装不如花一天理解dwa_local_planner的cost_functions.cpp里footprint_cost如何计算机器人轮廓与障碍物距离——后者才是DWA不撞墙的核心。2.4 算法层DWA不是“高级路径规划”而是为轮式底盘量身定制的动态窗口法很多人把DWA和A*、RRT混为一谈这是根本性误解。A是全局规划器global_planner负责生成从起点到终点的粗略路径DWA是局部规划器local_planner只管“接下来0.5秒怎么走”。它的数学本质是在机器人当前速度v, ω构成的二维空间中划定一个“动态窗口”由最大加速度acc_lim_x/y/th约束对窗口内每个v, ω采样前向模拟0.5秒轨迹计算该轨迹的三项代价轨迹与全局路径的偏离度、轨迹末端与目标点的距离、轨迹最近点到障碍物的安全距离。最终选择总代价最低的v, ω作为本轮控制输出。这个过程每20ms执行一次形成闭环。关键点在于DWA不预测障碍物运动只对当前激光帧做瞬时避障。所以它天然适合树莓派——无需SLAM建图不依赖GPS只要激光数据在线就能工作。我曾用DWA让小车在办公室走廊自主避让突然冲出的同事反应时间180ms从激光扫描到电机响应而A重规划需2.3秒。因此DWA的价值不是“多智能”而是“多可靠”它把复杂的运动规划压缩成一个可实时求解的优化问题这才是嵌入式平台能扛住的算力负荷。3. 核心模块拆解与实操要点从Gazebo仿真到实车部署的七道关卡3.1 Gazebo仿真环境搭建先让小车在虚拟世界里“学会走路”仿真不是摆设它是暴露DWA参数缺陷的第一道筛子。我用turtlebot3_waffle_pi模型为基础但做了三处关键改造第一替换激光雷达插件。原模型用gazebo_ros_laser但其噪声模型固定无法模拟实车A3的量化误差。我改用libgazebo_ros_gpu_laser.so并在SDF文件中添加noisetypegaussian/typemean0.0/meanstddev0.01/stddev/noise使模拟点云每帧有±1cm随机偏移逼真复现A3的测量不确定性第二增加动态障碍物。用gazebo_ros_pkgs的spawn_model脚本在仿真中随机生成以0.3m/s匀速横穿路径的Box模型测试DWA的实时避让能力第三校准TF坐标系。在urdf中严格定义base_link底盘中心到laser雷达中心的偏移origin xyz0 0 0.15 rpy0 0 0/Z轴偏移15cm对应A3安装高度此值若错1cmDWA计算的安全距离偏差达3.2cm小车必撞墙。实操时我用rviz的TF面板实时监控base_link与laser的相对位姿确保/tf话题中rotation四元数w1.0xyz0.0。仿真启动命令不是简单roslaunch turtlebot3_gazebo turtlebot3_world.launch而是roslaunch turtlebot3_gazebo turtlebot3_world.launch world_file:$(rospack find turtlebot3_gazebo)/worlds/turtlebot3_house.world roslaunch turtlebot3_gazebo turtlebot3_simulation.launch roslaunch dwa_local_planner dwa_planner.launch其中turtlebot3_house.world包含真实比例的门框、桌腿用于测试DWA在狭窄空间的转向能力。仿真阶段必须达成两个指标1/cmd_vel输出频率稳定10Hz2小车在0.5m宽通道中能以0.2m/s匀速通过无剧烈左右摇摆。若不达标立即检查dwa_planner的min_vel_x建议设为0.05和sim_time建议0.6-0.8s而非怪硬件。3.2 树莓派系统配置绕过Ubuntu 20.04的“坑阵”树莓派4B装Ubuntu 20.04桌面版非Server版因为ROS可视化工具rviz,rqt需GUI。但默认镜像有三大陷阱第一USB供电不足。A3雷达USB摄像头同时接入时树莓派会触发under-voltage警告导致USB设备断连。解决方案禁用vc4显卡驱动sudo nano /boot/config.txt添加dtoverlayvc4-fkms-v3d改为#dtoverlayvc4-fkms-v3d改用fbturbo帧缓冲驱动GPU功耗降40%第二时钟同步漂移。树莓派无RTC芯片长时间运行后系统时间误差达5s/天导致/scan与/tf时间戳不匹配move_base报错Transform failed。用systemd-timesyncd强制NTP同步sudo timedatectl set-ntp true并编辑/etc/systemd/timesyncd.conf将NTP行改为NTPcn.pool.ntp.org第三swap分区拖慢ROS。默认100MB swap在内存满时引发磁盘IO风暴roslaunch卡死。sudo dphys-swapfile swapoff sudo nano /etc/dphys-swapfile将CONF_SWAPSIZE100改为CONF_SWAPSIZE0彻底禁用swap靠4GB RAM硬扛。这些配置看似琐碎但缺一不可——我见过太多人卡在/scan话题无数据最后发现是USB供电问题而非驱动没装。3.3 RPLIDAR A3驱动与数据校验让激光雷达“说真话”rplidar_ros包安装后roslaunch rplidar_ros rplidar.launch应输出[INFO] [xxx]: RPLIDAR running on: /dev/ttyUSB0。但此时需做三重校验物理连接校验用ls -l /dev/ttyUSB*确认设备号若显示/dev/ttyUSB1则修改launch文件中param nameport value/dev/ttyUSB1/数据质量校验rostopic hz /scan应稳定在10Hzrostopic echo /scan/range_min应为0.15A3最小测距range_max为25.0点云完整性校验rviz中添加LaserScanTopic选/scan若出现大片空白或inf值立即执行sudo chmod arw /dev/ttyUSB0赋予读写权限并检查USB线是否原装。最关键的一步是角度校准。A3出厂有±0.5°安装误差需用rplidar_ros的rplidar_node参数angle_compensate:true开启自动补偿但此功能依赖frame_id设为laser。若/tf中laser坐标系未正确定义补偿失效。我在robot_state_publisher的URDF中添加joint namelaser_joint typefixed parent linkbase_link/ child linklaser/ origin xyz0 0 0.15 rpy0 0 0/ /joint link namelaser/然后roslaunch robot_state_publisher robot_state_publisher.launch用tf_echo base_link laser验证偏移量。实测表明角度误差每增加0.3°DWA在1m距离的避障半径偏差达5.2cm——这解释了为何小车总在离墙0.3m处急停。3.4 DWA参数精调不是调参而是匹配你的物理底盘DWA的dwa_local_planner_params.yaml有27个参数但核心只有6个它们必须与你的电机、轮距、惯量物理匹配max_vel_x: 0.3→ 对应电机最大线速度m/s实测方法rostopic pub /cmd_vel geometry_msgs/Twist linear: {x: 0.3}用激光测距仪测小车实际速度若仅0.22m/s则调至0.22acc_lim_x: 0.8→ 电机最大加速度m/s²计算公式acc_lim_x (max_vel_x)² / (2 * braking_distance)刹车距离取0.15m实测急停距离得0.8yaw_goal_tolerance: 0.05→ 角度容忍度rad对应3°过大则转向不精准过小则原地振荡xy_goal_tolerance: 0.1→ 位置容忍度m即到达目标点10cm内视为成功sim_time: 0.7→ 轨迹模拟时长s太短0.5无法避开快速障碍物太长1.0计算延迟超限path_distance_bias: 32.0→ 路径贴合权重值越大越紧贴全局路径但易撞墙建议从20开始逐步上调。调参口诀先调max_vel_x和acc_lim_x保安全再调sim_time和yaw_goal_tolerance保流畅最后微调path_distance_bias保精度。我用rqt_reconfigure实时调整观察/cmd_vel的angular.z输出是否平滑——若出现±1.2rad/s的尖峰说明yaw_goal_tolerance过小需放大。3.5 底层电机控制让DWA的“想法”变成车轮的“动作”DWA输出/cmd_velTwist消息但树莓派不能直接驱动电机需通过串口或PWM转换。我用TB6612FNG驱动板接树莓派GPIOAIN1→GPIO17,AIN2→GPIO27,PWMA→GPIO18硬件PWM0BIN1→GPIO22,BIN2→GPIO23,PWMB→GPIO13硬件PWM1关键在PID闭环控制。/cmd_vel的linear.x需转换为左右轮PWM占空比left_pwm int(255 * (linear_x - angular_z * wheel_base/2) / max_vel_x) right_pwm int(255 * (linear_x angular_z * wheel_base/2) / max_vel_x)其中wheel_base0.26轮距0.26mmax_vel_x0.3。但开环控制会因电池电压下降导致速度衰减故加入编码器反馈。我用霍尔传感器1000线/转接GPIO24/25用pigpio库读取脉冲计算实际速度与/cmd_vel指令速度做PID差值动态修正PWM。PID参数Kp0.8, Ki0.02, Kd0.1经Ziegler-Nichols整定得出。实测表明无PID时速度波动±15%有PID后稳定在±2%。这步不可省——DWA假设输出速度能被精确执行若底层失控再好的规划也是空中楼阁。3.6 TF坐标系统一机器人世界的“语言翻译官”ROS中所有传感器数据必须在统一坐标系下解读TFTransform就是翻译官。本项目涉及四个关键坐标系map全局地图原点由SLAM或静态地图定义odom里程计原点随小车移动累积误差base_link小车底盘中心所有运动学计算基准laser激光雷达中心/scan数据的发布坐标系。必须保证map → odom → base_link → laser的TF链完整。常见错误robot_state_publisher未加载URDF导致base_link到laser缺失或odometry节点未发布odom → base_link导致move_base报错No transform from [base_link] to [map]。诊断命令rosrun tf view_frames生成frames.pdf检查是否有断链rosrun tf tf_echo odom base_link看位移是否随运动变化。我强制要求每次roslaunch后首先进入rviz添加TF显示确认四色坐标系红X绿Y蓝Z全部可见且无抖动。TF是隐形的骨架骨架歪了整个系统就瘫痪。3.7 实车动态避障测试用真实场景“压力测试”DWA仿真通过后实车测试分三阶段第一阶段静态环境。在空旷教室铺设0.5m×0.5m方格纸用激光测距仪标定A3安装高度15cm运行roslaunch turtlebot3_navigation turtlebot3_navigation.launch发布2D Nav Goal观察小车是否沿直线匀速抵达/cmd_vel的linear.x波动±0.02m/s第二阶段窄道挑战。设置0.6m宽通道两排课桌要求小车以0.15m/s通过DWA的inflation_radius必须≥0.25m膨胀半径否则擦碰桌腿第三阶段动态干扰。一人持纸板以0.5m/s横向穿越路径小车应在0.8m外开始减速0.3m处完全停止待纸板离开后1.2秒内恢复行驶。若急停距离0.5m调大acc_lim_x若恢复延迟2s调小oscillation_reset_dist振荡重置距离。终极检验连续运行2小时记录rostopic hz /scan和/cmd_vel的丢帧率合格线是0.5%。我实验室的纪录是18小时无丢帧靠的是前述所有环节的严丝合缝。4. 实操全流程详解从零开始的12步可复现部署指南4.1 环境初始化10分钟完成树莓派ROS基础环境烧录系统用Raspberry Pi Imager烧录ubuntu-20.04.6-preinstalled-server-arm64raspi.imgServer版更轻量首次启动时sudo raspi-config启用SSH、VNC、I2C、SPI并将GPU内存设为16MB释放更多RAM给ROS网络配置sudo nano /etc/netplan/01-network-manager-all.yaml设静态IP如192.168.1.100避免DHCP变动导致ROS master通信失败更新源sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list换清华源安装ROS Noetic按官网步骤sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.listsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE886847RAA9AF4C4946sudo apt update sudo apt install ros-noetic-desktop-full初始化ROS环境echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc安装依赖sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential初始化rosdepsudo rosdep init rosdep update创建工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make source devel/setup.bash安装鱼香ROSwget https://gitee.com/roswiki/fishros/raw/master/install.sh bash install.sh选择“ROS Noetic Ubuntu 20.04”验证安装roscore后台运行rosrun rospy_tutorials talker.py另开终端rostopic list应见/chatter证明ROS通信正常。这10步必须手敲不可用脚本一键包——因为每一步的报错信息如rosdep密钥过期、apt源404都是排查后续问题的线索。我见过有人跳过第3步换源结果apt install卡在ros-noetic-navigation下载耗时2小时。4.2 RPLIDAR A3驱动部署三行命令点亮激光雷达硬件连接A3 USB线接树莓派USB2.0口非USB3.0雷达开关拨至ON绿色指示灯常亮安装驱动cd ~/catkin_ws/src git clone https://github.com/robopeak/rplidar_ros.git cd ~/catkin_ws catkin_make权限配置sudo usermod -a -G dialout $USER重启树莓派确保当前用户有USB设备权限测试驱动roslaunch rplidar_ros rplidar.launch若终端输出[INFO] ... RPLIDAR is connected则成功验证数据rostopic hz /scan应显示average rate: 10.000rostopic echo /scan/ranges[0]应为有效数值非inf或nan。注意若roslaunch报错Failed to open serial port执行ls -l /dev/ttyUSB*若显示crw-rw---- 1 root dialout则权限正确若为crw-rw---- 1 root root则sudo usermod -a -G dialout $USER未生效需重启。这是90%初学者卡住的第一关。4.3 DWA导航栈配置复制粘贴就能跑的最小可行配置在~/catkin_ws/src下创建my_robot包cd ~/catkin_ws/src catkin_create_pkg my_robot rospy roscpp std_msgs geometry_msgs nav_msgs tf在my_robot/launch中新建dwa_nav.launchlaunch node pkgrobot_state_publisher typerobot_state_publisher namerobot_state_publisher outputscreen param namepublish_frequency value50.0/ /node include file$(find turtlebot3_navigation)/launch/move_base.launch/ node pkgdwa_local_planner typedwa_planner_ros namedwa_planner outputscreen/ /launch在my_robot/cfg中放dwa_local_planner_params.yaml内容见3.4节关键参数DWAPlannerROS: acc_lim_x: 0.8 acc_lim_y: 0.0 acc_lim_theta: 3.2 max_vel_x: 0.3 min_vel_x: 0.05 max_vel_theta: 1.0 min_vel_theta: -1.0 yaw_goal_tolerance: 0.05 xy_goal_tolerance: 0.1 sim_time: 0.7 path_distance_bias: 32.0 goal_distance_bias: 24.0 occdist_scale: 0.01 forward_point_distance: 0.325 stop_time_buffer: 0.2 scaling_speed: 0.25 max_scaling_factor: 0.2然后cd ~/catkin_ws catkin_make source devel/setup.bash。启动命令roslaunch my_robot dwa_nav.launch。此时rviz中添加RobotModel和LaserScan应见小车模型和激光点云。若/cmd_vel无输出检查move_base是否报错The origin for the sensor at (0.0, 0.0, 0.0) is out of map bounds——这意味着map坐标系未加载需先运行roslaunch turtlebot3_navigation turtlebot3_navigation.launch加载地图。4.4 实车电机控制实现Python PID闭环代码实录在my_robot/src中新建motor_control.py#!/usr/bin/env python3 import rospy from geometry_msgs.msg import Twist from std_msgs.msg import Int32 import pigpio import time class MotorController: def __init__(self): self.pi pigpio.pi() # GPIO setup: AIN117, AIN227, PWMA18, BIN122, BIN223, PWMB13 self.pi.set_mode(17, pigpio.OUTPUT) self.pi.set_mode(27, pigpio.OUTPUT) self.pi.set_mode(18, pigpio.HARD_PWM) self.pi.set_mode(22, pigpio.OUTPUT) self.pi.set_mode(23, pigpio.OUTPUT) self.pi.set_mode(13, pigpio.HARD_PWM) self.wheel_base 0.26 # m self.max_vel 0.3 # m/s self.pwm_freq 1000 self.pi.hardware_PWM(18, self.pwm_freq, 0) self.pi.hardware_PWM(13, self.pwm_freq, 0) rospy.Subscriber(/cmd_vel, Twist, self.cmd_vel_callback) rospy.loginfo(Motor controller initialized) def cmd_vel_callback(self, msg): # Convert twist to PWM linear_x msg.linear.x angular_z msg.angular.z left_vel linear_x - angular_z * self.wheel_base / 2 right_vel linear_x angular_z * self.wheel_base / 2 # Clamp to max velocity left_vel max(-self.max_vel, min(self.max_vel, left_vel)) right_vel max(-self.max_vel, min(self.max_vel, right_vel)) # Convert to PWM (0-255) left_pwm int(255 * abs(left_vel) / self.max_vel) right_pwm int(255 * abs(right_vel) / self.max_vel) # Set direction if left_vel 0: self.pi.write(17, 1); self.pi.write(27, 0) else: self.pi.write(17, 0); self.pi.write(27, 1) if right_vel 0: self.pi.write(22, 1); self.pi.write(23, 0) else: self.pi.write(22, 0); self.pi.write(23, 1) # Set PWM self.pi.hardware_PWM(18, self.pwm_freq, left_pwm * 10000) self.pi.hardware_PWM(13, self.pwm_freq, right_pwm * 10000) if __name__ __main__: rospy.init_node(motor_controller) mc MotorController() rospy.spin()保存后chmod x motor_control.py运行rosrun my_robot motor_control.py。此代码直接解析/cmd_vel无中间ROS节点延迟5ms。注意pigpio需提前安装sudo apt install pigpio python3-pigpio且sudo systemctl start pigpiod。4.5 全流程联调从Gazebo到实车的无缝切换联调不是顺序执行而是分层验证传感器层rostopic hz /scan确认激光数据在线TF层rosrun tf view_frames生成PDF检查map→odom→base_link→laser链完整规划层rostopic echo /move_base/cmd_vel发布2D Nav Goal观察/cmd_vel是否输出非零值执行层rostopic echo /cmd_vel与rostopic hz /scan同屏显示确认两者频率一致实车层小车通电roslaunch my_robot dwa_nav.launchrviz中设Goal小车应启动。若某层失败立即隔离例如/cmd_vel有输出但小车不动则问题在电机控制层检查motor_control.py日志若/scan无数据则回溯RPLIDAR驱动。我坚持“一层一验证”拒绝“全堆一起调”因为树莓派资源有限多节点并发会让问题相互掩盖。5. 常见问题与独家排查技巧那些手册里不会写的“踩坑实录”5.1 Gazebo仿真卡顿不是性能问题而是显卡驱动冲突现象rviz中