【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导,为灵巧手生成精细抓取策略

通过单独调整每个手指的接触来实现更稳定的抓取,从而提供了更接近人类能力的抓取指导。

论文地址:GrainGrasp: Dexterous Grasp Generation with Fine-grained Contact Guidance

代码地址:https://github.com/wmtlab/GrainGrasp

看一下抓取效果:

看一物体CAD的抓取效果

不同视角观察:

1、创建Conda环境

首先创建一个Conda环境,名字为GrainGrasp,python版本为3.9

然后进入GrainGrasp环境

conda create -n GrainGrasp python=3.9
conda activate GrainGrasp

2、安装PyTorch

我们使用的版本是pytorch==2.0.1+cu118

执行下面命令进行安装:

conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.8 -c pytorch -c nvidia

3、安装GrainGrasp依赖库

下载GrainGrasp代码,然后进行GrainGrasp-main目录中

代码地址:https://github.com/wmtlab/GrainGrasp

创建一个文件requirements.txt,编写内容:

numpy==1.23.0
open3d==0.17.0
trimesh==4.1.7
attrdict==2.0.1
mano
chumpy==0.70

开始安装啦

pip install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple

等待安装完成~

4、安装pytorch3d

访问 PyTorch3D 官方下载页面,找到与我们的环境匹配的 PyTorch3D 0.7.5 安装包

名称:pytorch3d-0.7.5-py39_cu118_pyt201.tar.bz2

然后下载并安装:

conda install pytorch3d-0.7.5-py39_cu118_pyt201.tar.bz2

5、模型推理

首先从MANO网站下载MANO模型文件(MANO_LEFT.pkl、MANO_RIGHT.pkl),到mano/models/目录中

手部支持的自由度:

这个配置文件整合了多个模块的路径和参数设置,用于手部和物体的 3D 重建和姿态估计任务。

每个模块的配置都包含了必要的路径和训练参数,以便在实际运行时能够正确加载数据和模型,并进行有效的训练和测试。

运行示例1:

python run_complete.py -i=8 -s=1234

看一下抓取效果:

看一物体CAD的抓取效果:

run_complete.py 源代码:

