当前位置: 首页 > news >正文

机器狗自动跟随方案

视觉融合跟随方案说明

jie_deamon 扩展设计:方案对比、坐标系、方案1/2 详细实现、算力、与 robot_nexus 集成


1. 现状与问题

当前实现include/lidar_tracker.hpp):

  1. Web 雷达俯视图双击 →setTarget(x, y)(机器人坐标,米)
  2. 每帧/scan在目标圆(半径 0.3m)内取雷达点 → 算质心 → 更新目标
  3. calculateFollowVelocity()根据目标位置算前后/左右/旋转速度
  4. APF 势场法用/scan做局部避障

局限:旁边多站一人时,0.3m 圆内混入多人点云,质心被拉向中间或点更多的人,易跟错。算法不区分目标身份。

改进思路:相机负责认人(谁),雷达或深度负责测距(多远),最终仍写入同一个setTarget(x, y),后续跟随与避障逻辑可复用。


2. 方案总览

方案硬件认目标测距离算力适用场景
当前2D 雷达圆内质心雷达极低单人、少遮挡、跟反射物
A 雷达增强2D 雷达加权质心+门控+卡尔曼雷达极低小改代码,轻微抗干扰
方案 1RGB + 2D 雷达bbox / track_idbbox 内雷达点中~高已有普通相机,不加深度
方案 2RGB-Dbbox / track_id深度反投影中~高有深度相机,测距更稳
D 标签UWB / AprilTag标签 ID标签位置跟固定物(购物车)

方案 1 与 2 的相同点:都在相机 live 画面里检测、跟踪人;用户点选画面指定目标;都用 DeepSORT 等维持track_id

不同点:仅距离 / 3D 位置从哪来——方案 1 用 2D 雷达点投影进 bbox;方案 2 用深度图 bbox 内深度反投影。


3. 系统架构

┌─────────────┐ select_person(u,v) ┌──────────────────┐ │ Web / App │ ──────────────────────────► │ person_tracker │ │ 相机 live │ │ YOLO + DeepSORT │ └─────────────┘ └────────┬─────────┘ │ /camera/image │ 每帧输出 target(x,y) /camera_info │ in base_link /scan (方案1) ▼ /depth (方案2) ┌──────────────────┐ │ robot_nexus │ │ setTarget(x,y) │ │ lidar_tracker │ │ APF + /cmd_vel │ └──────────────────┘

分工

  • 相机驱动:只出图,不接收跟踪指令
  • person_tracker 节点:接收「跟谁」,输出每帧(target_x, target_y)
  • robot_nexus:消费setTarget,速度控制与 APF 可 largely 复用现有代码

4. setTarget 与坐标系

4.1 setTarget 存的是什么

SharedState::setTarget(x, y)表示目标在机器人本体坐标系下的位置

  • x:前方(米),与FOLLOW_DIST = 0.4比较决定进退
  • y:左方(米),与atan2(y, x)决定转向

lidar_tracker里雷达点转换后的(point_x, point_y)同一坐标系,不是:

  • 雷达极坐标(range, angle)
  • 图像像素(u, v)

三种来源,写入格式相同

来源(x, y) 怎么来
当前纯雷达0.3m 圆内雷达点质心
方案 1bbox 内雷达点质心
方案 2深度反投影到 base 后取 x, y

4.2 坐标系转换(通俗)

每个传感器有自己的「原点 + 前后左右」:

  • base / 雷达系:以机器人为中心,x 前、y 左
  • 相机系:以相机光心为中心,X Y Z
  • 像素:u, v

转换= 已知相机相对机器人的安装位置(标定),把同一个物理点从一种说法换成另一种。

方案 1 方向:雷达点 → 相机系 → 投影到像素 → 判断是否在人的 bbox 内

方案 2 方向:像素 + 深度 → 相机系 3D → 变换到 base → 得到 (x, y)

相机系是连接「图像」与「机器人跟随控制」的桥梁。标定一次,参数固定(static_transform_publisher或 URDF)。

4.3 2D 雷达的高度限制

2D 雷达只有一个水平扫描面,常只扫到小腿;相机能看到全身。因此:

  • bbox 宜取偏下(框底中心),提高与雷达平面相交概率
  • 扫不到点时:Kalman 预测 / 保持上一帧 / 短暂停车提示重选

