MediaPipe与ROS集成:机器人动作交互系统部署教程

MediaPipe与ROS集成:机器人动作交互系统部署教程

1. 引言

1.1 学习目标

本文将带你从零开始,构建一个基于 MediaPipe 的人体骨骼关键点检测系统,并将其与 ROS(Robot Operating System) 集成,实现机器人对人体动作的实时感知与响应。最终你将掌握:

  • 如何部署本地化、高精度的人体姿态估计服务
  • 如何通过 WebUI 实现可视化交互
  • 如何将关键点数据接入 ROS 系统
  • 如何设计简单的动作映射逻辑驱动机器人行为

本教程适用于机器人控制、人机交互、智能硬件开发等场景,特别适合希望在边缘设备上实现低延迟动作识别的开发者。

1.2 前置知识

建议具备以下基础: - Python 编程能力 - 基础 Linux 操作命令 - ROS 基本概念(Node、Topic、Message) - OpenCV 和图像处理基础知识

1.3 教程价值

不同于依赖云端 API 或 GPU 推理的服务,本文介绍的方案完全运行于 CPU,环境轻量、稳定性强、无网络依赖,非常适合嵌入式机器人系统的长期部署。同时结合 ROS 提供强大的模块化扩展能力,是构建“视觉驱动”机器人应用的理想起点。


2. MediaPipe Pose 核心功能详解

2.1 技术原理概述

MediaPipe 是 Google 开发的一套跨平台机器学习流水线框架,其中 MediaPipe Pose 模块专用于人体姿态估计任务。它采用两阶段检测架构:

  1. 人体检测器(BlazePose Detector):快速定位图像中的人体区域。
  2. 姿态回归模型(Pose Landmark Model):对裁剪后的人体区域进行精细分析,输出 33 个标准化的 3D 关键点坐标。

这些关键点覆盖了头部、躯干和四肢的主要关节,包括鼻尖、眼睛、肩膀、手肘、手腕、髋部、膝盖、脚踝等,形成完整的人体骨架表示。

📌 技术优势总结33 个 3D 关键点输出:不仅提供 (x, y) 像素坐标,还包括深度 z 和可见性 visibilityCPU 友好型设计:使用轻量化神经网络结构,在普通 x86 或 ARM CPU 上可达 30+ FPS端到端本地运行:无需联网请求,保护用户隐私,避免 Token 失效等问题

2.2 输出关键点说明

类别包含关节点示例
面部鼻子、左/右眼、左/右耳
上肢肩膀、手肘、手腕、拇指、食指、中指
躯干左右髋、脊柱、胸骨
下肢膝盖、脚踝、脚跟、脚尖

所有关键点以归一化坐标形式返回(范围 [0,1]),便于适配不同分辨率的输入图像。


3. 环境部署与 WebUI 使用

3.1 启动本地服务

本项目已打包为可一键启动的 Docker 镜像,支持 ZEEKLOG 星图平台直接部署:

  1. 访问 ZEEKLOG星图镜像广场
  2. 搜索 MediaPipe Pose CPU 镜像并创建实例
  3. 实例启动完成后,点击平台提供的 HTTP 访问按钮

服务默认开启 WebUI 页面,地址通常为 http://<your-ip>:8080

3.2 WebUI 功能操作指南

进入页面后执行以下步骤:

  1. 上传图片:点击“Choose File”选择一张包含人物的 JPG/PNG 图像
  2. 提交处理:点击 “Upload & Detect” 按钮
  3. 查看结果
  4. 原图上会叠加绘制火柴人骨架
  5. 红点 表示检测到的关键点
  6. 白线 连接相邻关节点,构成身体结构
  7. 获取数据(可选):
  8. 页面下方可查看 JSON 格式的原始关键点数据
  9. 支持下载带骨架标注的图像
💡 提示:建议使用正面站立、光照良好、背景简洁的照片以获得最佳检测效果

4. ROS 系统集成实践

4.1 架构设计思路

为了将 MediaPipe 的姿态识别能力融入机器人控制系统,我们设计如下集成架构:

[Camera] ↓ (raw image) [MediaPipe Node] → 检测关键点 → 发布 /skeleton_pose Topic ↓ (visualization) [WebUI Server] ↓ (pose data) [ROS Master] ← 其他 Nodes(如 Motion Planner) 

核心思想是将 MediaPipe 封装为一个 ROS Node,持续订阅摄像头图像流,完成姿态估计后发布标准化的消息。

4.2 创建 ROS Package

cd ~/catkin_ws/src catkin_create_pkg mediapipe_ros rospy cv_bridge sensor_msgs geometry_msgs cd .. catkin_make 

