# EmbodiedGrasping **Repository Path**: liao-mingyu11/embodied-grasping ## Basic Information - **Project Name**: EmbodiedGrasping - **Description**: simple embodied-grasping - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2024-09-22 - **Last Updated**: 2024-09-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Emboided Grasping In One Grasp检测代码从https://github.com/graspnet/graspnet-baseline 移植而来,不过官方原本代码需要cuda 10.1和pytorch 1.6.很多新卡无法安装cuda 10.1,并且cuda 11后的api进行了变化,所以把修改后的knn代码集成在了本仓库,位置在libs下面。测试环境为Ubuntu 20.04 RTX3090 cuda 11.8 依赖: ``` torch==2.1.0 pybullet open3d transforms3d==0.4.2 ultralytics==8.2.32 numpy==1.24.4 flask opencv-python grasp_nms ``` ### 安装 首先安装GraspNet 1B需要的KNN、Pointnet2: ``` cd libs/knn python setup.py install cd libs/pointnet2 python setup.py install ``` ### 抓取模块 6D抓取姿态生成采用GraspNet 1B,输入是点云,输出带有Score的多个抓取姿态 ![](assets/demo.png) ### 开放词汇目标检测 开放词汇目标检测采用Ultralytics的Yolov8-world-v2版本,使用Flask将目标检测封装成一个Http接口。然后客户端将图片base64编码以及指定的类别文本传给服务端,执行检测 执行一下脚本将检测服务启动: ``` cd yolo_world python yolo_world.py ``` 服务启动之后可以运行```python demo.py```进行测试: ```python image_path = '1.jpg' # 替换为你的图片路径 classes = ['banana'] # 替换为你需要的类别 detections = send_detection_request(image_path, classes) draw_detections(image_path, detections) ``` 得到结果: ![alt text](assets/yolow.png) ### LLM调用API 使用DeepSeek-v2的api进行调用,申请api-key(https://platform.deepseek.com/api_keys)之后保存到keys.txt里面,调用的Prompt模板为: ``` 你是一个机器人,你拥有的技能API如下: 1.get_grasp_by_name(name_text): 输入类别文本(注意是英文,要简短),返回检测候选抓取的list 2.execute_grasp(grasp): 输入候选抓取,然后执行抓取 现在需要你根据你所拥有的技能API,编写python代码完成给你的任务,只输出plan函数,不要输出其他代码以为的内容。你的任务是“帮我拿一下香蕉吧”。 ``` 下面是一个示例: 输入: ``` 你是一个机器人,你拥有的技能API如下: 1.get_grasp_by_name(name_text): 输入类别文本(注意是英文,要简短),返回检测候选抓取的list 2.execute_grasp(grasp): 输入候选抓取,然后执行抓取 现在需要你根据你所拥有的技能API,编写python代码完成给你的任务,只输出plan函数,不要输出其他代码以为的内容。你的任务是“”。 ``` 输出: ``` def plan(): # 定义类别文本为"banana" name_text = "banana" # 调用get_grasp_by_name API获取候选抓取列表 grasps = get_grasp_by_name(name_text) # 调用execute_grasp API执行抓取 execute_grasp(grasps[0]) ``` 然后程序会自动提取plan函数,进行执行 完整运行: 先启动yolo_world服务: ``` cd yolo_world python yolo_world.py ``` 再开一个新终端 ``` python demo_graspnet2.py ``` 环境可以参考如下: ``` # This file may be used to create an environment using: # $ conda create --name --file # platform: linux-64 _libgcc_mutex=0.1=main _openmp_mutex=5.1=1_gnu addict=2.4.0=pypi_0 annotated-types=0.7.0=pypi_0 anyio=4.4.0=pypi_0 asttokens=2.4.1=pypi_0 attrs=24.2.0=pypi_0 backcall=0.2.0=pypi_0 blinker=1.8.2=pypi_0 ca-certificates=2024.7.2=h06a4308_0 certifi=2024.7.4=pypi_0 charset-normalizer=3.3.2=pypi_0 click=8.1.7=pypi_0 clip=1.0=pypi_0 comm=0.2.2=pypi_0 configargparse=1.7=pypi_0 contourpy=1.1.1=pypi_0 cycler=0.12.1=pypi_0 cython=3.0.11=pypi_0 dash=2.17.1=pypi_0 dash-core-components=2.0.0=pypi_0 dash-html-components=2.0.0=pypi_0 dash-table=5.0.0=pypi_0 decorator=5.1.1=pypi_0 distro=1.9.0=pypi_0 exceptiongroup=1.2.2=pypi_0 executing=2.0.1=pypi_0 fastjsonschema=2.20.0=pypi_0 filelock=3.15.4=pypi_0 flask=3.0.3=pypi_0 fonttools=4.53.1=pypi_0 fsspec=2024.6.1=pypi_0 ftfy=6.2.3=pypi_0 grasp-nms=1.0.2=pypi_0 h11=0.14.0=pypi_0 httpcore=1.0.5=pypi_0 httpx=0.27.0=pypi_0 idna=3.7=pypi_0 importlib-metadata=8.2.0=pypi_0 importlib-resources=6.4.0=pypi_0 ipython=8.12.3=pypi_0 ipywidgets=8.1.3=pypi_0 itsdangerous=2.2.0=pypi_0 jedi=0.19.1=pypi_0 jinja2=3.1.4=pypi_0 jiter=0.5.0=pypi_0 joblib=1.4.2=pypi_0 jsonschema=4.23.0=pypi_0 jsonschema-specifications=2023.12.1=pypi_0 jupyter-core=5.7.2=pypi_0 jupyterlab-widgets=3.0.11=pypi_0 kiwisolver=1.4.5=pypi_0 knn-pytorch=0.1=pypi_0 ld_impl_linux-64=2.38=h1181459_1 libffi=3.4.4=h6a678d5_1 libgcc-ng=11.2.0=h1234567_1 libgomp=11.2.0=h1234567_1 libstdcxx-ng=11.2.0=h1234567_1 markupsafe=2.1.5=pypi_0 matplotlib=3.7.5=pypi_0 matplotlib-inline=0.1.7=pypi_0 mpmath=1.3.0=pypi_0 nbformat=5.10.4=pypi_0 ncurses=6.4=h6a678d5_0 nest-asyncio=1.6.0=pypi_0 networkx=3.1=pypi_0 numpy=1.24.4=pypi_0 open3d=0.18.0=pypi_0 openai=1.40.1=pypi_0 opencv-python=4.10.0.84=pypi_0 openssl=3.0.14=h5eee18b_0 packaging=24.1=pypi_0 pandas=2.0.3=pypi_0 parso=0.8.4=pypi_0 pexpect=4.9.0=pypi_0 pickleshare=0.7.5=pypi_0 pillow=10.4.0=pypi_0 pip=24.2=pypi_0 pkgutil-resolve-name=1.3.10=pypi_0 platformdirs=4.2.2=pypi_0 plotly=5.23.0=pypi_0 pointnet2=0.0.0=pypi_0 prompt-toolkit=3.0.47=pypi_0 psutil=6.0.0=pypi_0 ptyprocess=0.7.0=pypi_0 pure-eval=0.2.3=pypi_0 py-cpuinfo=9.0.0=pypi_0 pybullet=3.2.6=pypi_0 pydantic=2.8.2=pypi_0 pydantic-core=2.20.1=pypi_0 pygments=2.18.0=pypi_0 pyparsing=3.1.2=pypi_0 pyquaternion=0.9.9=pypi_0 python=3.8.19=h955ad1f_0 python-dateutil=2.9.0.post0=pypi_0 pytz=2024.1=pypi_0 pyyaml=6.0.2=pypi_0 readline=8.2=h5eee18b_0 referencing=0.35.1=pypi_0 regex=2024.7.24=pypi_0 requests=2.32.3=pypi_0 retrying=1.3.4=pypi_0 rpds-py=0.20.0=pypi_0 scikit-learn=1.3.2=pypi_0 scipy=1.10.1=pypi_0 seaborn=0.13.2=pypi_0 setuptools=72.1.0=py38h06a4308_0 six=1.16.0=pypi_0 sniffio=1.3.1=pypi_0 sqlite=3.45.3=h5eee18b_0 stack-data=0.6.3=pypi_0 sympy=1.13.1=pypi_0 tenacity=9.0.0=pypi_0 threadpoolctl=3.5.0=pypi_0 tk=8.6.14=h39e8969_0 torch=2.1.0+cu118=pypi_0 torchvision=0.16.0+cu118=pypi_0 tqdm=4.66.5=pypi_0 traitlets=5.14.3=pypi_0 transforms3d=0.4.2=pypi_0 triton=2.1.0=pypi_0 typing-extensions=4.12.2=pypi_0 tzdata=2024.1=pypi_0 ultralytics=8.2.32=pypi_0 ultralytics-thop=2.0.0=pypi_0 urllib3=2.2.2=pypi_0 wcwidth=0.2.13=pypi_0 werkzeug=3.0.3=pypi_0 wheel=0.43.0=py38h06a4308_0 widgetsnbextension=4.0.11=pypi_0 xz=5.4.6=h5eee18b_1 zipp=3.19.2=pypi_0 zlib=1.2.13=h5eee18b_1 ```