5. 方案 1:RGB 相机 + 2D 雷达(详细)

5.1 适用场景

  • 机器狗已有 2D 雷达 + 普通 USB/网络相机
  • 不想增加深度相机(成本、重量、布线)
  • 主要跟人走,环境单人或旁人不会长时间贴在 0.5m 内
  • onboard 或外接算力能跑YOLO + 跟踪(见第 8 节)

不适合:没有相机标定条件;雷达安装高度与人体完全扫不到;算力极弱且无法 App offload。

5.2 硬件与 ROS 话题

项目说明
输入/camera/image_raw,/camera/camera_info,/scan
标定camera ↔ lidar(或 camera ↔ base_link)外参 + 相机内参 K
TFbase_linklaser_link,base_linkcamera_link
输出/person_tracker/targetgeometry_msgs/PointStamped,frame=base_link)

5.3 算法流程(每帧)

1. YOLO 检测所有人 → 多个 bbox 2. DeepSORT 分配/维持 track_id 3. 若用户已 select_person → 只处理 lock_track_id 对应 bbox 4. for each /scan 点: a. (range, angle) → lidar 系 (x, y, z=0) b. T_cam_lidar → 相机系 (X, Y, Z) c. K 投影 → 像素 (u, v);Z≤0 丢弃 d. 若 (u,v) 在 lock bbox 内 → 加入候选集 5. 候选集算质心 (cx, cy)(base/lidar 系) 6. setTarget(cx, cy) 或发布 topic 给 robot_nexus 7. robot_nexus 仍用 /scan 做 APF,calculateFollowVelocity 不变

5.4 投影公式

雷达点 → 像素(概念):

p_cam = T_cam_lidar * p_lidar s * [u, v, 1]^T = K * p_cam

筛选条件

in_bbox=(u1<=u<=u2)and(v1<=v<=v2)# 建议用 bbox 下半部分:v >= v1 + 0.5 * (v2 - v1)

目标位置

target_x=mean(p.xforpincandidates)# base 系target_y=mean(p.yforpincandidates)

5.5 用户如何指定跟踪目标

  1. Web/App 显示相机 live 画面(不是雷达俯视图)
  2. 用户点击要跟的人 →{ "type": "select_person", "u": 640, "v": 380 }
  3. 视觉节点在本帧检测框中,选包含该像素的框,绑定track_id
  4. 之后每帧只跟该track_id,旁人进画面但不进同一 ID 不会影响

可选 ROS Service:/person_tracker/select_target(u, v) → track_id

5.6 与 robot_nexus 集成

推荐:独立person_tracker节点,不塞进lidar_tracker.hpp

// person_tracker 发布,robot_nexus 订阅voidonTarget(constgeometry_msgs::msg::PointStamped::SharedPtr msg){state_.setTarget(msg->point.x,msg->point.y);}

lidar_tracker::processScan关闭条件关闭原有圆内质心更新:

// 视觉模式下不再用雷达质心改 target,仅 APF + 速度计算if(!vision_target_active_){// 原有质心逻辑}

APF、走廊、calculateFollowVelocitypublishVelocity保持不变

5.7 时间同步

图像与/scan时间戳对齐:

  • ROS 2message_filters::ApproximateTime同步 image + scan
  • 或取时间戳最接近的一帧配对

检测 5~10Hz、雷达 10~20Hz 时,允许 ±50ms 误差。

5.8 优点与局限

优点局限
不需深度相机必须 camera–lidar 标定
track_id 抗「旁人进圆」2D 雷达高度平面限制
复用现有 APF 与跟随控制视觉检测占算力
setTarget 接口不变bbox 内无雷达点时需降级

5.9 异常与降级

情况处理
bbox 内 0 个雷达点保持上一帧 target + Kalman 预测;超时停车
track 丢失提示用户重新点选
检测帧率低跟踪器预测中间帧;跟随 10Hz 仍可用

6. 方案 2:RGB-D 深度相机(详细)

6.1 适用场景

  • 已有或可加RGB-D(Intel RealSense、Orbbec 等)
  • 希望距离测量更直接,减少点云–图像匹配
  • 2D 雷达常扫不到人体,但深度在 bbox 内仍有效
  • 同样需相机认人(YOLO + track_id)

