结合大语言模型的机械臂抓取操作学习
一、 大语言模型的机械臂抓取操作关键步骤
介绍如何基于大语言模型实现机械臂在PyBullet环境中的抓取操作,涵盖机器人运动学、坐标系转换、抓取候选位姿生成、开放词汇检测以及大语言模型代码生成等模块。
1. 机器人正逆运动学基本概念
正运动学: 已知机器人的关节角度,计算机器人末端执行器在空间中的位姿(位置和姿态)。
逆运动学:已知机器人末端执行器在空间中的目标位姿,计算机器人各关节角度使其达到目标位姿。
在PyBullet中,可以使用p.calculateInverseKinematics()函数进行逆运动学计算,p.getLinkState()函数获取机器人连杆状态,包括位置和姿态信息。
正运动学示例:已知关节角度,计算末端执行器位姿。
import pybullet as p# 连接到PyBullet物理引擎
p.connect(p.GUI)# 加载机器人模型
robot_id = p.loadURDF("path/to/robot.urdf")# 设置关节角度
joint_angles = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
for i in range(p.getNumJoints(robot_id)):p.resetJointState(robot_id, i, joint_angles[i])# 获取末端执行器位姿
link_state = p.getLinkState(robot_id, p.getNumJoints(robot_id) - 1)
end_effector_position = link_state[0]
end_effector_orientation = link_state[1]print("末端执行器位置:", end_effector_position)
print("末端执行器姿态:", end_effector_orientation)
逆运动学示例:已知末端执行器位姿,计算关节角度。
import pybullet as p# ... (连接到PyBullet,加载机器人模型)# 设置目标末端执行器位姿
target_position = [0.5, 0.5, 0.5]
target_orientation = [0, 0, 0, 1]# 计算逆运动学解
joint_angles = p.calculateInverseKinematics(robot_id, p.getNumJoints(robot_id) - 1, target_position, targetOrientation=target_orientation)# 设置关节角度
for i in range(p.getNumJoints(robot_id)):p.resetJointState(robot_id, i, joint_angles[i])print("关节角度:", joint_angles)
2. 坐标系转换
机器人系统通常涉及多个坐标系,例如世界坐标系、机器人基坐标系、相机坐标系等。为了实现抓取操作,需要进行坐标系之间的转换。
相机坐标系到世界坐标系:需要相机的外参矩阵(旋转和平移),可以使用p.getCameraImage()函数获取相机姿态信息,并进行转换。
世界坐标系到机器人基坐标系: 需要机器人基坐标系在世界坐标系中的位姿,可以使用p.getBasePositionAndOrientation()函数获取。
机器人基坐标系到末端执行器坐标系: 通过正运动学计算得到。
PyBullet提供了一些函数方便进行坐标系转换,例如p.multiplyTransforms()可以将两个变换矩阵相乘。
坐标系转换示例
import pybullet as p
import numpy as np# ... (连接到PyBullet,加载机器人模型,设置相机)# 获取相机位姿
view_matrix = p.computeViewMatrixFromYawPitchRoll(cameraTargetPosition=[0, 0, 0],distance=1.0,yaw=0,pitch=-30,roll=0,upAxisIndex=2)
projection_matrix = p.computeProjectionMatrixFOV(fov=60,aspect=1.0,nearVal=0.1,farVal=100.0)# 获取相机坐标系到世界坐标系的转换矩阵
cam_to_world = np.linalg.inv(np.reshape(view_matrix, (4, 4)))# 获取机器人基座坐标系到世界坐标系的转换矩阵
base_pos, base_orn = p.getBasePositionAndOrientation(robot_id)
base_to_world = np.eye(4)
base_to_world[:3, :3] = p.getMatrixFromQuaternion(base_orn)
base_to_world[:3, 3] = base_pos# 获取相机坐标系到机器人基座坐标系的转换矩阵
cam_to_base = np.dot(np.linalg.inv(base_to_world), cam_to_world)print("相机到世界坐标系:", cam_to_world)
print("机器人基座到世界坐标系:", base_to_world)
print("相机到机器人基座坐标系:", cam_to_base)
3. 基于点云的GraspNet抓取候选生成
GraspNet是一种基于深度学习的抓取姿态估计方法,可以从点云数据中预测多个抓取候选。
获取点云数据:使用RGB-D相机或激光雷达获取场景的点云数据。PyBullet可以使用p.getCameraImage()函数获取深度图,并将其转换为点云。
预处理点云: 对点云进行降采样、滤波等预处理操作。可以使用Open3D或PCL库进行点云处理。
使用GraspNet模型预测抓取候选: 将预处理后的点云输入GraspNet模型,得到多个抓取候选,包括抓取位置、方向和置信度 。
GraspNet抓取候选生成代码举例:
# 假设你已经获取了点云数据 (point_cloud)from graspnetAPI import GraspGroup# 加载GraspNet模型
grasp_net = GraspGroup(model_path="path/to/graspnet_model")# 生成抓取候选
gg = grasp_net.detectGrasp(point_cloud)# 获取抓取姿态和得分
grasps = gg.grasp_group_arrayprint("抓取候选:", grasps)
4. 开放词汇检测对候选进行筛选
为了实现基于自然语言指令的抓取,需要使用开放词汇检测技术识别目标物体。
目标检测: 使用目标检测模型(如YOLOv5)对相机图像进行目标检测,获取目标物体的位置和类别信息。
投影到像素坐标系: 将GraspNet生成的抓取候选从世界坐标系投影到相机像素坐标系。
筛选抓取候选: 判断抓取候选是否位于目标物体的检测框内,并选择置信度最高的抓取候选。
# 假设你已经获取了目标检测结果 (detections)# 遍历抓取候选
filtered_grasps = []
for grasp in grasps:# 将抓取中心点投影到像素坐标系grasp_center_pixel = project_point_to_pixel(grasp.center, view_matrix, projection_matrix)# 检查抓取中心点是否在目标检测框内for detection in detections:if detection.class_name == "red box" and is_point_in_bbox(grasp_center_pixel, detection.bbox):filtered_grasps.append(grasp)breakprint("筛选后的抓取候选:", filtered_grasps)
5. 通过Prompt调用LLM生成规划代码
使用大语言模型(LLM)根据自然语言指令生成抓取规划代码。
DeepSeek v2 API: 可以通过API调用DeepSeek的大语言模型。
Prompt设计: 你是一个机器人,你拥有的技能API如下:
1. get_grasp_by_name(name_text): 输入类别文本,返回检测候选抓取的list
2. execute_grasp(grasp): 输入候选抓取的list,然后执行抓取
现在需要你根据你所拥有的技能API,编写python代码完成给你的任务,只输出plan函数,不要输出其他代码以为的内容。你的任务是“抓取红色的盒子”。调用LLM API: 将Prompt发送给LLM API (例如DeepSeek v2 API),获取生成的Python代码。
执行代码:解析LLM生成的代码,并执行plan()函数,完成抓取操作。
本示例代码演示如何使用大语言模型 (LLM) 和 PyBullet 仿真环境实现机械臂抓取红色盒子。
import deepseek# 初始化DeepSeek API
api_key = "YOUR_API_KEY"
client = deepseek.Client(api_key)# 定义API描述和任务
api_description = """
你是一个机器人,你拥有的技能API如下:
1. get_grasp_by_name(name_text): 输入类别文本,返回检测候选抓取的list
2. execute_grasp(grasp): 输入候选抓取的list,然后执行抓取
"""task_description = "抓取红色盒子"# 生成规划代码
prompt = f"{api_description}\n现在需要你根据你所拥有的技能API,编写python代码完成给你的任务,只输出plan函数,不要输出其他代码以为的内容。你的任务是“{task_description}”"
response = client.generate_code(prompt)
plan_code = response.code# 执行规划代码
exec(plan_code)
plan()
二、完整示例代码:
import pybullet as p
import numpy as np
from graspnetAPI import GraspGroup
import deepseek# ... (定义project_point_to_pixel和is_point_in_bbox函数)# 连接到PyBullet物理引擎
p.connect(p.GUI)# 加载机器人模型
robot_id = p.loadURDF("path/to/robot.urdf")# ... (设置相机)# 获取点云数据
point_cloud = get_point_cloud()# 生成抓取候选
grasp_net = GraspGroup(model_path="path/to/graspnet_model")
gg = grasp_net.detectGrasp(point_cloud)
grasps = gg.grasp_group_array# 获取目标检测结果
detections = get_detections()# 筛选抓取候选
filtered_grasps = []
for grasp in grasps:grasp_center_pixel = project_point_to_pixel(grasp.center, view_matrix, projection_matrix)for detection in detections:if detection.class_name == "red box" and is_point_in_bbox(grasp_center_pixel, detection.bbox):filtered_grasps.append(grasp)break# 调用LLM生成规划代码
api_key = "YOUR_API_KEY"
client = deepseek.Client(api_key)
api_description = """
你是一个机器人,你拥有的技能API如下:
1. get_grasp_by_name(name_text): 输入类别文本(注意是英文,要简短),返回检测候选抓取的list
2. execute_grasp(grasp): 输入候选抓取的list,然后执行抓取
"""
task_description = "抓取红色盒子"
prompt = f"{api_description}\n现在需要你根据你所拥有的技能API,编写python代码完成给你的任务,只输出plan函数,不要输出其他代码以为的内容。你的任务是“{task_description}”"
response = client.generate_code(prompt)
plan_code = response.code# 定义API函数
def get_grasp_by_name(name_text):# ... (根据name_text筛选抓取候选,例如返回filtered_grasps)passdef execute_grasp(grasp):# ... (执行抓取操作,例如使用逆运动学控制机器人)pass# 执行规划代码
exec(plan_code)
plan()
注意:
- 以上代码仅为示例,需要根据实际情况进行修改和完善。
- 需要安装PyBullet, GraspNet API, DeepSeek SDK等相关库。
- 需要替换
path/to/robot.urdf
,path/to/graspnet_model
,YOUR_API_KEY
等占位符。 - 需要实现
project_point_to_pixel
,is_point_in_bbox
,get_point_cloud
,get_detections
,get_grasp_by_name
,execute_grasp
等函数。
三、总结
结合了机器人学、计算机视觉和自然语言处理技术,实现了基于大语言模型的机械臂抓取操作。通过合理的Prompt设计和API定义,可以利用LLM强大的代码生成能力,实现更加灵活和智能的机器人控制。
相关文章:
结合大语言模型的机械臂抓取操作学习
一、 大语言模型的机械臂抓取操作关键步骤 介绍如何基于大语言模型实现机械臂在PyBullet环境中的抓取操作,涵盖机器人运动学、坐标系转换、抓取候选位姿生成、开放词汇检测以及大语言模型代码生成等模块。 1. 机器人正逆运动学基本概念 正运动学: 已知机器人的关节…...