4.3 关键代码实现

核心节点:pose_estimator.py
#!/usr/bin/env python import rospy import cv2 import numpy as np from cv_bridge import CvBridge from sensor_msgs.msg import Image from geometry_msgs.msg import PointStamped, Vector3 from std_msgs.msg import Header import mediapipe as mp class PoseEstimator: def __init__(self): self.bridge = CvBridge() self.mp_pose = mp.solutions.pose self.pose = self.mp_pose.Pose( static_image_mode=False, model_complexity=1, # 平衡速度与精度 enable_segmentation=False, min_detection_confidence=0.5, min_tracking_confidence=0.5 ) # Subscribers self.image_sub = rospy.Subscriber("/camera/image_raw", Image, self.image_callback) # Publishers self.keypoint_pub = rospy.Publisher("/skeleton_pose", PointStamped, queue_size=10) self.skeleton_pub = rospy.Publisher("/full_skeleton", String, queue_size=10) # JSON string self.br = CvBridge() rospy.loginfo("Pose Estimator Node Initialized") def image_callback(self, msg): try: cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8") except Exception as e: rospy.logerr(f"Image conversion error: {e}") return rgb_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB) results = self.pose.process(rgb_image) if results.pose_landmarks: h, w, _ = cv_image.shape keypoints = [] for i, landmark in enumerate(results.pose_landmarks.landmark): px = int(landmark.x * w) py = int(landmark.y * h) pz = landmark.z * w # 相对深度 vis = landmark.visibility # 发布每个关键点(示例:仅发布鼻子) if i == 0: # 鼻子索引为0 point_msg = PointStamped() point_msg.header = Header(stamp=rospy.Time.now(), frame_id="camera_link") point_msg.point.x = px point_msg.point.y = py point_msg.point.z = pz self.keypoint_pub.publish(point_msg) keypoints.append({ "id": i, "x": px, "y": py, "z": pz, "visibility": float(vis) }) # 发布完整骨架(JSON字符串格式) import json skeleton_str = json.dumps(keypoints) from std_msgs.msg import String str_msg = String() str_msg.data = skeleton_str self.skeleton_pub.publish(str_msg) # 绘制骨架(可选:回传给WebUI) mp.solutions.drawing_utils.draw_landmarks( cv_image, results.pose_landmarks, self.mp_pose.POSE_CONNECTIONS) # 可视化反馈(调试用) cv2.imshow("MediaPipe Pose", cv_image) cv2.waitKey(1) if __name__ == '__main__': rospy.init_node('mediapipe_pose_node', anonymous=True) node = PoseEstimator() rospy.spin() 

4.4 编译与运行

确保安装依赖:

pip install mediapipe opencv-python rospy cv_bridge 

赋予脚本可执行权限并运行:

chmod +x pose_estimator.py roscore & rosrun mediapipe_ros pose_estimator.py 

4.5 数据订阅测试

新开终端运行:

rostopic echo /skeleton_pose 

你应该能看到类似以下输出:

header: seq: 123 stamp: secs: 1712345678 nsecs: 901234567 frame_id: "camera_link" point: x: 320.0 y: 180.0 z: 45.2 

5. 动作识别与机器人控制联动

5.1 简单动作判断逻辑

我们可以基于关键点之间的几何关系实现基本动作识别。例如判断“举手”动作:

def is_hand_raised(landmarks): """判断右手是否举起""" shoulder_y = landmarks[12]['y'] # 右肩 wrist_y = landmarks[16]['y'] # 右手腕 return wrist_y < shoulder_y # 手腕高于肩膀即视为举起 

5.2 控制机器人移动示例

假设你的机器人支持 /cmd_vel 消息控制:

from geometry_msgs.msg import Twist class RobotController: def __init__(self): self.cmd_pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) def move_forward(self): twist = Twist() twist.linear.x = 0.2 # 前进速度 self.cmd_pub.publish(twist) 

在主循环中加入条件判断:

if is_hand_raised(keypoints): controller.move_forward() 

即可实现“抬手前进”的自然交互体验。


6. 总结

6.1 实践经验总结

本文完整展示了如何将 MediaPipe 与 ROS 集成,打造一套可用于真实机器人系统的动作交互框架。核心收获包括:

  • ✅ 成功部署了一个稳定、高效的本地化姿态检测服务
  • ✅ 实现了 WebUI 与 ROS 双通道输出,兼顾可视化与工程集成
  • ✅ 掌握了将 AI 视觉能力接入机器人控制系统的标准模式
  • ✅ 构建了“感知→决策→执行”的闭环人机交互原型