不适合:强逆光、玻璃、黑色吸光衣物导致深度大面积无效;不愿做 camera–base 标定。

6.2 硬件与 ROS 话题

项目说明
输入/camera/color/image,/camera/depth/image_rect_raw,/camera/camera_info
/camera/depth/color/points(点云)
标定depth ↔ color 对齐(驱动通常提供);camera ↔ base_link 外参
2D 雷达可选;建议保留用于 APF 避障
输出/person_tracker/target(base_link 下 x, y)

6.3 算法流程(每帧)

1. YOLO 在彩色图检测人 → bbox + track_id(同方案 1) 2. 用户 select_person 锁定 track_id 3. 将 bbox 映射到对齐后的深度图 4. 在 bbox 内取有效深度(0.3m < d < 5m),取中值 d_med 5. 用 bbox 底中心 (u, v) + d_med + 内参 K 反投影: X = (u - cx) * d / fx Y = (v - cy) * d / fy Z = d 6. p_base = T_base_cam * (X, Y, Z) 7. setTarget(p_base.x, p_base.y) 8. /scan 仍供 lidar_tracker APF 使用

6.4 深度反投影公式

X = (u - cx) * d / fx Y = (v - cy) * d / fy Z = d [x, y, z, 1]^T = T_base_cam * [X, Y, Z, 1]^T target_x = x target_y = y

为何用 bbox 底中心:更接近脚/地面接触,与机器狗地面跟随一致。

为何用深度中值:抗噪、抗 bbox 边缘背景 depth。

6.5 与方案 1 的关键区别

项目方案 1方案 2
距离来源2D 雷达点深度图
必须标定camera ↔ lidarcamera ↔ base
雷达在测距中的作用必须可不参与测距
雷达在避障中的作用测距 + APF建议仍做 APF
多人抗干扰track_id + bbox 筛雷达点track_id + bbox 取深度
典型失败雷达扫不到腿深度空洞

6.6 用户指定目标(与方案 1 相同)

  • 相机画面点选 →select_person(u, v)
  • DeepSORT 锁定track_id
  • 不是在深度图或雷达地图上单独点选

指令仍发给person_tracker,不是深度相机驱动。

6.7 与 robot_nexus 集成

与方案 1相同接口

state_.setTarget(target_x,target_y);

lidar_tracker建议:

  • vision_target_active_ == true时跳过雷达质心更新
  • 继续processScan做 APF 与min_obstacle_dist
  • calculateFollowVelocity(target_x, target_y, ...)不变

6.8 优点与局限

优点局限
不依赖 2D 雷达测距深度相机成本与功耗
实现路径比投影匹配直观强光/玻璃/深色衣服 depth 差
全身 bbox + 底部 depth 较稳仍需视觉检测算力
可与雷达 APF 并存需 depth–color 对齐

6.9 异常与降级

情况处理
bbox 内有效 depth < 10% 像素上一帧 + Kalman;或短时回退方案 1 雷达投影
depth 全 0停车 + 提示
track 丢失同方案 1

7. 方案 1 vs 2 选型

已有 2D 雷达 + 普通相机,无深度 → 方案 1 已有 / 可加 RGB-D → 方案 2(人跟随通常更省心) 跟固定购物车,算力紧 → UWB / AprilTag(非 1/2) 仅小改、可接受多人干扰 → 方案 A(纯雷达增强)

界面建议:跟随时主界面用相机 live view 点人;雷达俯视图仅作避障/调试,不再用于选人。


8. 如何传递「跟踪谁」的指令

消息含义
select_person(u, v)相机画面点人,绑定 track_id
switch_track(track_id)换人
stop_tracking停止视觉跟踪
set_moving(enabled)与现有 jie_deamon 一致,控制是否发布非零速度

WebSocket 扩展示例:

{"type":"select_person","u":640,"v":380}{"type":"track_update","track_id":7,"bbox":[300,100,400,500],"target":{"x":1.8,"y":0.2}}

ROS 2 建议:

  • Service/person_tracker/select_target
  • Topic/person_tracker/targetgeometry_msgs/PointStamped

9. 算力要求

引入相机后,主要开销在人体检测(YOLO),不在setTarget或几何投影。

配置检测约 FPS典型平台
YOLOv8n + CPU3~8树莓派 4、弱 ARM
YOLOv8n + NPU/GPU15~30Jetson Orin Nano、RK3588
纯雷达方案 A零视觉算力

