基于ROS2的四轮差速机器人运动控制与自主导航仿真全流程解析
简介本资源是一套面向ROS2初学者与机器人算法学习者的四轮差速机器人仿真系统实践方案聚焦运动控制与自主导航两大核心能力训练适用于高校课程设计、科研验证及个人项目开发等场景。资源包共109个文件涵盖33个Python节点脚本含控制器、导航插件与数据处理逻辑、10个Xacro宏文件用于模块化URDF建模、9个XML配置含launch与URDF主文件、5个YAML参数文件Nav2代价地图与行为树配置以及STL机械模型、SDF世界文件和RViz可视化配置等完整支撑Gazebo仿真环境搭建、多传感器融合与Nav2导航栈部署。压缩包仅146KB结构精炼无冗余依赖便于快速导入与复现。目前已有234人学习下载提供从URDF建模→Gazebo物理仿真→激光雷达IMU数据接入→SLAM建图→Nav2路径规划的全链路可运行代码与配置附带CSV标定数据与C自定义控制器实现是理解ROS2机器人系统集成的高性价比入门实践素材。 最近帮几个朋友调四轮差速机器人的仿真发现大家卡的步骤都很相似URDF建完模型在Gazebo里成了一摊死肉或者明明建出了地图导航却到处乱窜。我一直觉得ROS2机器人开发的重点不在工具链本身而在于把坐标系、数据流和物理参数这些底层逻辑吃透。这篇内容围绕基于ROS2的四轮差速机器人运动控制与自主导航仿真系统展开带你从Gazebo环境搭建、URDF建模到激光雷达与IMU传感器集成、SLAM建图与Nav2自主导航全流程走一遍里面所有方案都是我实测过、能直接复现的新手照着做就行有基础的也能补上一些平时容易忽略的细节。1. 项目定位与系统架构先把路线图画清楚1.1 为什么选四轮差速 ROS2 Gazebo这套组合很多想入门移动机器人的朋友一上来就纠结要不要上底盘硬件。我的建议是先花两周时间把仿真玩明白成本低、试错快而且ROS2的应用层代码在仿真和真机上几乎是通的后面切硬件就是改改驱动接口的事。四轮差速底盘在工程里非常流行结构简单、承载能力强室内巡检、物资搬运、服务机器人几乎都在用。本质上是左右两侧轮子独立驱动通过两侧转速差实现直行、转弯和原地旋转。相比麦克纳姆轮和全向轮四轮差速在Gazebo里的物理模型更稳定运动学推导也直观非常适合作为第一个仿真项目。ROS2选的Humble版本Gazebo用的经典Gazebo 11和新版Gazebo SimFortress/Harmonic相比资料更多、踩坑方案更全。这套组合稳定相关教程和插件文档都很成熟。导航侧用的是slam_toolbox加Nav2这是当前ROS2生态下最主流的建图导航方案。1.2 整体软件架构和核心数据流动手写代码前先把系统的数据流理清后面调试会省很多事。整个仿真系统分四层模型层URDF文件描述机器人的外形、质量、惯性、碰撞体积和关节结构同时通过gazebo插件挂载差速驱动、激光雷达和IMU传感器。仿真层Gazebo负责物理引擎计算发布传感器数据、关节状态和里程计信息。控制层运动控制节点接收/cmd_vel指令转换成左右轮速并发布到仿真关节同时发布/TF变换和/odom里程计。导航层slam_toolbox负责建图和定位Nav2负责全局路径规划、局部避障和速度指令输出。关键话题和坐标系对应关系如下话题/坐标系作用数据来源/odom里程计机器人相对起点的位姿估计Gazebo差速插件或小车轮速推算/scan2D激光雷达数据Gazebo雷达插件/imu惯性测量单元数据Gazebo IMU插件/cmd_vel速度控制指令线速度角速度键盘遥控或Nav2输出tfodom→base_footprint→laser各传感器和底盘间的坐标变换模型静态TF 里程计动态TF这套架构里有个关键点导航靠的是感知 定位 规划闭环不是单独一个节点就能完成的。激光雷达提供环境感知IMU提供高频姿态修正短时间的平移旋转漂移抑制里程计提供连续位姿slam_toolbox再用激光帧配准优化出全局一致的地图。每一步都依赖上游数据质量所以后面我会花大篇幅讲传感器参数怎么配置才不坑队友。2. URDF建模与Gazebo环境搭建模型是仿真地基2.1 URDF建模核心要点从车体到关节URDFUnified Robot Description Format是ROS2标准模型描述格式。别看它就是个XML文件里面每个参数都直接影响仿真物理效果。四轮差速底盘的URDF最少要包含这些元素车体link底盘外壳定义视觉网格、碰撞体、质量和惯性矩阵。四个轮子link左右各两个通常用圆柱体碰撞几何和视觉几何一致。四个连续关节continuous joint轮子绕y轴旋转连接轮子和底盘。雷达和IMU的link可以用小圆柱或盒子表示挂在底盘顶部。固定关节fixed joint把雷达、IMU和底盘固定起来。给大家一个简化底盘链接段的参考写法要点link namebase_link visual geometry box size0.5 0.35 0.12/ /geometry material nameblue/ /visual collision geometry box size0.5 0.35 0.12/ /geometry /collision inertial mass value10.0/ origin xyz0 0 0 rpy0 0 0/ inertia ixx0.15 ixy0 ixz0 iyy0.1 iyz0 izz0.15/ /inertial /link这里最容易被忽略的是inertial里的惯性矩阵。如果缺失或数值不合理Gazebo会出现奇怪抖动甚至机器人直接起飞。矩阵在纯理论上是关于质心的转动惯量张量你不一定要精确到实物的转动惯量但至少数量级要对质量10kg的长方形底盘ixx/izz填0.1~0.3这个量级太大会导致转向迟钝太小会抖动。轮子部分的核心是连续关节。注意在Gazebo里要让轮子真正转动光有URDF还不够必须配上传动transmission配置把关节和驱动电机绑到一起。这点我在下一节展开。2.2 在URDF中配置Gazebo属性摩擦、传动和差速驱动URDF本身只描述模型的运动学和外观物理属性摩擦、阻尼需要通过gazebo标签额外配置。这个是新手的重灾区。首先是摩擦系数。轮子和地面的摩擦系数决定机器人能不能正常走直线、转弯会不会打滑。在轮子的每个link里加一个gazebo标签gazebo referenceleft_front_wheel mu11.0/mu1 mu21.0/mu2 kp100000.0/kp kd100.0/kd fdir11 0 0/fdir1 /gazebomu1和mu2分别是纵向和侧向摩擦系数对于四轮差速底盘侧向摩擦通常要设得比纵向大不然转弯时车子会横着漂。kp、kd是Gazebo处理接触的刚度和阻尼数值太小会导致车身陷入地面。然后是最关键的差速驱动插件。有两种主流方案一种用经典的gazebo_ros_diff_drive插件另一种用ROS2 Control框架。入门阶段我强烈推荐先用gazebo_ros_diff_drive插件配置简单一个插件搞定里程计和轮速控制gazebo plugin namediff_drive filenamelibgazebo_ros_diff_drive.so ros namespace//namespace /ros update_rate50/update_rate left_jointleft_front_wheel_joint/left_joint left_jointleft_back_wheel_joint/left_joint right_jointright_front_wheel_joint/right_joint right_jointright_back_wheel_joint/right_joint wheel_separation0.35/wheel_separation wheel_diameter0.08/wheel_diameter max_wheel_torque20/max_wheel_torque max_wheel_acceleration5.0/max_wheel_acceleration command_topiccmd_vel/command_topic odometry_topicodom/odometry_topic odometry_frameodom/odometry_frame robot_base_framebase_footprint/robot_base_frame /plugin /gazebo注意两个容易踩的坑。第一wheel_separation是左右轮的轮距不是轴距单位是米填错会导致转弯半径完全不对。第二这里的robot_base_frame要和你TF树里的base_footprint一致。如果模型根节点明明叫base_link而这里填了base_footprint导航系统会更早地开始报错。为什么这里要选差速插件而不是自己手写轮速控制因为gazebo_ros_diff_drive插件内部已经实现了轮速PID跟踪输入是/cmd_vel速度指令它会自动算好左右轮目标转速再控制关节省掉大量底层调试。我见过很多同学卡在机器人不动的问题其实一半是插件配置错了一半是PID没调好。2.3 Gazebo仿真环境搭建从零构建测试场地模型建好后需要一个环境。Gazebo环境有两种做法直接用自带的empty world适合快速验证能不能动或者用Building Editor画一个房间适合后面测试导航。我建议在项目里建一个专门放世界的目录用world文件描述环境。一个最简单有效的导航测试场地包括平坦地面 一些障碍物 周围墙壁。可以用现成的模型比如Gazebo里自带的柱子、箱子也可以用Fusion/SketchUp建模后导入但新手最方便的还是直接在world文件里用include引入已有的模型。sdf version1.7 world namerobot_world include urimodel://sun/uri /include include urimodel://ground_plane/uri /include !-- 添加一些障碍物 -- include urimodel://cafe_table/uri nametable1/name pose2.0 1.0 0 0 0 0/pose /include /world /sdf这里有个现实建议如果只是练导航别一开始就建一个巨大或弯弯绕绕的复杂地图。先用一两个规则的障碍物练点对点导航再逐级增加复杂度。仿真环境下地图太乱排查起来你会分不清是算法问题还是地图问题。另外Gazebo的世界坐标系world frame和机器人的odom frame要通过一个world到map的转换衔接。实际上在纯仿真里odom和map往往重合但Nav2框架仍然需要正确配置才能工作。环境启动后一定要在RViz2里查看TF树是否完整。3. 运动控制差速模型、PID与遥控调试3.1 差速运动学模型推导两行公式说清楚四轮差速的运动学简化为左右轮两个速度的组合。设机器人底盘中心线速度为v角速度为ω左右轮平均线速度分别为v_l和v_r轮距为d则有v (v_l v_r) / 2ω (v_l - v_r) / d反过来已知目标速度和角速度左右轮速度v_l v - (ω * d) / 2v_r v (ω * d) / 2如果轮子半径为r轮的角速度再除以r。这两组公式就是整个差速控制系统的基础也是里程计推算的本质。你只要订阅了/cmd_vel用这套公式就能自己算里程计理解这一点后面读gazebo_ros_diff_drive插件源码或自己写底盘驱动都会很轻松。还要懂得一个概念圆弧运动半径R。执行导航指令时机器人需要平滑地做圆弧运动而不是瞬间转向R v / ω。如果你键盘遥控时按了前进同时转大弯你会发现它在Gazebo里画了一个漂亮的圆弧这正是四轮差速底盘正常的表现。如果R为0只有转向没有前进它就原地旋转。3.2 让机器人动起来启动launch文件的完整流程模型和插件配好后需要把URDF加载到参数服务器再启动Gazebo并生成机器人。推荐用ROS2 launch文件统一管理这一步可以一站式解决模型加载 世界启动 节点启动。一个典型的启动流程是import launch import launch_ros from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from launch_ros.substitutions import FindPackageShare def generate_launch_description(): gazebo IncludeLaunchDescription( PythonLaunchDescriptionSource([ FindPackageShare(gazebo_ros), /launch/gazebo.launch.py ]), launch_arguments{world: src/my_robot/worlds/test.world}.items() ) spawn launch_ros.actions.Node( packagegazebo_ros, executablespawn_entity.py, arguments[-topic, robot_description, -entity, my_robot], outputscreen ) return launch.LaunchDescription([gazebo, spawn])关键点spawn_entity.py通过-topic robot_description从话题获取URDF模型所以在这之前必须把URDF内容发布到/robot_description话题。我用的是一个robot_state_publisher节点它会自动发布TF静态变换和机器人描述。顺序搞错的话Gazebo里半天看不到模型。启动后用teleop_twist_keyboard发送速度指令ros2 run teleop_twist_keyboard teleop_twist_keyboard按键盘上的i/j/l等键机器人应该能前后左右动起来。如果不动先检查Gazebo里的轮子是否在转动再看/cmd_vel话题有没有消息到达。我见过很多次机器人不动排查了一圈发现键盘遥控节点连的是/cmd_vel_teleop而差速插件订阅的是/cmd_vel话题没对上。3.3 遥控与实测调参经验第一次让机器人动起来建议大家做两个实验顺便标定底盘参数。实验一直线测试。向前遥控2秒看机器人是不是走直线。如果往一侧偏说明左右轮子速度不一致或者摩擦参数不均匀。在Gazebo里最常见的原因是左右轮摩擦系数设置不同或者惯性矩阵不对称。实验二旋转测试。原地旋转90度看实际转过的角度和指令是否一致。如果转多了或转少了多半是wheel_separation参数不对。用公式反推实际转过角度和理论角度比例就是轮距误差比例修正URDF后重试。调差速插件里的PID参数主要是max_wheel_torque和max_wheel_acceleration。如果机器人启动瞬间猛窜把max_wheel_acceleration调小让轮子加速更平缓如果转弯时轮子打滑适当减小max_wheel_torque注意别太小否则爬坡和加速就没力了。这个参数的选择是个权衡我在真机上也发现太大的加速度会让轮子瞬间超越地面摩擦极限直接打滑里程计就开始漂。4. 传感器集成激光雷达与IMU的完整接入4.1 在URDF中挂载雷达和IMU插件传感器是导航系统的眼睛和前庭没有它们Nav2就完全瞎了。激光雷达和IMU在Gazebo里都是通过gazebo插件模拟的URDF里只需要定义传感器的link和joint然后绑定对应插件。雷达link一般挂在底盘中心上方用一个小圆柱表示固定关节连接到底盘link namelaser_link visual geometrycylinder radius0.04 length0.03//geometry /visual collision geometrycylinder radius0.04 length0.03//geometry /collision /link joint namelaser_joint typefixed parent linkbase_link/ child linklaser_link/ origin xyz0 0 0.15/ /joint然后挂gazebo_ros_ray_sensor插件3D雷达或gazebo_ros_laser2D雷达。最常用的2D激光雷达配置gazebo referencelaser_link sensor typeray namelaser_sensor pose0 0 0 0 0 0/pose update_rate10/update_rate ray scan horizontal samples360/samples resolution1.0/resolution min_angle-3.14159/min_angle max_angle3.14159/max_angle /horizontal /scan range min0.12/min max10.0/max resolution0.01/resolution /range /ray plugin namelaser_controller filenamelibgazebo_ros_ray_sensor.so ros remapping~/out:scan/remapping /ros output_typesensor_msgs/msg/LaserScan/output_type frame_namelaser_link/frame_name /plugin /sensor /gazebo这里update_rate我设的是10Hz实际中要协调好雷达频率太低SLAM匹配数据不足太高CPU占用大。10Hz是2D建图的常用值。samples是扫描点数360个表示1度一束太少会看不清细障碍物太多增加计算量这个值对slam_toolbox影响比较大。IMU插件配置相对简单挂在底盘中心gazebo referenceimu_link sensor typeimu nameimu_sensor update_rate100/update_rate plugin nameimu_controller filenamelibgazebo_ros_imu_sensor.so ros remapping~/out:imu/remapping /ros frame_nameimu_link/frame_name /plugin /sensor /gazebo我的经验是IMU更新率尽量高一点100Hz以上因为它在滤波和状态估计里主要提供高频短期精确姿态频率太低反而拖累整体估计。4.2 传感器噪声建模为什么真实感很重要很多新手忽略了一个关键点真实传感器是有噪声的。Gazebo默认的传感器输出是完美无瑕的但用这样的数据调出来的SLAM和Nav2拿到真机上就是灾难。在雷达插件里加入Gaussian噪声noise typegaussian/type mean0.0/mean stddev0.01/stddev /noiseIMU同样可以加噪声和bias。这是仿真到实物迁移中最重要的一步也是从玩具仿真走向工程仿真的分水岭。但是噪声也不能加得太过分。我见过有人把激光雷达噪声stddev设到0.1结果跑slam_toolbox建图直接发散调了一晚上以为算法有问题最后发现是噪声参数离谱。真实雷达的噪点通常远小于0.1新手建议从0.005开始逐步往上加同时用RViz2实时观察激光点云的稳定性。4.3 用RViz2验证传感器数据与坐标变换传感器集成的第一件事不是赶紧建图而是先打开RViz2检查三件事雷达话题是否有数据点云/线条是否正常IMU话题是否发布姿态数据是否平稳TF树是否完整特别是laser_link、imu_link到底盘和odom的变换有没有漂移RViz2添加LaserScan显示Fixed Frame设置为odom主题选择/scan。如果看到雷达数据围绕机器人中心一圈说明坐标变换是对的。如果雷达数据位置偏了或者角度不对几乎可以肯定是TF树问题检查URDF中激光雷达link到base的joint origin是否正确。有一个我强烈推荐的调试习惯用ros2 run tf2_tools view_frames生成TF树PDF一眼看出哪两个frame之间没有连接。NAV2启动后如果提示Could not get transform之类的警告基本都是TF树问题。IMU验证更直观把机器人放在平整地面RViz2里观察/imu话题的角速度和线性加速度理论上几乎为0除了重力在z轴约9.8。如果数据波动大检查惯性参数和IMU噪声配置。这个方法在真机上同样是第一排查手段。5. 自主导航SLAM建图与Nav2实际跑通5.1 用slam_toolbox完成建图SLAMSimultaneous Localization and Mapping解决两个问题我在哪周围环境长什么样。在室内2D激光雷达场景中slam_toolbox已经是ROS2的标配相比老一代gmapping它的回环检测和长期建图效果好很多。启动slam_toolbox前必须先把机器人放到环境中遥控走一圈让激光雷达扫到环境细节。这里有个关键问题如果你在Gazebo里跑先开着Gazebo环境再启动slam_toolbox并订阅/scan建图过程中要匀速慢行避免急加速急转弯急转弯会造成激光帧间匹配失败地图错位。这是slam_toolbox参数minimum_travel_distance和minimum_travel_heading控制的关键帧取法直接相关的。slam_toolbox的在线建图配置核心参数slam_toolbox: ros__parameters: use_sim_time: true odom_frame: odom map_frame: map base_frame: base_footprint scan_topic: /scan mode: mapping resolution: 0.05 max_laser_range: 10.0 minimum_travel_distance: 0.05 minimum_travel_heading: 0.02 loop_match_minimum_chain_size: 3分辨率0.05表示每个栅格5cm是室内建图的常用值。太细0.02会明显增加计算量太粗0.1会丢失细节导致导航路径穿墙。use_sim_time: true这是仿真环境必须加的所有节点都要使用仿真时钟否则传感器数据和导航指令会时间戳错乱Nav2会一直报transform timeout。5.2 Nav2导航堆栈的配置与启动建好地图后进入里程碑环节自主导航。Nav2是一套完整的导航框架包含全局代价地图、局部代价地图、全局规划器、局部规划器、行为树等模块。刚开始接触会觉得很复杂但把它拆开看就清晰了全局规划器planner_server基于全局代价地图计算从当前位置到目标点的最优路径。控制器controller_server执行局部路径规划控制机器人沿路径走并实时避障。代价地图costmap把传感器数据和静态地图融合成网格标注障碍物和未知区域。行为树bt_navigator统筹整个导航任务的执行逻辑。启动Nav2需要把地图传给map_server并启动amcl自适应蒙特卡洛定位确定机器人在已知地图中的位置。amcl的一个重要参数是initial_pose如果Gazebo里机器人起始位姿和map坐标系不一致amcl会定位失败导航指令发出去机器人原地转圈。解决方法是手动在RViz2中用2D Pose Estimate按钮给一个初值或者把initial_pose设为机器人实际生成的位姿。Nav2中最容易出问题的参数是速度限制如果max_vel_x设置得太高机器人会在转弯时打滑里程计漂移直接导致路径跟踪失败。我建议仿真里把max_vel_x设为0.5m/smax_vel_theta设为1.0rad/s先跑稳定再逐步提升。5.3 导航实测与改进导航实测步骤建议按这个顺序走用slam_toolbox建好地图保存为pgmyaml。启动map_server和amcl加载地图。启动Nav2 bringup检查所有服务是否就绪。在RViz2中用Nav2 Goal按钮发布目标点观察路径规划和跟随。如果失败打开代价地图可视化检查障碍物半径、膨胀层参数。常见的问题是目标点设为机器人所在位置它却绕一大圈才走回去。这种一般有三种原因全局代价地图的膨胀半径设太大把通道全堵了导致规划器只能绕远路或者局部控制器参数里max_vel_x和min_vel_x设置没理顺机器人一直在极限工况下走走停停还有可能是TF树里map和odom的变换更新不及时amcl算出来的位姿飘了。一个解决路径太贴墙的实用方法调大全局代价地图中的inflation_radius让规划路径远离障碍物代价是可能会绕路但在仿真里这个取舍非常值得。我在测试时会把inflation_radius从0.3调到0.5机器人立刻从贴墙走变成居中走明显稳定很多。6. 常见问题与排查技巧实录6.1 环境启动和模型加载问题Gazebo启动后是黑屏多半是环境变量或GPU兼容问题。在虚拟机里跑Gazebo确认3D加速已启用同时可以减小环境光照或关闭部分渲染特效。如果报缺模型文件先执行下载模型库的命令把模型缓存到~/.gazebo/models。机器人一出生就沉到地面里URDF里collision几何和visual几何不一致或者地面模型缺失。检查base_link的collision box和轮子的位置关系确保轮子最低点略高于地面例如轮子半径0.04米轮子中心y坐标为0z坐标为0.04这样机器人才能站在地面上。spawn_entity.py报错找不到模型先确认/robot_description话题有没有内容用ros2 topic echo /robot_description --once查看再用ros2 param get /robot_state_publisher robot_description检查参数服务器。模型在RViz2中显示正常但Gazebo里变形Gazebo对URDF的材质和网格兼容性有要求尽量只用Primitive几何box、cylinder、sphere复杂STL网格容易出碰撞体问题。6.2 运动控制相关典型问题机器人完全不动先检查/cmd_vel话题ros2 topic echo /cmd_vel看是否有数据。如果没有键盘遥控节点没接好如果有检查差速插件配置尤其是left_joint和right_joint名字要与URDF完全一致。差速插件有个常见问题四个轮子想用同一个插件控制时有些版本插件只认前轮关节后轮需要单独处理。机器人直线走歪检查左右轮摩擦系数是否一致、轮距是否准确。实际上用URDF建的四轮差速只要左右轮参数对称走偏基本都是wheel_separation或轮径设置不准。轮子原地打滑但不前进底盘太重或者驱动扭矩太小。增大max_wheel_torque或者减小底盘总质量。我见过有人把底盘质量写成了100kg车重得跟坦克一样轮子当然带不动。遥控时转向过猛导致打滑调小键盘节点的最大转向速度或者在差速插件里限制max_wheel_acceleration。对四轮差速来说急打方向是最伤里程计的行为真机和仿真都一样。6.3 传感器与导航相关典型问题RViz2里雷达数据乱转雷达数据坐标系和odom帧变换异常。重点检查雷达插件里的frame_name必须与URDF中laser_link完全一致。UV坐标不一致时雷达数据看起来就像在绕圈。IMU数据全是零或常量IMU插件没有正确收到仿真数据确认sensor typeimu和gazebo reference指向正确的link。有些版本需要同时把IMU加在sensor标签的pose里并设置好imu_link。建图过程中地图逐渐扭曲这是最典型的传感器数据不配合结果。通常原因包括雷达频率和里程计频率不匹配、IMU数据噪声过大、机器人在转弯时速度过快造成scan matching失败。我的排查顺序先降低车速再调小雷达噪声最后检查TF树是否在更新。Nav2收敛但路径总是诡异优先看代价地图尤其膨胀层。在RViz2里打开全局代价地图图层如果障碍物周围都是红圈说明inflation_radius太大。另外检查障碍物层是否正确订阅了/scan、/imu数据如果传感器数据没有进入代价地图机器人就会穿透障碍物。slam_toolbox启动后不发布地图检查use_sim_time是否设置为true。仿真环境里如果不用sim time节点的时间戳和Gazebo时钟不一致地图永远更新不了。这是仿真环境下的经典错误。关于扩展方向的小建议这个仿真系统跑通之后可以继续扩展的方向很多。一个是把差速驱动换成ROS2 Control用ros2_control框架配置硬件接口、PID和控制器管理更接近工业级实现。另一个是接入更精细的传感器模型比如16线激光雷达、深度相机甚至加上gazebo的物体模型做视觉抓取仿真。还有就是把moveit2和Gazebo结合给差分底盘加一个机械臂变成移动操作复合机器人。我在实际调试中体会最深的一点是仿真系统的价值不在于看起来能用而在于把数据流和坐标变换吃透。你花在排查TF树、处理时间戳、配置代价地图上的每一分钟都是在为真机调试积累经验。Gazebo里出问题至少还能看到数据、能慢慢查真机上要是车撞了墙那可就不是重启一下节点那么简单了。最后再分享一个小技巧每次改URDF或传感器参数别急着跑一堆节点先用Gazebo单独启动模型转一转、遥控走一圈确认物理表现正常。我在URDF里加雷达之后机器人突然变得特别肉排查半天发现是雷达link的collision球体太大把轮子前方地面全挡了机器人像个扫雷车一样推着障碍物走。这种低级错误在仿真里多犯几次以后真机调试就少走一大截弯路。本文还有配套的精品资源点击获取

相关新闻

最新新闻

日新闻

周新闻

月新闻