结合大语言模型的机械臂抓取操作学习
一、 大语言模型的机械臂抓取操作关键步骤
介绍如何基于大语言模型实现机械臂在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…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