降算力手段

  • 检测 5Hz + DeepSORT 插帧
  • YOLOv8n INT8 / TensorRT / RKNN
  • ROI 只在画面上半或上一帧 bbox 扩大区域检测
  • App 侧检测,机器狗只收 bbox + track_id

跟随控制 10Hz 足够;检测5~10Hz多数场景可用。


10. 实施步骤(方案 1 / 2 通用)

  1. 评估算力 → 选 onboard 或 App offload
  2. 标定外参;方案 1 验证雷达点投影到图像对齐
  3. 部署 YOLO + DeepSORT,person_tracker节点
  4. Web 增加相机 live view + 点选交互
  5. robot_nexus订阅 target,关闭雷达质心更新,保留 APF
  6. 联调:跟丢、depth 空洞、bbox 无点等降级策略

11. 相关源码(jie_deamon 现有)

文件作用
include/lidar_tracker.hpp质心跟踪、APF、calculateFollowVelocity
include/common_types.hppsetTargetFOLLOW_DISTTARGET_RADIUS
include/kalman_filter.hpp可选目标平滑
src/robot_nexus.cpp订阅/scan,发布/cmd_vel
src/web_comm.cpp现有 WebSocket;可扩展select_person
http://www.zskr.cn/news/1482742.html

相关文章:

  • [论文学习]LLM 遗忘机制对真实世界扰动资料的稳健性研究
  • 【太阳能】基于matlab模拟PEM电解模拟了24小时太阳能绿色氢电厂(每小时太阳能发电量、氢气产量、用水量、储罐动态以及每公斤H₂的成本
  • 当 AI 帮我写代码时,我学到了什么?
  • 如何实现企业级加密压缩包密码恢复:高效自动化解决方案指南
  • 风力涡轮机雷达信号仿真附matlab代码
  • MPC Video Renderer(MPC视频渲染器)
  • 书匠策AI官网www.shujiangce.com:揭秘一个让导师都查不出来的期刊论文“流水线“,附完整拆解
  • 系统常用运行库(CSRLPackage
  • 导师严选 2026 最新降AI率网站测评与推荐 - 降AI小能手
  • CLAUDE.md 是什么?它是所有 Skill 的总开关
  • MATLAB一键部署EMD/CeMD信号分解工具包(含多版本函数与可视化支持)
  • 3个关键步骤释放OneNote笔记潜能:onenote-md-exporter迁移实战指南
  • Oops Framework-8-由空项目创建第一个登录界面
  • 从光源到控制:2026年幻彩灯箱的技术迭代方向
  • CSDN AI数字营销订阅陷阱预警:自动续费暗门、阶梯计费盲区与紧急退订通道
  • 南京除甲醛公司口碑名单:绿居净环保等5家甲醛检测治理公司深度测评 - aZJ-111
  • Honey Select 2终极汉化补丁:3分钟实现游戏完全中文化
  • 英雄联盟Akari助手:免费开源游戏效率工具终极使用指南
  • 从零开始:如何用AICoverGen让AI为你喜欢的角色翻唱歌曲
  • 110、【Agent】【OpenCode】todowrite 工具提示词(示例)(四)
  • AI 辅助独立创作与创意工具产品化实践
  • 3大核心功能深度解析:RePKG如何破解Wallpaper Engine资源封装
  • 终极指南:三步解决Paradox游戏模组冲突,让你的游戏体验翻倍提升
  • 杭州甲醛检测治理除甲醛公司口碑名单:森氧家环保等5家深度测评 - aZJ-111
  • 东莞甲醛检测治理除甲醛公司口碑名单:醛清环境等5家深度测评 - aZJ-111
  • 葫芦岛CMA甲醛检测治理口碑名单:国康CMA检测中心等5家深度测评 - aZJ-111
  • JavaWeb 全套教程 会话管理 103-106
  • Godot游戏资源一键提取终极指南:免费开源工具快速上手
  • 甘孜第三方CMACNAS甲醛检测治理口碑名单:清诚CMA检测中心等5家深度测评 - aZJ-111
  • 葫芦岛第三方CMACNAS甲醛检测治理口碑名单:清诚CMA检测中心等5家深度测评 - aZJ-111