import os
import time
import torch
import trimesh
import argparse
import numpy as np
import open3d as o3d
from utils import annotate
from utils import vis
from utils import tools
from config import cfgs
from GrainGrasp import GrainGraspif __name__ == "__main__":# 设置设备为 GPU 或 CPUdevice = "cuda" if torch.cuda.is_available() else "cpu"# 创建命令行参数解析器parge = argparse.ArgumentParser(description="GrainGrasp")parge.add_argument("--idx", "-i", type=int, default=2, help="物体的索引")parge.add_argument("--epochs", "-e", type=int, default=300, help="优化的轮数")parge.add_argument("--threshold", "-t", type=float, default=0.0, help="阈值")parge.add_argument("--select", "-s", type=str, default="12345", help="选择的手指索引,最多5根手指:12345")parge.add_argument("--vis_pc", "-vp", type=bool, default=True, help="是否可视化点云")parge.add_argument("--vis_mesh", "-vm", type=bool, default=True, help="是否可视化网格")parge.add_argument("--vis_process", "-vprocess", type=bool, default=True, help="是否可视化优化过程")args = parge.parse_args()# 将选择的手指索引从字符串转换为整数列表select_finger_idx = list(map(lambda x: int(x), args.select))# 从配置文件中获取采样点数量sample_points_num = cfgs.obman_config.sample_points_num# 加载物体的三维网格模型obj_path = os.path.join("sample", str(args.idx), "obj_mesh.obj")obj_mesh = trimesh.load_mesh(obj_path)# 从网格中采样点云数据(备用方法)# obj_pc = tools.pc_sample(obj_mesh, sample_points_num)# 从文件加载点云数据obj_pc_path = os.path.join("sample", str(args.idx), "obj_pc.npy")  # 点云数据形状为 [3, 3000]obj_pc = np.load(obj_pc_path).T  # 转置为 [3000, 3]obj_pc = torch.Tensor(obj_pc)  # 转换为 PyTorch 张量# 初始化 GrainGrasp 模型grain_grasp = GrainGrasp(cfgs.dcog_config, cfgs.cvae_model_path, device)# 开始计时time_start = time.time()# 执行推理过程,获取抓取姿态优化结果result = grain_grasp.inference_complete(obj_pc,epochs=args.epochs,select_finger_idx=select_finger_idx,threshold=args.threshold,)print("运行时间是 {:.2f} 秒".format(time.time() - time_start))print("能量值为 ", result.E_pen)print("最小能量索引为 ", result.min_idx)hand_pc_final = result.min_idx_hand_pc # 获取优化后的手部点云数据hand_face = grain_grasp.dcog_model.rh_faces[0].cpu() # 获取手部网格的面数据hand_color = annotate.get_finger_colors(hand_pc_final) # 为手部点云数据分配颜色# 创建手部网格的 Open3D对象hand_mesh_o3d = vis.get_o3d_mesh(hand_pc_final, hand_face, [0, 0.8, 1], hand_color)obj_colors_true = annotate.get_obj_colors(result.obj_cls.cpu()) # 为物体点云数据分配颜色obj_pcd = vis.get_o3d_pcd(obj_pc.cpu().detach(), obj_colors_true)obj_mesh_o3d = vis.trimesh2o3d(obj_mesh)# 如果设置为可视化点云,则显示手部和物体点云if args.vis_pc:vis.vis_HandObject([hand_mesh_o3d], [obj_pcd])# 如果设置为可视化网格,则显示手部和物体网格if args.vis_mesh:vis.vis_HandObject([hand_mesh_o3d], [obj_mesh_o3d])# 如果设置为可视化优化过程,则显示优化过程if args.vis_process:record_hand_pc = result.min_idx_record_hand_pcrecord_handmesh_o3d = vis.get_o3d_mesh(record_hand_pc[0], hand_face, [0, 0.8, 1], hand_color)vis.vis_GraspProcess(record_handmesh_o3d, record_hand_pc[1:], obj_mesh_o3d)

思路流程

  1. 设备设置

    • 检查是否有可用的 GPU 设备,如果有则使用 GPU,否则使用 CPU。

  2. 参数解析

    • 使用 argparse 解析命令行参数,设置物体索引、优化轮数、阈值、手指选择、可视化选项等。

  3. 数据加载

    • 加载物体的三维网格模型(obj_mesh.obj)。

    • 从文件加载物体点云数据(obj_pc.npy),并将其转换为 PyTorch 张量。

  4. 模型初始化

    • 初始化 GrainGrasp 模型,加载预训练模型路径(cfgs.cvae_model_path)。

  5. 推理过程

    • 调用模型的 inference_complete 方法进行抓取姿态优化。

    • 传入物体点云数据、优化轮数、手指索引和阈值等参数。

    • 计算运行时间并输出优化结果(能量值和最小能量索引)。

  6. 结果可视化

    • 将优化后的手部点云数据和物体点云/网格模型进行可视化。

    • 如果设置为可视化点云,则显示手部网格和物体点云。

    • 如果设置为可视化网格,则显示手部网格和物体网格。

    • 如果设置为可视化优化过程,则显示优化过程中的手部姿态变化。

运行示例2:

python run_only_opt.py -i=4 -s=134

看一下抓取效果

看一物体CAD的抓取效果:

run_only_opt.py 源代码:

import os
import time
import torch
import trimesh
import argparse
import numpy as np
import open3d as o3d
from utils import annotate
from utils import vis
from utils import tools
from utils import Load_obman
from config import cfgs
from GrainGrasp import GrainGraspif __name__ == "__main__":# 设置设备为 GPU 或 CPUdevice = "cuda" if torch.cuda.is_available() else "cpu"# 初始化命令行参数解析器parge = argparse.ArgumentParser(description="GrainGrasp")parge.add_argument("--idx", "-i", type=int, default=2, help="物体的索引")parge.add_argument("--epochs", "-e", type=int, default=300, help="优化的轮数")parge.add_argument("--K", "-k", type=int, default=50, help="优化过程中的参数 K")parge.add_argument("--threshold", "-t", type=float, default=0.0, help="优化过程中的阈值")parge.add_argument("--select", "-s", type=str, default="12345", help="选择的手指索引,最多5根手指:12345")parge.add_argument("--vis_pc", "-vp", type=bool, default=True, help="是否可视化点云")parge.add_argument("--vis_mesh", "-vm", type=bool, default=True, help="是否可视化网格")parge.add_argument("--vis_process", "-vprocess", type=bool, default=True, help="是否可视化优化过程")args = parge.parse_args()# 将选择的手指索引从字符串转换为整数列表select_finger_idx = list(map(lambda x: int(x), args.select))# 从配置文件中获取采样点数量sample_points_num = cfgs.obman_config.sample_points_num# 构造物体网格模型路径obj_path = os.path.join("sample", str(args.idx), "obj_mesh.obj")# 加载物体网格模型obj_mesh = trimesh.load_mesh(obj_path)# 从网格中采样物体点云数据obj_pc = tools.pc_sample(obj_mesh, sample_points_num)# 构造手部点云数据路径hand_pc_path = os.path.join("sample", str(args.idx), "hand_pc.npy")  # [3,3000]# 加载手部点云数据hand_pc = np.load(hand_pc_path)obj_pc = torch.Tensor(obj_pc)hand_pc = torch.Tensor(hand_pc)# 初始化 GrainGrasp 模型grain_grasp = GrainGrasp(cfgs.dcog_config, None, device)# 开始计时time_start = time.time()# 执行优化过程,获取抓取姿态优化结果result = grain_grasp.inference_only_opt(obj_pc,hand_pc=hand_pc,K=args.K,epochs=args.epochs,select_finger_idx=select_finger_idx,threshold=args.threshold,)print("运行时间是 {:.2f} 秒".format(time.time() - time_start))print("能量值为 ", result.E_pen)print("最小能量索引为 ", result.min_idx)# 获取优化后的手部点云数据hand_pc_final = result.min_idx_hand_pc# 获取手部网格的面数据hand_face = grain_grasp.dcog_model.rh_faces[0].cpu()# 为手部点云数据分配颜色hand_color = annotate.get_finger_colors(hand_pc_final)# 创建手部网格的 Open3D 对象hand_mesh_o3d = vis.get_o3d_mesh(hand_pc_final, hand_face, [0, 0.8, 1], hand_color)# 为物体点云数据分配颜色obj_colors_true = annotate.get_obj_colors(result.obj_cls.cpu())# 创建物体点云的 Open3D 对象obj_pcd = vis.get_o3d_pcd(obj_pc.cpu().detach(), obj_colors_true)# 将 Trimesh 格式的物体网格转换为 Open3D 格式obj_mesh_o3d = vis.trimesh2o3d(obj_mesh)# 如果设置为可视化点云,则显示手部和物体点云if args.vis_pc:vis.vis_HandObject([hand_mesh_o3d], [obj_pcd])# 如果设置为可视化网格,则显示手部和物体网格if args.vis_mesh:vis.vis_HandObject([hand_mesh_o3d], [obj_mesh_o3d])# 如果设置为可视化优化过程,则显示优化过程if args.vis_process:record_hand_pc = result.min_idx_record_hand_pcrecord_handmesh_o3d = vis.get_o3d_mesh(record_hand_pc[0], hand_face, [0, 0.8, 1], hand_color)vis.vis_GraspProcess(record_handmesh_o3d, record_hand_pc[1:], obj_mesh_o3d)