数据结构-二叉树_堆
一. 树的概念 树在我们的日常生活中随处可见,人们将生活中的树转换成存放数据的树形结构,就成了数据结构中的“树”。 如上图所示,自然界中的树有树根,有树枝,有树叶,当我们将其转换成树形结构时…...

Vscode+Pycharm+Vue.js+WEUI+django火锅(三)理解Vue
新创建的Vue项目里面很多文件,对于新手,老老实实做一下了解。 1.框架逻辑 框架的逻辑都是相通的,花点时间理一下就清晰了。 2.文件目录及文件 创建好的vue项目下,主要的文件和文件夹要先认识一下,并与框架逻辑对应起…...
溯变:守护天使 | OPENAIGC开发者大赛企业组优秀作品
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...

android中byte[] buf没有结束符,new String(buf)会不会出错?
答案是:不会 看例子: 这和c是不一样的,不需要特别的在字符串后面添加一个\0结束....

鸿蒙harmonyos next flutter混合开发之开发plugin(获取操作系统版本号)
创建Plugin为my_plugin flutter create --org com.example --templateplugin --platformsandroid,ios,ohos my_plugin 创建Application为my_application flutter create --org com.example my_application flutter_application引用flutter_plugin,在pubspec.yam…...

介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
首先附上大神的开源地址(自行克隆吧): https://github.com/Wanderson-Magalhaes/Modern_GUI_PyDracula_PySide6_or_PyQt6 步骤一:安装PySide6库 pip install PySide6 步骤二:运行main文件 python main.py 就得…...

