基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435 相机和 MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向。
假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境,并且有一个可以控制的机器人接口。

一、手部姿态重定向介绍

手部姿态重定向通常涉及将实时手部关键点映射到虚拟环境或另一个坐标系中(通常需要映射到机器人坐标系中)。可以使用以下步骤实现基本的手部姿态重定向:

  1. 获取关键点坐标:使用手部追踪库(如 MediaPipe)获取手部关键点的坐标。
    具体包括数据获取和手部特征识别。
    首先选择合适的相机,如RGB相机、深度相机(如Kinect或RealSense),或高帧率摄像头获取实时图像或深度数据;
    然后使用机器学习或深度学习算法(如YOLO、SSD等)检测图像中的手部,也可以使用现成的手部检测模型,例如MediaPipe Hands,来实现实时手部跟踪;
    最后提取手部的关键点信息,例如手指关节、掌心等。

  2. 定义目标坐标系:确定将手部姿态映射到哪个坐标系中,比如虚拟现实环境或者机器人坐标系。

  3. 姿态重定向:根据目标坐标系的需求,进行平移、旋转或缩放等变换。
    首先将2D图像坐标转换为3D空间坐标,通常需要相机内参(焦距、主点位置等),根据关键点位置计算手部的姿态(位置、方向、旋转);
    然后可以使用旋转矩阵、四元数等方式表示手部的姿态;最后将手部的当前姿态转换到机器人的目标姿态。

  4. 输出重定向后的姿态:将重定向后的坐标记录用于后续处理。

二、简单实现手部姿态与机器人末端的重定向

MediaPipe检测器可以准确定位腕部框架中21个手指关节坐标的3D关键点和图像上的2D关键点。

代码示例

import cv2
import numpy as np
import pyrealsense2 as rs
import mediapipe as mp
import time# 初始化 RealSense 管道
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
pipeline.start(config)# 初始化 MediaPipe 手部模块
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.7)
mp_draw = mp.solutions.drawing_utils# 机器人控制函数(示例),具体需要根据需要通过逆解解算
def move_robot_to(position):# 在这里添加机器人控制代码print(f"移动机器人末端到位置: {position}")try:while True:# 获取图像帧frames = pipeline.wait_for_frames()color_frame = frames.get_color_frame()if not color_frame:continue# 转换为 numpy 数组color_image = np.asanyarray(color_frame.get_data())# 将图像转换为 RGB 格式rgb_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)rgb_image.flags.writeable = False# 检测手部results = hands.process(rgb_image)# 将图像转换回 BGR 格式rgb_image.flags.writeable = Trueannotated_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)# 如果检测到手部if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:# 绘制手部标记mp_draw.draw_landmarks(annotated_image, hand_landmarks, mp_hands.HAND_CONNECTIONS)# 获取手腕的位置(关节0)wrist = hand_landmarks.landmark[mp_hands.HandLandmark.WRIST]h, w, c = annotated_image.shapewrist_x, wrist_y = int(wrist.x * w), int(wrist.y * h)# 将手腕位置转换为机器人坐标,需要进行不同坐标系的位姿变换robot_position = (wrist_x, wrist_y)move_robot_to(robot_position)  # 移动机器人末端# 显示结果cv2.imshow('Hand Detection', annotated_image)if cv2.waitKey(1) & 0xFF == ord('q'):break
finally:# 释放资源pipeline.stop()cv2.destroyAllWindows()

代码说明

  1. 初始化 RealSense 管道:设置相机流,并启动管道。
  2. 初始化 MediaPipe:配置手部检测模块。
  3. 实时捕获与处理:在循环中捕获视频帧,并检测手部姿态。
  4. 机器人控制:通过 move_robot_to 函数模拟移动机器人末端到手腕位置,需要根据自己的机器人接口实现具体的控制代码。
  5. 显示结果:在窗口中显示手部检测的图像,按 q 键退出。

运行代码

  1. 将代码保存为 hand_pose_robot.py

  2. 连接 Intel RealSense D435 相机。

  3. 在终端中运行代码:

    python hand_pose_robot.py
    

运行结果

在这里插入图片描述将 Intel RealSense D435 相机与 MediaPipe 的手部姿态检测整合在一起,可以实现手部姿态的实时检测,并将手腕的关键点转换为相机坐标系下的空间坐标。接下来,我们将编写一个完整的示例代码,进行手部关键点坐标到机器人坐标系的转换。

三、简单实现手腕与机器人末端的坐标转换

代码实现

以下是将 Intel RealSense D435 相机与 MediaPipe 手部姿态检测结合的完整代码示例:

import cv2
import mediapipe as mp
import numpy as np
import pyrealsense2 as rs# 初始化MediaPipe手部模型
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False, max_num_hands=1, min_detection_confidence=0.7)
mp_drawing = mp.solutions.drawing_utils# 设置RealSense相机参数
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)# 启动相机流
pipeline.start(config)# 相机到机器人坐标系的转换矩阵(示例,需要根据实际情况调整)
camera_to_robot_transform = np.array([[1, 0, 0, 0],  # x轴[0, 1, 0, 0],  # y轴[0, 0, 1, 0],  # z轴[0, 0, 0, 1]   # 平移
])def wrist_to_camera_coordinates(wrist_landmark, depth_frame):# 获取深度信息depth_value = depth_frame.get_distance(int(wrist_landmark.x * 640), int(wrist_landmark.y * 480))if depth_value == 0:return None  # 如果深度值为0,返回None# 计算空间坐标x = (wrist_landmark.x * 640 - 320) * depth_value / 525.0  # 525.0是相机焦距(可根据相机参数调整)y = (wrist_landmark.y * 480 - 240) * depth_value / 525.0z = depth_valuereturn np.array([x, y, z])def main():while True:# 获取相机帧frames = pipeline.wait_for_frames()color_frame = frames.get_color_frame()depth_frame = frames.get_depth_frame()if not color_frame or not depth_frame:continue# 转换为numpy数组frame = np.asanyarray(color_frame.get_data())# RGB转换frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)results = hands.process(frame_rgb)if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:# 提取手腕关键点wrist_landmark = hand_landmarks.landmark[mp_hands.HandLandmark.WRIST]# 转换为相机坐标系下的空间坐标wrist_coordinates = wrist_to_camera_coordinates(wrist_landmark, depth_frame)if wrist_coordinates is not None:# 映射到机器人坐标系robot_coordinates = camera_to_robot_transform @ np.append(wrist_coordinates, 1)  # 同质坐标转换# 打印机器人坐标print(f"Wrist Coordinates (Camera): {wrist_coordinates}")print(f"Wrist Coordinates (Robot): {robot_coordinates[:3]}")  # 只取x, y, z# 可视化手部关键点mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)cv2.imshow('Hand Tracking', frame)if cv2.waitKey(1) & 0xFF == 27:  # 按Esc退出break# 停止相机流pipeline.stop()cv2.destroyAllWindows()if __name__ == "__main__":main()

代码说明

  • RealSense 相机设置:使用 pyrealsense2 库来设置和启动 RealSense D435 相机的流。代码配置了颜色流和深度流。

  • MediaPipe 手部姿态检测:使用 MediaPipe 检测手部关键点,特别是手腕的位置。

  • 手腕坐标转换wrist_to_camera_coordinates 函数根据手腕的关键点和深度图计算相机坐标系下的空间坐标。

  • 坐标转换:使用转换矩阵将相机坐标系下的手腕坐标转换到机器人坐标系。需要根据实际机器人和相机的位置关系调整 camera_to_robot_transform 矩阵。

  • 可视化和输出:代码在每帧中显示检测到的手部关键点,并输出手腕在相机坐标系和机器人坐标系下的坐标。

运行代码

  1. 将代码保存为 hand_pose_robot.py
  2. 连接 Intel RealSense D435 相机。
  3. 在终端中运行代码:
python hand_pose_robot.py

运行结果

Wrist Coordinates (Camera): [0.04378617 0.0835716  0.58400005]
Wrist Coordinates (Robot): [ 0.04378617 -0.0835716   0.58400005]

调整与测试

在实际应用中,可能需要:

  • 根据 RealSense 相机的参数调整坐标转换公式。
  • 调整机器人坐标系的转换矩阵,以匹配相机与机器人之间的实际位置关系。
  • 增强代码的鲁棒性,处理深度数据的缺失情况。

四、总结

确保环境中已经安装了相关库,并且相机正常工作。运行后,窗口中将显示实时的手部检测结果,同时机器人末端会根据手腕位置进行重定向。可以实时监测手部动作并将其坐标转换为机器人坐标系,进而实现对机器人的控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1546751.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期:ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另:报错1-Error: Type mismatch between actual argument at (1) and a…

【项目】基于Linux和C++的动态在线视频点播系统设计

文章目录 1. 前言1.1 源码1.2 项目简介1.3 实现内容1.4 涉及技术 / 环境 2. 整体架构2.1 服务器功能2.2 服务器结构 3. 前提步骤3.1 思路分析3.2 创建视频表 4. 后端 基本功能实现(视频点播)4.1 服务端工具类实现4.2 日志输出类4.3 数据库/表 管理类4.4 …

前端开发之代理模式

介绍 代理模式是一种结构型设计模式,它通过为一个对象提供一个代理对象来控制对该对象的访问。代理对象可以在访问真实对象之前或之后添加一些额外的操作。 class RealImg {fileName: string;constructor(fileName: string) {this.fileName fileName;}disPlay()…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

优化java中 HashMap 的容量](capacity值)

我们很多人都知道,分配比我们所需更多的内存可能会对应用程序的性能产生负面影响。因此,使用带有容量的构造函数创建列表可能会产生很大的不同。 但是,使用Maps时,这个优化步骤可能不是那么简单。在本文中,我们将学习…

Django 基础之启动命令和启动配置修改