思路流程

  1. 设备设置与参数解析

    • 检查是否有可用的 GPU 设备,如果有则使用 GPU,否则使用 CPU。

    • 使用 argparse 解析命令行参数,设置物体索引、优化轮数、参数 K、阈值、手指选择、可视化选项等。

  2. 数据加载

    • 加载物体的三维网格模型(obj_mesh.obj)。

    • 从物体网格模型中采样点云数据(tools.pc_sample)。

    • 从文件加载手部点云数据(hand_pc.npy),并将其转换为 PyTorch 张量。

  3. 模型初始化

    • 初始化 GrainGrasp 模型,不加载预训练模型路径(None)。

  4. 优化过程

    • 调用模型的 inference_only_opt 方法进行抓取姿态优化。

    • 传入物体点云数据、手部点云数据、参数 K、优化轮数、手指索引和阈值等参数。

    • 计算运行时间并输出优化结果(能量值和最小能量索引)。

  5. 结果可视化

    • 将优化后的手部点云数据和物体点云/网格模型进行可视化。

    • 如果设置为可视化点云,则显示手部网格和物体点云。

    • 如果设置为可视化网格,则显示手部网格和物体网格。

    • 如果设置为可视化优化过程,则显示优化过程中的手部姿态变化。

分享完成~

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

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

相关文章

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具,而 AWX 则是 Ansible 的开源 Web 管理平台,提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX,使用 M…

Vulhub-jangow-01-1.0.1通关攻略

第0步: 打开靶机,按下shift,出现下图界面 在此页面按下e键,进入如下界面, 将ro 替换为 rw signie init/bin/bash 替换完毕后,按下Ctrl键X键,进入如下页面 ip a查看网卡信息 编辑配置文件网卡信…

默克生命科学 | ProClin™安全、高效防腐剂

ProClin™防腐剂是水溶性抗菌剂,是体外诊断(IVD)行业中最有效的抗菌剂之一,广泛应用于行业领先的诊断生产商的1,000多种FAD注册IVD试剂盒。低工作浓度下,ProClin™产品有效快速地抑制广谱微生物,有助于延长IVD试剂的保质期。 有别…

const应用

最近学校的花开了&#xff0c;选了一张三号楼窗前的白玉兰&#xff0c;(#^.^#) 1.修饰普通变量 当 const 用于修饰普通变量时&#xff0c;该变量的值在初始化之后就不能再改变。 #include <stdio.h>int main() {const int num 10;// num 20; // 错误&#xff0c;不…

FastStoneCapture下载安装教程(附安装包)专业截图工具

文章目录 前言FastStoneCapture下载FastStoneCapture安装步骤FastStoneCapture使用步骤 前言 在日常工作与学习里&#xff0c;高效截图工具至关重要。本教程将为你呈现FastStoneCapture下载安装教程&#xff0c;助你轻松拥有。 FastStoneCapture下载 FastStone Capture 是一款…

3. 轴指令(omron 机器自动化控制器)——>MC_ResetFollowingError

机器自动化控制器——第三章 轴指令 13 MC_ResetFollowingError变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启动运动指令▶多重启运动指令▶异常 MC_ResetFollowingError 对指令当前位置和反馈当前位置的偏差进行复位。 指令名称FB/FUN图形表现S…

【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解

《从咖啡杯到财务自由&#xff1a;一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 &#x1f31f; 这是小游戏开发系列的第四篇送福利文章&#xff0c;感谢一路以来支持和关注这个项目的每一位朋友&#xff01; &#x1f4a1; 文章力求严谨&#xff0c;但难免有疏漏之…

举例说明自然语言处理(NLP)技术

当我们使用智能助手或社交媒体平台时&#xff0c;就会接触到自然语言处理&#xff08;NLP&#xff09;技术的应用。以下是一些常见的例子&#xff1a; 语音识别&#xff1a;当我们与智能助手如Siri、Alexa或Google Assistant交互时&#xff0c;我们说出语音命令&#xff0c;系统…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…

【设计模式】组合模式