【大模型】AI数据基础设施的对象存储
官网地址: MinIO | S3 Compatible Storage for AI Github地址: https://github.com/minio/minio 企业级,并对AI准备就绪的分布式对象存储(一般拿来存模型文件) 部署步骤参考: minio安装部署及…...
【前端工程解耦】使用事件中心实现系统解耦,注册,触发,删除事件
前言 事件中心提供了一种灵活且可扩展的方式来管理事件和处理函数之间的关系,同时保持它们之间的解耦,可以降低系统耦合度,将视图和逻辑拆分出来,还是那句话,如果一个中间件解决不了问题,那就再加一个 废话…...

计算机网络803-(4)网络层
目录 1.虚电路服务 虚电路是逻辑连接 2.数据报服务 3.虚电路服务与数据报服务的对比 二.虚拟互连网络-IP网 1.网络通信问题 2.中间设备 3.网络互连使用路由器 三.分类的 IP 地址 1. IP 地址及其表示方法 2.IP 地址的编址方法 3.分类 IP 地址 (1&#x…...
java速成指南
密码都是 123 适用于php .net 7天转java 【腾讯文档】快速上手培训-阿龙 分享给你多个文件 https://docs.qq.com/s/jUcRQ4VPA4grzx8SPYzrBa 第一节 安装jdk,maven,idea_哔哩哔哩_bilibili...

【Unity】双摄像机叠加渲染
一、前言 之前我在做我的一个Unity项目的时候,需要绘制场景网格的功能,于是就用到了UnityEngine.GL这个图形库来绘制,然后我发现绘制的网格线是渲染在UI之后的,也就是说绘制出来的图形会遮盖在UI上面,也就导致一旦这些…...
web网页项目--用户登录,注册页面代码
index.html <!DOCTYPE html> <html lang"zxx"><head><title>xxx注册</title><!-- Meta tags --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…...

国外火出圈儿的PM御用AI编程工具Bolt.new效果干不过国产的CodeFlying?号称全新定义全栈开发流程?
不知道大家最近有没有发现国外的很多AI都在挤破脑袋想去提升大模型的编程能力, 离我们最近的是上周Openai 发布的全新模型GPT-4o-Canvas, 拥有超强的代码编写能力。 另外还有LlamaCoder、Cursor、Claude artifacts、Replit... 光是今年一年就推出了好…...
爸妈总说着学门技术,学机器视觉技术确实是一条踏实的生活道路,这条路你走得下去走得通吗?
你爸妈说的对,有一技之长终身受益,人要有一技傍身。学一门技术是稳定职业与生活的基本的保障,但是与其盲目的选择一门技术,都是成年人,不如思考下这门技术给自我带来经济效益,在这一方面可以详细咨询我。 …...

2024互联网下载神器IDM6.42你值得拥有
🔥 互联网下载神器大揭秘!IDM6.42你值得拥有 🚀 Hey,各位小伙伴们,今天我要给你们安利一款我超爱的软件——Internet Download Manager 6.42(简称IDM),这款下载器简直就是下载界的“…...

基于H3C环境的实验——OSPF
目录 实验设备和环境 实验设备 实验环境 实验记录 1、单区域 OSPF基本配置 步骤1:搭建实验环境并完成基本配置 步骤2:检查网络连通性和路由器路由表。 步骤3:配置OSPF 步骤4:检查路由器OSPF邻居状态及路由表 实验设备和环境 实验设备 三台路由器、两台PC、电源线、两…...
java线程池详解
在Java中,线程池是一种重要的多线程处理方式,通过管理和复用线程,提高应用程序的性能和响应速度,减少线程创建和销毁的开销,避免线程数量过多导致系统负载过高的问题。本文将详细介绍Java线程池的概念、核心参数、工作…...
五、创建型(建造者模式)
建造者模式 概念 建造者模式是一种创建型设计模式,通过使用多个简单的对象一步步构建一个复杂的对象。它将一个复杂对象的构建过程与其表示分离,从而使同样的构建过程可以创建不同的表示。 应用场景 复杂对象构建:当一个对象有多个属性&…...

CPU超线程技术是什么,怎么启用超线程技术
超线程技术是一种允许单个物理CPU核心模拟成两个逻辑核心的技术,从而提升处理器的并行性能和效率。以下是对超线程技术的详细介绍: 基本概念:超线程(Hyper-Threading,HT)是Intel公司研发的一种技术&#x…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...