6.2 最佳实践建议

  1. 性能优化:对于嵌入式设备,建议降低输入图像分辨率至 640x480 并启用 model_complexity=0
  2. 坐标转换:若需精确空间定位,请标定相机内参并使用 solvePnP 计算世界坐标
  3. 异常处理:增加超时机制和重连逻辑,防止长时间无响应
  4. 安全策略:避免直接映射复杂动作指令,应加入确认机制或限速保护

💡 获取更多AI镜像

想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

FPGA读写DDR4 (一)MIG IP核控制信号

FPGA读写DDR4 (一)MIG IP核控制信号

前言         这几个星期在倒腾DDR4内存的读写控制,期间看了不少资料,这几天终于完工了于是想着把做过的内容总结一下,于是有了这篇文章,由于控制DDR4的内容很多,这一篇文章就只讲基础的,也就是DDR4的控制IP核 MIG的控制信号。         主要参考内容:【正点原子】MPSoC-P4之FPGA开发指南_V2.0,[XILINX] pg150-ultrascale-memory-ip-en-us-1.4 MIG IP核控制信号 IP核创建界面         MIG IP核(memory interface generator)是用户与DDR4进行沟通的桥梁,因为如果我们自己去写直接DDR4代码的话,其内容将会非常复杂,而且即便写出来其性能可能也不会好,以XILINX提供的MIG IP核为例,在综合布线后查看utilization,能发现MIG IP核足足使用了约7500个LUT和9000个register资源,足以看出其编写的复杂,不过对于我们普通用户,能够操作MIG提供的用户接口就我觉得就算差不多了,既然要使用IP核,我们就从IP核的创建界面开始说起,

春晚不用抢红包,全在刷AI?豆包和机器人疯传,2026普通人逆袭就靠这“三字经”

春晚不用抢红包,全在刷AI?豆包和机器人疯传,2026普通人逆袭就靠这“三字经”

节目里的机器人不仅会后空翻,还能听懂蔡明的相声包袱,那一夜,科技的温度第一次盖过了除夕的烟火。 当王菲的天籁之音还在演播大厅回荡,当李健的《人间共鸣》刚刚唱罢,2026年的春晚留给观众的,除了熟悉的年味,还有一种“未来已来”的具象冲击。今年春晚的“隐藏主角”不再是某款饮料或电商平台,而是看不见摸不着却无处不在的AI。 如果你错过了今年的春晚,你可能不仅仅错过了一台晚会,而是错过了理解接下来五年财富逻辑的关键信号。AI不再是极客手中的玩具,它正在以春晚为原点,迅速“飞入寻常百姓家”。 01、现象复盘:今年的春晚,不只是“看”,更是“用” 今年的春晚,科技感并非只是舞台上的炫酷特效,更是一次全民的AI应用启蒙。 首先是无处不在的AI大模型。作为独家AI云合作伙伴,火山引擎的豆包大模型贯穿了晚会全流程-1。在小品《奶奶的最爱》中,蔡明与“数字双胞胎”的互动,以及那些声音稚嫩的机器人小朋友,其声音正是由豆包的语音合成模型生成的-1。节目能精准理解蔡明的“包袱”,靠的正是AI对复杂语义的精准识别。这不仅仅是提前录好的配音,而是现场实时生成的“

2026年,我整理了中国 200 多家机器人(具身智能)公司名单

2026年,我整理了中国 200 多家机器人(具身智能)公司名单

近几年,机器人行业突然变得异常热闹。尤其是2022年9月特斯拉首次亮相具身智能人形机器人 Optimus 之后,国内外都掀起了一波浪潮。2023年之后,国内出现了一批新的人形机器人公司,为了更好地理解这个行业,我整理了一份中国机器人企业名单,包含200 多家企业,涵盖人形机器人、工业机器人、移动机器人、服务机器人、特种机器人等领域。 注:名单中的企业排序没有特殊含义,仅表示本人收集信息的先后顺序。 序号企业简称总部成立时间主营产品网址企业全称1优必选深圳2012年人形机器人、轮式机器人https://ubtrobot.com深圳市优必选科技股份有限公司2宇树科技杭州2016年四足机器狗、人形机器人https://unitree.com宇树科技股份有限公司3智元上海2023年四足、轮式、双足人形机器人、具身模型https://zhiyuan-robot.com智元创新(上海)科技股份有限公司4海康机器人杭州2016年机器视觉、移动机器人https://hikrobotics.com杭州海康机器人股份有限公司5傅利叶上海2015年康复机器人、双足人形机器人、灵巧手https://f