第11章 组合模式 11.1 一个基本的目录内容遍历范例 组合模式用于处理树形结构数据&#xff0c;如操作系统目录。以下是目录遍历的非组合模式实现&#xff1a; 文件类定义 class File { public:File(string name) : m_sname(name) {}void ShowName(string lvlstr) {cout <…

DSP28335 eCAN(增强型控制器局域网)

一、概述 1.1 特征 can协议2.0 ,高达1Mbps32个邮箱 1)—可配置接收或发送—可配置标准或扩展标识符—接收标识符屏蔽功能—支持数据和远程帧—支持0到8字节的数据帧—在接收和发送的消息上使用32位时间戳(发送接收计时器)—接收新消息保护—允许动态可编程的发送消息优先…

现代控制原理

一、在状态空间中&#xff0c;建立控制系统的数学模型 如&#xff1a;有单输入&#xff08;U)--单输出&#xff08;Y)控制系统&#xff0c;其状态方程和输出方程如下图&#xff1a; 二、画状态结构图 将上述状态方程转化为状态结构图有&#xff1a; 三、高阶控制系统的状态方…

【Git】基础使用

Git基础使用 基础配置工作区-暂存区-版本库添加文件修改文件版本回退撤销修改删除文件分支管理强制删除分支 基础配置 初始化仓库&#xff1a; git init # 此时就会生成一个 .git 的文件夹&#xff0c;切勿修改或删除文件夹里的内容配置仓库——名字&#xff1a; git config…

系统与网络安全------网络应用基础(2)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 交换机 认识交换机 交换机&#xff0c;Switch 用户将多台计算机/交换机连接在一起&#xff0c;组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信 非网管型交换机 即插即用交换机 即插即用&…

【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】

固件作用 打通了网络和硬件的沟通 修改固件实现【改变连接到小智服务器的】 回答逻辑LLM自定义 自定义了Coze&#xff08;比较高级&#xff0c;自定义程度比较高&#xff0c;包括知识库&#xff0c;虚拟脚色-恋人-雅思老师-娃娃玩具{可能需要使用显卡对开源模型进行微调-产…

蓝桥杯——嵌入式学习日记

因为lED和LCD共用PC8~PC15引脚&#xff0c;要通过锁存&#xff08;LE&#xff09;和&#xff08;GPIOC->ODR&#xff09;来避免LED和LCD引脚冲突 修改点: main.c中&#xff0c;GPIO初始化引脚后&#xff0c;LE&#xff08;PD2引脚低电平锁存&#xff0c;退出透明模式&…

Liunx系统Microsoft SQL Server数据库还原

1.确认Linux系统已安装SQLServer服务并启动 2.在Windows中使用SSMS连接原数据库与Linux远程数据库服务 3.备份 成功备份如下 4.上传bak文件到远程Linux服务器 登陆Linux服务并创建数据库文件夹 退出Linux服务

【学习资源】多元时序分析问题和时序图模型

工业数据分析领域中&#xff0c;多元时序数据分析是一个广泛的问题。今天和大家简单介绍多元时序预测、聚类、分类、时序图模型和相应的深度学习库。 图片来源&#xff1a;https://www.researchgate.net/publication/349207209_Multivariate_Time-Series_Anomaly_Detection_via…

QT二 QT使用generate form 生成常用UI,各种UI控件

一 。没有使用general form 和 使用 general form 后&#xff0c;file层面和代码层面的不同比较 file层面的不同 代码层面的不同&#xff0c; 在 使用了general form之后&#xff0c;在主界面的构造方法中&#xff0c;使用ui->setupUi(this),就完成了所有UI的处理。 而之…

Haption力反馈遥操作机器人:6自由度高精度技术,定义远程操作新标准

Haption在力反馈遥操作机器人技术领域展现了强大的创新能力。其核心技术——力反馈技术&#xff0c;通过提供高度逼真的触觉反馈&#xff0c;显著提升了远程操作的精确性与用户体验。这种技术在工业、医疗等高要求场景中表现出色&#xff0c;同时也为科研和教育领域提供了有力支…