资讯动态

机器人系统设计拆解:从感知决策到小车平台搭建

发布时间:2026/10/21 10:16:35 来源:尧图企业网站定制
做机器人这几年我最大的感受是机器人这个行当说到底是计算机科学和自动化工程的交汇点。你写出来的每一个控制指令最终都要变成电机轴上实实在在的转动传感器读回来的每一个数据又都要经过算法处理才能变成决策依据。这是计算机科学与自动化系列文章的第十二篇从这一篇开始我们正式进入机器人主题。这篇文章不打算从那些高大上的机器人定义讲起而是直接从工程实践视角拆解一个完整机器人系统的构成、核心技术点和落地路径。我会把感知、决策、执行三大环节掰开揉碎最后给出一套可以动手复现的小车平台方案。适读人群有两类一类是学完编程和自动控制原理、想往机器人方向深入的学生另一类是工作中需要快速上手机器人项目的工程师。1. 机器人系统的整体设计思路拆解1.1 从五层架构理解机器人系统我习惯把机器人拆成五层来看这个框架帮我解决过很多不知道从哪下手的困惑。第一层是本体结构层。就是机器人的物理骨架小车底盘、机械臂的关节连杆、四足机器人的腿都算这一层。结构设计决定了负载能力、运动空间和精度上限虽然搞软件的人常常忽略它但改结构往往比改算法更有效。第二层是传感器感知层。这是机器人的感官常见的有编码器里程计、惯性测量单元IMU、超声波测距模块、激光雷达和摄像头。这一层的核心矛盾在于传感器数据是后续所有决策的依据但每一类传感器都有各自的局限和噪声。第三层是控制决策层。相当于大脑通常跑在一块主控芯片上。可能是STM32这样的微控制器也可能是树莓派、Jetson这类微型计算机具体看算力需求。这一层接收传感器数据运行控制算法输出运动指令。第四层是驱动执行层。负责把电信号转化为机械运动。直流减速电机加编码器是移动机器人最主流的选择机械臂关节多用伺服电机或步进电机。第五层是人机交互与通信层。负责与外界交换信息调试时的串口和Wi-Fi、生产环境里的工业总线和以太网都归这一层管。理解这五层划分的价值在于出问题时你能快速定位——到底是感知出了问题、决策逻辑写错了还是执行机构没跟上。我见过不少新手一上来就扎进某个算法细节里结果连机器人在原地打转是因为左右轮子转速不一致这种底层问题都没发现白白浪费大量时间。1.2 计算机科学与自动化的交汇点传统自动控制理论处理的是给定系统模型设计控制器让输出跟踪目标的问题经典PID、状态空间设计、频域分析都是这套框架。而现代机器人系统面临的场景已经远远超出传统控制理论能精确建模的范围——非结构化环境、多传感器融合、动态障碍物、未知地形这些都需要计算机科学的方法来补充。从这个角度看机器人方向的核心能力可以拆成两条线。一条是控制线系统建模、状态估计、控制器设计、参数整定需要扎实的数学和自动控制功底。一条是计算线传感器数据处理、位姿估计、路径规划、决策规划本质上是算法和数据结构的问题。真正落地项目的时候这两条线是缠在一起的。比如写一个PID控制器得先通过编码器计算当前轮速这涉及传感器数据滤波和坐标变换再比如写路径规划算法最终输出的轨迹还得交给底层控制器去跟踪如果跟踪效果不好规划得再优美也没用。所以我一直建议别把自己局限在我是搞算法的或者我是搞硬件的这种标签里两条线最好都能打通。2. 核心技术解析与选型思路2.1 感知层的传感器原理与数据融合先说最常用的几个传感器因为它们是后面所有算法的基础。编码器里程计的原理是增量式编码器输出两路相位差90度的脉冲信号通过判断AB相的先后顺序确定旋转方向通过脉冲计数算出旋转角度再乘以轮径得到移动距离。原理很简单但工程上有几个坑一是轮子打滑时里程计读数不可信二是编码器分辨率决定了最小测量精度三是累计误差会随着运行时间不断增大。所以纯里程计定位只适合短距离场景。IMU一般包含三轴加速度计和三轴陀螺仪。它的特点是短时间内精度高、长时间会漂移。加速度计静止时能感知重力方向可以用来求姿态角陀螺仪积分可以得到角度增量但积分过程会引入漂移。实际工程中常用互补滤波或卡尔曼滤波把两者融合用加速度计修正陀螺仪的漂移。超声波测距模块的原理是发射超声波、接收回波根据时间差计算距离。结构简单、成本低、对光线变化不敏感适合做近距离避障。但它的测量波束角比较宽精度一般对软性吸音材料的效果很差。激光雷达分两类三角测距法和飞行时间法ToF。三角测距的成本低适合室内小范围建图ToF雷达价格高、抗干扰能力强适合户外和长距离场景。激光雷达是SLAM建图的主力传感器因为它直接提供高精度的距离和角度信息数据格式简洁后续算法处理方便。摄像头信息量最大但处理难度也最大。视觉传感器输出的是图像数据要做目标检测、语义分割等任务就得跑深度学习模型对算力要求高。实际项目很少只用一种传感器基本都是多传感器融合。比如小车底盘用里程计加IMU做短时位姿估计再用激光雷达或摄像头做外部观测把两者的结果通过扩展卡尔曼滤波或粒子滤波融合起来。核心思想是每种传感器都有自己的短板但它们的优势往往是互补的。2.2 决策层的控制算法与路径规划决策层的核心任务说白了就是三件事我在哪我要去哪我怎么去。我在哪是定位问题。环境地图已知时可以用蒙特卡洛定位这类方法通过粒子滤波不断用激光雷达观测修正位姿估计。地图未知时就得做同时定位与建图也就是SLAM在建图的同时估计自身位置。经典方案有基于滤波的Gmapping和基于图优化的Cartographer。我要去哪是路径规划问题。全局层面用A*或Dijkstra算法在地图上找一条从起点到终点的可通行路径局部层面处理动态障碍物经典方法叫动态窗口法DWA在速度空间中采样一组可行的线速度和角速度用评价函数挑出最优轨迹。我怎么去是轨迹跟踪问题。规划算法给出的是路径点或参考轨迹控制器要让它执行出来。常用方法有纯追踪Pure Pursuit和模型预测控制MPC。纯追踪的思路很直观找机器人当前位置前方特定距离处的参考点计算出需要的转角让机器人朝那个点追过去。MPC更复杂每个控制周期内基于系统模型预测未来一段时间的状态通过优化求解出一组最优控制量效果更好但计算量也大得多。贯穿这些算法始终的一个基础控制算法是PID它在工业界应用最广没有之一。PID输出由三项构成比例项对应当前误差积分项累积历史误差消除稳态误差微分项预测误差变化趋势抑制超调。基础代码长这样class PIDController: def __init__(self, kp, ki, kd, dt): self.kp kp self.ki ki self.kd kd self.dt dt self.integral 0.0 self.last_error 0.0 def update(self, target, current): error target - current self.integral error * self.dt derivative (error - self.last_error) / self.dt output self.kp * error self.ki * self.integral self.kd * derivative self.last_error error return output这个版本只能算基础框架工程上还得做积分限幅、微分低通滤波、输出限幅等处理后面实操部分我会细讲。2.3 执行层的电机驱动与运动控制执行层是最终落地的环节。移动机器人最常见的是直流减速电机加编码器机械臂关节则常用伺服电机或步进电机。直流减速电机调速的主流方案是PWM加H桥电路。PWM调节平均电压进而调节转速H桥控制电流方向进而控制正反转。这里有个关键细节PWM占空比和转速不是线性关系因为电机静摩擦和死区效应会导致占空比太低时不转。所以实际控制必须配合编码器做闭环不能开环直接给占空比。常见驱动芯片有TB6612、L298N更专业的会用带电流反馈的驱动模块方便做力矩控制。电流反馈的价值在于通过检测电流估算电机力矩判断机器人是否遇到障碍或负载异常。步进电机在机械臂关节上很常见特点是开环就能精确控制角度但转速高时力矩会下降而且可能丢步。伺服电机自带编码器和驱动控制精度高、动态响应快价格也贵不少。运动模型本质上就是坐标变换。差速底盘的运动学模型很简单左右轮速度的平均值决定前进线速度左右轮速度的差决定转向角速度。代码表达如下def differential_drive(vx, wz, wheel_base, wheel_radius): v_left (vx - wz * wheel_base / 2) / wheel_radius v_right (vx wz * wheel_base / 2) / wheel_radius return v_left, v_right反过来通过左右轮编码器读数也能推算机器人位姿变化这就是前向运动学。两个方向都要会算分别对应指令下发和状态估计。3. 实操从零搭建一台可运行的小车平台3.1 硬件选型清单纸上谈兵讲了这么多这节我们落地。以一台室内差速底盘小车为例给出一份可以直接照抄的硬件清单部件型号方向说明底层主控STM32F103系列负责运动控制和传感器采集算法处理器树莓派4B跑视觉、导航等重负载算法电机带霍尔编码器的直流减速电机额定12V减速比1:30驱动TB6612模块双路H桥适配小功率电机传感器超声波模块 六轴IMU基础避障与姿态估计雷达单线激光雷达入门级即可做SLAM用电源12V锂电池组 稳压模块分压给主控和树莓派供电这套选型的逻辑STM32负责实时性要求高的底层任务比如PWM生成、编码器计数它便宜、资源丰富、坏了不心疼树莓派承担计算量大的任务比如激光雷达数据处理和路径规划Linux环境开发效率高。两个板子间用串口通信树莓派发速度指令STM32执行并回传状态。3.2 软件框架与通信协议设计软件层面建议先定通信协议再写功能代码。串口通信的简单协议可以这样设计帧头 数据长度 消息类型 数据 校验位。比如树莓派向STM32下发速度指令数据帧格式为0xAA 0x06 0x01 0x00 0x64 0x00 0x0A 0xXX拆开解释0xAA是帧头0x06是后面数据的长度0x01表示这是速度控制指令0x00 0x64是线速度数值0x00 0x0A是角速度数值最后的0xXX是前面所有字节的校验和。校验必须做——串口通信偶尔会丢字节没有校验一个错误数据可能让机器人突然猛冲。STM32端解析是一个经典有限状态机先找帧头再按长度字段读取完整一帧校验通过后解析数据。树莓派端用Python的serial库发送数据加时间戳记录方便排查通信延时。3.3 底层运动控制的实现底层做的核心就三件事编码器读数、速度闭环控制、PWM输出。编码器读数用定时器的编码器模式STM32定时器硬件支持AB相计数配置好之后自动累加主循环里读取当前计数值乘以编码器线数和减速比换算成轮子转速即可。速度闭环用前面写的PID控制器控制周期设10毫秒比较合适。目标速度来自串口接收的指令反馈速度来自编码器计算PID输出映射到PWM占空比。这里有个非常关键、也特别容易被新手忽视的细节PWM方向处理。电机要能正反转所以PID输出是一个带符号的值正值正转、负值反转。驱动时输出大于零就设置方向引脚为正向PWM占空比取输出绝对值小于零就反转方向引脚。我见过不少初学者把方向引脚和PWM引脚混在一起处理结果要么往一个方向偏要么占空比恒为正导致无法反转。3.4 PID参数整定的实操经验PID参数整定是机器人调试里最磨人的环节没有之一。网上的Ziegler-Nichols整定法可以用但我实际调试中用得更多的是一套土办法。第一步只保留比例项Ki和Kd设为0。从小到大调Kp观察编码器反馈的转速曲线。Kp太小时转速到不了目标值残差大Kp增大过程中转速会逐渐接近目标值但开始出现超调。第二步在响应速度和超调之间找平衡点记下这个Kp。然后加积分项Ki从很小值开始慢慢加。积分作用是消除稳态误差但Ki太大系统会出现低频振荡转速忽高忽低。第三步加微分项Kd从小到大试。微分项提前抑制误差增大趋势、减少超调但Kd太大会对噪声极其敏感——转速稍有波动输出就剧烈抖动电机声音都会变难听。我常用的参考值范围对12V直流减速电机小车控制周期10msKp在20到50之间Ki在5到15之间Kd在0.5到2之间。不同机械结构差异很大只能作为起点不要直接照搬。4. 常见问题与排查技巧实录4.1 传感器数据抖动问题超声波模块读数跳变是高频问题。遇到别急着写滤波算法先检查硬件接线。Trig和Echo引脚离电机驱动太近的话电机启动瞬间的大电流会在电源线上产生干扰脉冲导致模块收到假回波。解决思路把传感器供电和电机供电分开用独立稳压模块给传感器供电或者给供电线加一个104电容滤波。我实际调试的第一台机器人就踩过这个坑。超声波测距值在20到80厘米之间乱跳我写了半天滤波算法最后才发现是电源干扰。把电源分开之后原始数据自己就稳定了。那次经历给我的教训是排查问题一定从最底层开始先排除硬件和电源再谈软件滤波。IMU数据也有典型问题。陀螺仪零漂会随温度变化开机后别急着用数据先放置10到30秒让IMU内部稳定再做校准。另外IMU要尽量安装在机器人几何中心附近离电机远一些否则电机震动会直接污染传感器数据。4.2 PID参数整定失败的深层原因PID整定失败很多时候不是参数问题而是基础环节出错。我列几个最常见的电机极性接反左右电机接线不一致导致指令方向和编码器反馈方向相反。闭环一跑输出越来越大电机直接飙到满速。排查方法是开环给一个小PWM确认电机转动方向和编码器计数方向一致。编码器脉冲数和轮径参数错误转速计算单位不对PID怎么调都稳定不了。排查方法是拿秒表测实际跑10秒的距离反推轮径参数。控制周期不稳定主循环里如果做其他重计算控制周期忽长忽短PID效果会严重劣化。解决办法是把PID运算放到定时器中断里固定周期执行或者改用实时操作系统的定时任务。4.3 通信调试的坑树莓派和STM32之间的串口通信最常踩的坑是数据粘包和半包。粘包出现在接收端处理速度比发送端慢、一帧没来得及读就有下一帧到来的时候半包则是串口驱动按字节到达时间分段一帧数据被拆成两次读。解决方案就是前面说的协议设计固定帧头、长度字段、校验位接收端按状态机组包不完整先缓存凑完整再处理。还有一个人人都可能遇到的坑电平转换。STM32串口一般是TTL电平树莓派GPIO串口是3.3V TTL可以直接连。但用PC上USB转串口线时有的线是5V TTL输出直接接到3.3V引脚上长时间运行可能烧芯片。买USB转串口模块一定确认是3.3V电平或者加电平转换电路。我身边就有真实案例——某同学开发板串口突然失灵检查发现是5V电平把主控芯片串口引脚烧坏了返厂维修花了不少时间。5. 进阶方向与现实项目中的取舍5.1 从单机到多机通信与协同掌握单机机器人之后自然想往多机协同走。多机系统核心问题是通信质量和时钟同步。Wi-Fi方案部署简单但延迟和丢包率不稳定工业无线方案稳定但价格高、配置复杂。我的建议是做实验够用的话Wi-Fi加UDP协议加应用层重传就够了别一上来就上复杂框架先把数据通路跑通再逐步增强可靠性。5.2 算法选型要回归需求做机器人项目最容易犯的错是算法炫技。有学生问我毕业设计是不是一定要用强化学习才算有创新点。我说不一定——如果你的任务场景是规则明确的避障经典DWA加红外传感器就能解决得很好何必非用强化学习算法选型的唯一标准是用最简单的方案满足需求复杂度留给真正绕不开的地方。工程项目的评价标准是可靠、可维护、可复现不是算法越新越高级。5.3 安全设计不能省我看了太多学生机器人项目从头到尾没考虑过安全问题。安全不是系统稳定运行之后再加的功能而是一开始就要考虑的设计约束。至少要做到所有运动部件供电能快速切断加物理急停开关软件里做超速和越界保护编码器反馈超过安全阈值立即切断驱动器使能有限位开关的机构限位信号必须硬件中断接入不能用轮询因为轮询可能错过触发时机。最后说点实在的。我从第一次碰机器人到现在最大的体会就是机器人项目没有差不多就行了这回事。传感器有一点噪声算法就要花十倍精力去补偿机械结构松了一颗螺丝控制效果就会差一个档次。做机器人本质上是在和各种不确定性打交道你要做的不是幻想一个完美系统而是让系统在面对噪声、打滑、通信丢包这些乱七八糟状况时依然保持可接受的表现。如果你是刚入门的读者希望这篇内容能帮你少走一些弯路如果你已经有一些经验也希望里面的排查思路能给你一点参考。下一轮我打算接着这个主题往下写重点拆解SLAM的具体实现和调参细节到时候见。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