结合大语言模型的机械臂抓取操作学习

一、 大语言模型的机械臂抓取操作关键步骤

介绍如何基于大语言模型实现机械臂在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强大的代码生成能力,实现更加灵活和智能的机器人控制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19 Shell Script awk命令

Shell Script awk命令 一、awk 一)awk介绍 ​ awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分…

《深度学习》【项目】自然语言处理——情感分析 <上>

目录 一、项目介绍 1、项目任务 2、评论信息内容 3、待思考问题 1)目标 2)输入字词格式 3)每一次传入的词/字的个数是否就是评论的长度 4)一条评论如果超过32个词/字怎么处理? 5)一条评论如果…

【论文阅读】SRCNN

学习资料 论文题目:Learning a Deep Convolutional Network for Image Super-Resolution(学习深度卷积网络用于图像超分辨率)论文地址:link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf代码:作者提出的…

白平衡之乘积通道法

免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。 读者在使用本文信息时,应…

zabbix报警设置

文章目录 I 通过脚本媒介,调用钉钉电话API。配置脚本设置脚本媒介II 配置发送邮件的信息案例:配置163邮箱配置接收媒介创建动作知识扩展DING 2.0 发钉钉钉机器人自定义webhookzabbix执行远程命令I 通过脚本媒介,调用钉钉电话API。 zabbix可以通过脚本调用钉钉电话API,需要…

oneAPI学习-使用oneAPI 实现矩阵乘法并分析性能瓶颈

oneAPI学习-使用oneAPI 实现矩阵乘法并分析性能瓶颈 一.相关链接二.oneAPI介绍三.矩阵乘法简介四.环境准备五.获取设备列表六.基础版实现代码解释 七.局部内存实现代码解释 八.性能分析1.运行性能分析2.常见分析类型3.分析结果解读4.优化建议5.清理分析数据 oneAPI学习-使用one…

工程文件参考——STM32+HAL+SPI主从机通讯

文章目录 前言CubeMX设置SPI设置NSS设置 SPI从机代码SPI主机代码 前言 关于如何简单的写一个稳定的SPI主从机通讯,思路很简单 1、SPI高速传输的时候很容易出现错位之类的问题,CRC的校验首先是必要的。在STM32中SPI使用DMA通讯可以自动执行CRC的校验&…

Linux——Harbor(容器镜像 管理项目)

镜像拉取存在一定的问题,出现原因在于: 使用官方公共仓库中的镜像。 拉取的镜像,主要保存在一下仓库中: docker.io //Docker hub 最大的官方维护的公共镜像仓库,一般都会提供所有项目的最新版镜像,镜像…

springboot 整合 快手 移动应用 授权 发布视频 小黄车

前言: 因快手文档混乱,官方社区技术交流仍有很多未解之谜,下面3种文档的定义先区分。 代码中的JSON相关工具均用hutool工具包 1.快手 移动双端 原生SDK 文档https://mp.kuaishou.com/platformDocs/develop/mobile-app/ios.html 2.快手 Api 开…

物联网智能项目(含案例说明)

物联网(Internet of Things,简称IoT)智能项目是指利用物联网技术将各种物理设备、传感器、软件、网络等连接起来,实现设备之间的互联互通,并通过数据采集、传输、处理和分析,实现智能化管理和控制的项目。以…

LINUX---shell变量(或bash变量)和环境变量的区别

Shell 变量是特定于当前 shell 会话的变量。 作用范围:仅在当前 shell 会话中有效。如果你打开了多个终端窗口,每个窗口都有自己的一组 shell 变量,彼此独立。 生命周期:随着 shell 会话的结束而消失,不会传递给其他 …

Qt与下位机通信时,如何等待下位机回复和超时处理

在C或Qt中实现与下位机(例如嵌入式设备、传感器等)的通信,并且需要等待对方回复,如果几秒后没有收到回复则执行下一步动作,可以使用多种方法来实现这种超时机制。以下是几种常见的实现方式: 1. 使用 QTime…

springboot整合lombok

只需要引入lombok依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version></dependency> 然后application.yml配置文件中加上 logging: level: …

【Codeforces】CF 1082 G

Petya and Graph #网络流 #图论 #最小割 题目描述 Petya has a simple graph (that is, a graph without loops or multiple edges) consisting of n n n vertices and m m m edges. The weight of the i i i-th vertex is a i a_i ai​. The weight of the i i i-th…

Qt入门教程:创建我的第一个小程序

本章教程&#xff0c;主要介绍如何编写一个简单的QT小程序。主要是介绍创建项目的过程。 一、打开QT软件编辑器 这里使用的是QT5.14.2版本的&#xff0c;安装教程参考以往教程&#xff1a;https://blog.csdn.net/qq_19309473/article/details/142907096 二、创建项目 到这里&am…

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…

Flutter应用解析(一)

1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范&#xff0c;其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码&#xff08;为了阅…

【机器学习】朴素贝叶斯算法|商品评论情感分析案例介绍及代码实现

文章目录 朴素贝叶斯算法朴素贝叶斯算法介绍概率数学基础复习朴素贝叶斯算法-利用概率值进行分类的一种机器学习算法贝叶斯公式朴素贝叶斯算法拉普拉斯平滑系数 朴素贝叶斯API案例分析流程数据集代码实现运行结果 朴素贝叶斯算法 朴素贝叶斯算法介绍 概率数学基础复习 条件概…

linux中通过一个命令启动任何java的jar包

由于需要在linux中需要启动N多个jar包,以下是写的一个通用脚本: #!/bin/bash if [ $# -ne 2 ]; then echo "用法: $0 <命令> <模块名称>" exit 1 fi MODEL_NAME=$2 APP_NAME="${MODEL_NAME}" echo $APP_NAME JARFILE="${MODEL_NA…

架构设计笔记-11-未来信息综合技术

知识要点 云原生架构原则包括&#xff1a;服务化原则、弹性原则、可观测原则、韧性原则、所有过程自动化原则、零信任原则和架构持续演进原则。 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学方式保证的不可篡改和不可…