Django启动 django启动一般可以通过ide或者命令启动 ide启动: 启动命令: python manage.py runserver该命令后续可以增加参数,如: python manage.py runserver 8081 python manage.py runserver 127.0.0.1:8082 注意&#xff1…

PDF转换器哪个好?这5款PDF工具值得推荐

PDF转换器哪个好?选择一款优质的PDF转换器,能够极大地提升我们的工作效率与灵活性。它不仅能轻松实现PDF文件与Word、Excel、PPT等多种格式间的互转,还支持图片、TXT等多种格式的转换,满足多样化的办公与学习需求。此外&#xff0…

南卡首款耳夹开放式耳机,舒适与音质双双达行业峰值,再次“颠覆”行业!

近日,南卡Ultra夹耳式蓝牙耳机的正式上市,再次在蓝牙耳机圈内掀起波澜。这款耳机以其超舒适的夹耳式设计和卓越音质,为用户带来了全新的音乐体验,有望重新定义夹耳式耳机的市场标准。 南卡品牌背后有着强大的研发实力和丰富的行业…

一文读懂Service以及实践攻略

一文读懂Service以及实践攻略 目录 1 一文读懂 Kubernetes Service 以及实践攻略 1.1 1. 什么是 Service? 1.1.1 为什么需要 Service? 1.2 2. Service 的工作原理 1.2.1 核心概念1.2.2 流量转发过程 1.3 3. Service 的几种类型及应用场景 2 实践&#…

网络与信息安全工程师(工信部教育与考试中心)

在当今数字化时代,大量的敏感信息与业务流程在网络上传输和处理,使得网络与信息安全成为保障企业运营、政务管理以及金融交易等关键领域不可忽视的一环。 因此,对网络安全专家的需求日益增长。 例如,金融机构、大型电信运营商以…

云专线和虚拟专线是什么?两者有什么区别?

云专线和虚拟专线是两种用于企业网络连接的技术方案,它们各自有不同的特点和适用场景。下面将分别介绍这两种技术,并指出它们之间的主要区别。 云专线 云专线是一种物理的或逻辑的专用线路,它直接连接企业的本地数据中心或分支机构与云端服务…

为什么美联储降息和我国刺激措施可能提振铜价

美联储降低利率通常对铜价产生积极影响。这主要是由于利率与美元汇率之间的关系。当美联储降息时,往往会使美元对其他货币贬值。 由于全球市场上的铜价是以美元计价的,美元走弱会使用其他货币购买的金属价格更便宜。这可能刺激来自国际买家的需求&#x…

RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!

所有 AI Infra 都在探寻规格和性能的最佳平衡,如何构建高可用的云边端协同架构? 语音 AI 实现 human-like 的最后一步是什么? AI 视频的爆炸增长,给新一代编解码技术提出了什么新挑战? 当大模型进化到实时多模态&am…

【深度学习】(7)--神经网络之保存最优模型

文章目录 保存最优模型一、两种保存方法1. 保存模型参数2. 保存完整模型 二、迭代模型 总结 保存最优模型 我们在迭代模型训练时,随着次数初始的增多,模型的准确率会逐渐的上升,但是同时也随着迭代次数越来越多,由于模型会开始学…

亲测好用,吐血整理 ChatGPT 3.5/4.0新手使用手册~

都知道ChatGPT很强大,聊聊天、写论文、搞翻译、写代码、写文案、审合同等等,无所不能~ 那么到底怎么使用呢?其实很简单了,国内AI产品发展也很快,很多都很好用了~ 我一直在用,建议收藏下来~ 有最先进、最…

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录? 可以使用以下几种方法: 1. IP地址限制:在PHP中,可以通过获取客户端的IP地址,然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中,就禁止登录。 “php $…

U盘未格式化之谜:数据丢失与恢复全攻略

U盘未格式化问题描述 在日常的数字生活中,U盘作为便携的数据存储设备,扮演着不可或缺的角色。然而,不少用户都曾遭遇过这样的困境:当尝试访问未进行格式化操作的U盘时,却发现原本存储的文件竟然不翼而飞,U…

【机器学习】音乐生成——AI如何创作个性化音乐与配乐

我的主页:2的n次方_ 音乐是人类文化的重要组成部分,它具有极强的情感表达和艺术价值。近年来,随着人工智能技术的飞速发展,AI已经能够自动生成音乐,甚至根据用户需求创作个性化配乐。AI生成音乐的应用场景广泛&…

35岁java转大模型笔记,大模型智能体(LLM Agent)学习笔记

\1. 什么是大模型? 大模型对应的英文是Large Language Model(LLM),即大语言模型,简称大模型。技术层面讲,大模型是一种基于深度学习技术的机器学习模型。 为什么叫大模型呢?它是相对于小模型而…

代码随想录算法训练营第十四天|递归 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

226.翻转二叉树 翻转一棵二叉树。 思路: 在这里需要注意的是,在递归的时候唯独中序遍历是不可用的,这是因为先对左子树进行了反转,又对自身进行了反转,对自身反转后原本的左子树变成了右子树,如果此时又轮…