尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

四足机器人视觉跟随实现:从目标检测到底盘控制的链路解析

四足机器人视觉跟随实现:从目标检测到底盘控制的链路解析 四足本体上加跟随功能看起来只是机器人追着人走实际是把感知、坐标变换、底盘控制三块完全不同的逻辑串在一条链路上。自研四足平台和买整机差别很大整机底层姿态、里程计、速度接口基本都是黑盒而自研平台的每个环节都要自己接有一点对不齐演示就会变成启动之后原地打转。所以真正该先讨论的不是目标检测模型多强而是从“画面里有一个人”到“机身朝人移动”这条链路怎么搭稳。适合正在搭四足平台、想加入跟随模块的开发者也适合把某个开源视觉跟踪方案往自己底盘上移植的人。我会按做实测的顺序把值得关注的点拆一遍重点讲清楚哪些地方容易反复出问题以及为什么先别急着把参数拉高。1. 自研四足跟随功能到底在做什么1.1 跟随不是“做一个行人检测”很多第一次做四足跟随的人以为只要跑一个行人检测模型再把检测框中心当目标点机器人就能跟着人走。实际跑一次就会发现问题根本不在“检测不到人”而在“检测到人以后怎么持续判断跟谁、跟多近、什么时候停”。一个可用的视觉跟随链路至少包含四个环节目标感知从图像中识别出人和非人并输出目标位置。目标锁定画面里出现多个人时要决定一直跟最初选中的那个人而不是每帧都换新目标。空间坐标计算把像素坐标换算到相机坐标系再换算到本体坐标系得到目标和机器人之间的角度与距离。底盘控制把角度差、距离差转成线速度和角速度命令交给底层步态执行。只做第一步机器人会像“看到人就乱指”前三步做好了机器人才能稳定朝一个人移动四步都做对才叫跟随。做演示时最容易出效果的是让目标穿和背景区分明显的衣服站在空旷区域机器人以固定速度跟随。但这只是功能验证不是完整产品逻辑。这个阶段的核心不是模型越高级越好而是目标坐标能不能以稳定频率、稳定数值传到后续控制模块。如果控制线程拿到的目标位置每秒跳一次那下层再稳也没用。1.2 自研平台下很多“基础能力”要自己补买一台整机做二次开发底盘提供现成的速度控制话题或串口协议直接发线速度、角速度就能走。自研四足本体的工作量大很多因为它不是一个标准底盘你的腿部运动、姿态解算、机身坐标可能都处于半定制状态。在做跟随之前我心里会先确认这几项本体的直行和转弯是否已经稳定能不能用程序控制本体的速度而不是只能用手柄姿态信息和里程计是否持续输出误差还能不能接受相机安装位置是否固定能否知道它相对机身中心的坐标有没有一个能随时切断运动的急停通道。其中急停通道最容易忽略。跟随演示一旦控制参数写反机器人可能不是停住而是直接朝人冲过去。自研项目里不能只靠视觉代码里那个 stop 条件来兜底因为代码可能卡在推理帧里。物理按键、遥控接管或单独的看门狗线程至少有一个要在演示现场可用。把这些基础能力列出来再看“目标检测模型选哪个”才有意义。否则目标检测选得再好底盘没有稳定响应功能演示依然无法复现。2. 演示前要准备哪些硬件和运行条件2.1 按“先能做再做好”的方式选硬件自研四足本体的配置差别很大没必要按别人的“最强参数”抄。第一轮跟随演示只需要满足几件事本体能走、相机能看到目标、主控能跑推理、控制指令能发到底层。如果是实验室自研平台常用组合是四足底盘本体电机驱动和步态控制已经能正常工作一台相机可以是单目彩色相机也可以是带深度信息的 RGB-D 相机一块主控板比如常见的 ARM 小主机或者带 NVIDIA GPU 的开发板性能只要能在 5 到 15 帧之间稳定出检测结果即可有条件的话加一个 2D 激光雷达用来做后续避障和前进方向校验场地上一圈安全隔离带旁边留一名手拿遥控器的人随时接管。如果只有单目相机可以做基础跟随因为跟随任务主要依赖角度信息而距离信息可以用“先假定目标站在地面同一平面”的方式估算。但单目方案会对地面高度很敏感镜头稍微仰一点距离误差就会放大。用 RGB-D 相机时目标中心点的深度能直接读出调试会轻松很多。第一种演示用带深度功能的相机更稳。硬件安装上相机尽量装在机器人前后中轴线上不要偏左或偏右太远。安装位置偏移可以通过坐标变换补偿但偏移很大时机器人在近距离跟随时会明显偏着走看起来像喝了酒。固定相机时要让俯仰角尽量保持在一个已知角度不要每次都手拧一个大概位置。2.2 软件栈和坐标标定越早理清越好有 ROS 或 ROS2 环境时坐标变换、话题通信、日志回放都会方便不少。即使只做一个小演示我也建议先把节点拆分好例如相机节点、目标检测节点、坐标转换节点、速度命令节点各占一个进程或线程而不是把所有逻辑写在一个大 while 循环里。拆分之后最大的好处是能单独看每一级输出定位问题会快很多。正式调试前需要先做好三组标定相机内参标定解决画面畸变和像素尺度问题。不做内参标定远处的角度和位置会不准。相机到本体的外参标定解决相机装在什么位置、朝什么方向的问题。这里最容易出的错是坐标轴方向写反比如相机朝前但转换时把前方坐标当成了左方。控制方向约定确认本体的 x 轴正方向是不是前进方向y 轴正方向是左侧还是右侧角速度正方向是左转还是右转。如果你用的是 ROS会让 TF 树里有一套从机身到相机的坐标关系如果不是 ROS也可以用矩阵乘法完成但必须把所有坐标转换写成同一个文件不要散落在多个回调里。我这里习惯把“传感器坐标系—机体坐标系—底盘速度”的转换单独放一个模块因为跟随问题里十有八九都是坐标转换问题。演示现场还应该准备一套可视化方式能实时看到图像中的检测框也能看到机器人发给底盘的速度命令。只凭机器人“走没走”判断很难分清是检测丢了、坐标错了还是底层没执行。3. 最小可运行跟随流程从单帧目标到连续跟踪3.1 第一步先让机器人在画面里锁定目标第一版跟随功能不要一上来就处理复杂场景。我建议把任务限定成画面里只出现一个被跟踪的人机器人从静止开始发现人后先确认目标再输出目标在相机坐标系下的三维位置。目标检测部分可以先用通用目标检测模型比如 YOLO 系列或其它开源检测器输出目标框之后再定义一个“选主目标”的逻辑。所谓选主目标不一定永远选检测置信度最高的那个而要结合跟踪稳定性。更简单的做法是指定跟画面中心最近或检测面积最大的目标。演示阶段可以允许目标穿特定颜色的衣服但不推荐用颜色识别代替目标检测否则一换环境目标就丢。处理逻辑大致是while True: frame get_camera_frame() boxes, scores detect_person(frame) target select_primary_target(boxes, scores) if target is None: publish_speed(0.0, 0.0) continue u, v target.center() depth get_depth_or_estimate(target) x_c, y_c, z_c camera_pixel_to_point(u, v, depth) publish_object_position(x_c, y_c, z_c)这段代码里最关键的不是 detect_person 的模型有多准而是没有目标时必须立即停车。很多跟随演示失败往往是目标短暂走出画面后控制线程还在沿用上一帧的速度结果机器人继续往前走等人重新进入画面时已经离得太近。确认目标坐标后可以先用 rviz 或普通图像界面把坐标点画出来。能看到坐标点随着人的移动连续变化再进入下一步这一步是后面所有调试的基础。3.2 第二步把目标位置转换成速度命令目标在相机坐标系下的位置还不能直接发给底盘。相机装在身体上它测到的是相对镜头的偏移而控制指令需要的通常是“相对机身中心的速度”。所以要从相机系转到机体系# 假设 T_cam_to_body 是相机到机体的 4x4 变换矩阵 p_body T_cam_to_body * p_camera yaw_to_target atan2(p_body.y, p_body.x) dist_to_target sqrt(p_body.x**2 p_body.y**2)这里要注意如果你的底盘控制接口只接受线速度和角速度角度 yaw_to_target 就是转向量距离 dist_to_target 和设定跟随距离的差就是前进量。控制式不必太复杂if not target_valid: cmd_linear 0.0 cmd_angular 0.0 else: angle_error yaw_to_target distance_error dist_to_target - keep_distance cmd_angular clamp(k_angle * angle_error, -max_angular, max_angular) cmd_linear clamp(k_distance * distance_error, -max_linear, max_linear) publish_cmd_vel(cmd_linear, cmd_angular)这里的 k_angle 和 k_distance 是比例增益max_angular 和 max_linear 是限幅。第一次调的时候限幅一定要小线速度限制在 0.2 到 0.4 米每秒左右就够角速度也尽量控制在 0.5 到 0.8 弧度每秒以内。不要一上来就追求跟得很快速度快会放大检测延迟和控制震荡。还要设计一个跟随距离死区。比如人停在 1.5 米外机器人不要一直来回蠕动而在 1.2 到 1.8 米之间都认为“距离合适”输出速度接近零。没有死区的话距离误差每帧都会有微小变化机器人会不断前前后后点头。3.3 第三步加上丢失、遮挡和恢复策略最小演示版的最后一个核心模块是状态机。不要只用 if-else 处理单帧因为图像检测天生不稳定人转身、遮挡、走出画面都很常见。我一般会定义三个状态SEARCH当前没有有效目标机器人停车或者原地缓慢旋转搜索。TRACK目标有效机器人正常计算速度并跟随。PAUSE目标短时间丢失或前方距离过近机器人减速并原地等待。从 TRACK 转到 SEARCH不应该用“单帧没检到”来判断而应该用一个连续丢失计数。比如连续 10 到 20 帧没有检测到目标才认为目标真正丢失。人走过柱子被挡住一秒钟如果每帧都判定丢失机器人会不停急停、重启反而更危险。更稳的做法是目标短暂丢失时速度先降为零或降低到原来的 30%同时等待恢复连续丢失超过一定时间再进入搜索状态。搜索状态不要设计成漫无目的地乱转可以先用机身摄像头小范围扫描。如果检测到目标要等连续两三帧确认再切回 TRACK。这样可以避免画面里突然出现的其他人干扰。自研平台实现这套状态机不需要很复杂重点是要让每个状态都有一份明确的测试场景。先把这几件事分别测试人在画面中出现、人转身、人短暂走出画面、遥控器按下接管。这几个场景能稳定通过再谈连续跟人走。4. 如何判断跟随效果是否稳定4.1 跟随成功不能只看“跟上了没”做项目演示时最容易出现的误判是人走了一段路机器人也走了一段路就认为跟随成功。实际上真正能说明问题的是机器人对目标的响应有没有出现明显错误。我建议第一轮验收至少跑三种场景静态距离测试人站在机器人前方 1 米、2 米、3 米的位置。机器人应当都能调整到设定的安全距离附近停下。慢速直线测试人以每分钟大约 20 到 30 米的速度沿直线走一段机器人的横向偏移不要越来越大速度不要忽快忽慢。转弯与丢失测试人做一次 90 度转弯或者短暂离开画面 2 秒机器人不能直接冲出去也不能停在原地超过十秒无法恢复。验收时可以记录几条实用指标指标怎么看常见问题锁定时间目标进入画面后到输出稳定坐标的时间太久说明检测频率低或跟踪器不稳定成功跟随时间占比目标可见时间里真正处于跟随状态的比例频繁丢失说明遮挡/视角处理不足停车距离目标停下后机器人到目标的实际距离太近说明死区或控制增益设置不对横向偏差人沿直线走机器人轨迹左右偏离幅度偏大往往来自坐标转换或安装偏置还要观察目标停在原地时机器人本身是否在反复前进后退。如果机器人像点头一样不断小幅移动通常是检测框中心抖动加上速度控制没有死区。这时不要盲目调小 PID先看目标坐标值的波动范围。如果坐标每帧跳好几厘米先做平滑滤波再把死区放大。4.2 参数调节有顺序别一次调三个变量跟随系统中需要调的参数不少比如检测置信度阈值、跟踪阈值、距离死区、角速度比例、线速度比例、滤波窗口大小。很多人习惯一次性改多个参数结果出问题后根本分不清是哪个参数引起的。我建议按这个顺序调检测置信度阈值先保证目标稳定输出宁可偶尔漏检也不要频繁把背景当成人。选主目标逻辑确认现场只有一个人时目标不要每帧切换。速度限幅先把机器人最大速度限制在很小的值确保即使出错也不会造成危险。距离死区根据实际需要的跟随距离设定不要太小。比例增益在限幅内慢慢加观察机器人是否震荡。滤波窗口如果坐标值仍然抖动再用滑动平均但窗口不要过大否则机器人转向会迟钝。参数调节时最好把每一轮修改的值记录下来。不要依赖脑子记忆因为四足本体的调试现场往往同时要操作遥控、看日志、看画面很可能过半小时就忘了一组参数之前的设置。记录格式可以很简单时间、修改了哪个参数、改动多少、现象是什么。我自己的经验是如果机器人出现“走 S 型”或者左右摆动先不要调滤波。先确认目标锁定是否稳定再看角速度增益是不是过高。很多摆动的根源是检测框每帧左右跳而角速度又对这个跳动太敏感。先减少检测框抖动再考虑控制参数效率更高。5. 跟随演示中最常见的四个问题5.1 机器人原地打转或越跟越偏原地打转基本可以判断是方向问题不是检测问题。主要排查两个点一是相机到本体的外参方向定义二是底盘角速度的极性。比如相机安装在机器人前方检测到目标在画面左侧换算后 yaw_to_target 应该为正或负取决于你的 y 轴约定。如果坐标转换时把左右方向取反机器人就会一直朝相反方向转表现为“永远追不到人”。越跟越偏的情况则可能是相机没固定在中轴线上或者本体在行走时姿态带倾斜导致航向漂移。处理这个问题的排查顺序是让目标站在机器人正前方看输出的 yaw_to_target 是不是接近零再让目标站到画面左侧确认角度为正或负最后用遥控确认角速度正方向。把这三步的记录放在一起比对很快能定位反向。5.2 人在前方停下机器人却反复点头这里的点头指机器人不断前进一点、后退一点或者左右来回摆动。多数情况有两种可能目标检测框在静止人物身上也有小幅抖动导致距离和角度计算不稳定速度控制里没有设置死区距离误差一直大于零机器人每帧都在补误差。先看可视化画面如果检测框中心在人的胸口附近来回跳就给目标坐标做滑动平均或者换更稳定的关键点/跟踪器。如果目标中心稳定但仍点头就在速度指令里加入死区。不要同时调两个位置否则很难判断到底哪个解决。5.3 目标短暂遮挡后机器人跟丢了新的人画面里只有一个人时比较少见但如果现场有人路过机器人很容易把目标切换到另一个人身上。原因在于主目标选择逻辑只用了当前帧的置信度没有和历史目标关联。改进方法是给每个目标分配临时编号记录上一帧目标框的位置、大小和移动速度然后从当前帧候选目标中找“和上一帧目标最接近”的那个。用交并比或中心距离做匹配都可以先不用上很重的重识别模型。演示阶段还有一个限制条件能让问题大幅缓解设置主目标必须出现在画面中心的一定范围内如果候选目标离上一帧目标太远就认为当前没有目标而不是随便切换。5.4 机器人速度输出很猛控制代码却没报错如果底盘收到的速度指令非常大先不要怀疑底层电机先查速度上限有没有在多层生效。比如你在控制节点里限制了最大速度但坐标转换节点或检测节点在目标丢失时仍然发布了上一帧的原始坐标下层控制节点可能拿这个旧坐标计算出很大的速度误差。这里要强调速度限幅不能只在最终控制函数里做一次要在正常跟踪、目标丢失、异常数据三种路径里都做二次校验。尤其目标丢失时必须主动把速度置零而不是让控制模块等下一个有效坐标。只靠 if target is None 判断有时候不够因为目标可能给出一个明显不合理的位置比如深度突然变成 0。坐标合理性检查也要加上例如目标距离突然从 2 米跳到 0.2 米就应该认为这是异常数据这次错误产生负向速度或停止。6. 从演示到更稳定的跟随还差哪些工作6.1 不同跟随技术路线的适用范围自研四足本体的跟随演示可以从视觉跟随起步因为它部署简单、展示效果好。但往实际场景推进时单纯视觉方案会遇到遮挡、光照、多目标等问题。很多团队会在后续引入标签跟随、激光雷达腿部跟踪或 UWB 辅助定位。路线优点局限适合场景视觉目标检测跟踪无需额外硬件演示效果好受光照、遮挡、多目标影响室内平整场地、学习验证标签跟随目标识别稳定受环境干扰小被跟人必须佩戴标签物流、仓储、固定人员跟随激光雷达腿部跟踪光线条件影响小可顺势避障需要激光雷达目标拥挤时容易混室外或复杂光照环境多传感器融合稳定性更高标定和调试成本明显增加产品化和长周期运行做演示时没有必要把全部传感器都接上先把一种传感器做成稳定闭环再决定是否融合。上来就搞多传感器融合只会让出错点变多比如相机和雷达标定不准反而比单视觉更乱。6.2 长期使用建议从数据记录和回放做起自研项目最容易踩的坑是功能现场能跑通但下次换个场地、换个人、换台机器之后行为完全不同。这是因为没把“成功一次”和“可复现”分开。想解决可复现性问题最好从一开始就记录数据。机器人行走过程中可以同时保存相机原始图像或压缩视频流目标检测框和置信度结果发给底盘的速度命令操作者按下的遥控事件发生异常时的系统时间。之后调试时把保存的数据重新回放场景固定后你会发现很多问题不是模型不行而是某次坐标转换偶发出错、某帧输入图片花屏、或者底层电控丢了几条速度指令。没有回放数据这些问题很难在真机上复现。另外跟随功能的稳定性上限不止在跟随算法还在四足本体的运动控制本身。如果机器人在行走时步态不稳定姿态抖动明显相机的画面抖动就会加大目标检测和深度估计也会受影响。所以先确认本体的站立、直行、转弯都足够稳定再优化跟随参数比反过来做更合理。四足本体的跟随功能真正让人放心的不是“检测到人那一帧”而是目标丢失、相机抖动、底盘打滑时仍然能停在安全位置。自研平台的最大好处是每个环节都能打开看先把单条链路跑稳再慢慢提速比一次堆满功能更值得投入。
返回列表