具身智能:零基础入门睿尔曼机械臂(三)——夹爪抓取与释放控制全解析

本文为睿尔曼第三代机械臂配套夹爪的入门实战:基于官方 Python SDK 讲解连接、movej 到位姿、rm_set_gripper_pick_on 力控抓取与 rm_set_gripper_release 释放等核心 API,并给出完整 main 流程与硬件/网络/示教器排查要点。读者可据此完成“运动—抓取—搬运—释放—复位”的闭环实验并处理无动作、掉件等常见问题。


一、前言

上一篇我们掌握了睿尔曼第三代机械臂的基础运动控制逻辑,而夹爪作为机械臂完成抓取、放置等作业的核心执行部件,是从“单纯运动”到“实际作业”的关键环节。相比于传统工业夹爪复杂的气动/电动控制调试,睿尔曼第三代机械臂配套夹爪通过Python SDK提供了封装完善的控制接口,无需额外的硬件接线或底层驱动配置,只需调用简单的函数即可实现夹爪的“抓取”“释放”等核心操作。

在这里插入图片描述

本文的核心目标是:以睿尔曼夹爪控制官方例程为蓝本,拆解夹爪控制的核心代码逻辑,从“参数含义”“函数作用”“执行流程”三个维度,让零基础读者理解“如何通过代码控制夹爪完成抓取作业”,并能动手完成夹爪抓取-释放的完整实操。无论你是高校学生、创客,还是刚接触机械臂的工程师,都能通过本文掌握睿尔曼机械臂夹爪的基础控制方法。

二、睿尔曼机械臂夹爪:抓取作业的核心执行部件

睿尔曼第三代机械臂配套夹爪是面向科研、教育、轻量工业场景的电动夹爪,与第三代机械臂(RM_65/RM_75/RML_63等)深度适配,核心特点如下:

1. 全型号适配

夹爪无需针对不同型号机械臂做硬件适配,通过统一的Python SDK接口控制,与上一篇学习的基础运动指令兼容,一套代码可适配所有第三代机械臂型号。

2. 简洁的参数化控制

支持通过“速度”“力度”参数自定义夹爪动作:

  • 速度:控制夹爪开合的快慢,适配不同尺寸、重量的抓取目标;
  • 力度:控制夹爪抓取时的夹持力,避免损坏易碎物体或抓取力不足导致掉落。

3. 无额外硬件配置

夹爪通过机械臂本体供电并通信,无需额外的控制器、接线或气动回路,仅需确保夹爪与机械臂末端正确安装,即可通过网络通信实现控制。

4. 核心功能

支持“连续力控抓取”“主动释放”两大核心动作,满足入门阶段抓取-放置作业的全部需求。

三、核心例程全解析:逐行吃透夹爪控制逻辑

接下来我们逐模块、逐行解析夹爪控制例程代码,重点拆解夹爪专属的控制函数,同时梳理“运动+抓取”的协同控制逻辑。

3.1 环境配置与模块导入

import sys
import os
import time

# Add the parent directory of src to sys.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))

from src.Robotic_Arm.rm_robot_interface import *
  • import sys/import os:与上一篇作用一致,用于补全SDK的模块搜索路径,确保能导入核心接口rm_robot_interface.py
  • import time:新增的时间模块,核心作用是在夹爪执行抓取/释放动作后,通过time.sleep(2)让程序短暂等待,确保夹爪完成机械动作(夹爪开合需要物理时间,避免程序过快执行后续指令导致动作不完整);
  • from src.Robotic_Arm.rm_robot_interface import *:导入的核心接口中,新增了rm_set_gripper_pick_on(夹爪抓取)、rm_set_gripper_release(夹爪释放)等夹爪控制函数,是实现夹爪操作的核心依赖。

3.2 核心控制类RobotArmController解析

该类在基础运动控制类的基础上,新增了夹爪抓取、释放的专属函数,同时复用了机械臂连接、断开、关节运动的核心函数,我们重点解析新增的夹爪控制函数,复用函数仅补充关键说明。

3.2.1 初始化函数__init__:建立机械臂(含夹爪)连接

def __init__(self, ip, port, level=3, mode=2):
    """
    Initialize and connect to the robotic arm (and gripper).

    Args:
        ip (str): IP address of the robot arm.
        port (int): Port number.
        level (int, optional): Connection level. Defaults to 3.
        mode (int, optional): Thread mode (0: single, 1: dual, 2: triple). Defaults to 2.
    """
    self.thread_mode = rm_thread_mode_e(mode)
    self.robot = RoboticArm(self.thread_mode)
    self.handle = self.robot.rm_create_robot_arm(ip, port, level)

    if self.handle.id == -1:
        print("\nFailed to connect to the robot arm\n")
        exit(1)
    else:
        print(f"\nSuccessfully connected to the robot arm: {self.handle.id}\n")
  • 复用逻辑:与上一篇一致,建立机械臂网络连接并返回句柄;
  • 关键补充:夹爪作为机械臂的末端部件,无需单独建立连接,只要机械臂连接成功(handle.id≠-1),即可通过该句柄控制夹爪,这是睿尔曼SDK“一体化控制”的设计优势。

3.2.2 disconnect:断开机械臂(含夹爪)连接

def disconnect(self):
    """
    Disconnect from the robot arm (and release gripper resources).

    Returns:
        None
    """
    handle = self.robot.rm_delete_robot_arm()
    if handle == 0:
        print("\nSuccessfully disconnected from the robot arm\n")
    else:
        print("\nFailed to disconnect from the robot arm\n")
  • 复用逻辑:与上一篇一致,释放机械臂连接句柄;
  • 关键补充:断开连接时,SDK会自动释放夹爪的控制资源,避免夹爪处于“卡死”状态,因此程序结束前必须调用该函数。

3.2.3 movej:关节空间运动(抓取/释放的基础)

def movej(self, joint, v=20, r=0, connect=0, block=1):
    """
    Perform movej motion (move to gripper target position).

    Args:
        joint (list of float): Joint positions.
        v (float, optional): Speed of the motion. Defaults to 20.
        connect (int, optional): Trajectory connection flag. Defaults to 0.
        block (int, optional): Whether the function is blocking (1 for blocking, 0 for non-blocking). Defaults to 1.
        r (float, optional): Blending radius. Defaults to 0.

    Returns:
        None
    """
    movej_result = self.robot.rm_movej(joint, v, r, connect, block)
    if movej_result == 0:
        print("\nmovej motion succeeded\n")
    else:
        print("\nmovej motion failed, Error code: ", movej_result, "\n")
  • 复用逻辑:参数、返回值与上一篇完全一致;
  • 核心作用:夹爪无法在任意位置完成有效抓取,需通过movej将机械臂末端(夹爪)运动到“抓取位”“放置位”“复位位”,是夹爪作业的前提。

3.2.4 set_gripper_pick_on:夹爪连续力控抓取(核心函数)

def set_gripper_pick_on(self, speed, force, block=True, timeout=30):
    """
    Perform continuous force-controlled gripping with the gripper.

    Args:
        speed (int): Speed of the gripper.
        force (int): Force applied by the gripper.
        block (bool, optional): Whether the function is blocking. Defaults to True.
        timeout (int, optional): Timeout duration. Defaults to 30.

    Returns:
        None
    """
    gripper_result = self.robot.rm_set_gripper_pick_on(speed, force, block, timeout)
    if gripper_result == 0:
        print("\nGripper continuous force control gripping succeeded\n")
    else:
        print("\nGripper continuous force control gripping failed, Error code: ", gripper_result, "\n")
    time.sleep(2)

这是控制夹爪完成“抓取”动作的核心函数,我们从参数含义执行逻辑两个维度拆解:

参数详解
  1. speed(必选,int):夹爪闭合的速度,取值范围需符合睿尔曼夹爪硬件限制(通常0~1000),示例中设为500(中等速度):
    • 速度过小:夹爪闭合慢,作业效率低;
    • 速度过大:易因冲击导致抓取目标掉落或夹爪损坏。
  2. force(必选,int):夹爪抓取时的夹持力,取值范围通常0~500(单位:N,牛顿),示例中设为200(适中力度):
    • 力度过小:无法夹紧物体,易掉落;
    • 力度过大:损坏易碎物体(如玻璃、塑料件)或夹爪自身。
  3. block(可选,bool):阻塞标志,默认True:
    • True(阻塞):程序等待夹爪完成抓取动作后,再执行下一行代码;
    • False(非阻塞):发送抓取指令后程序立即执行后续代码,夹爪后台完成抓取。
  4. timeout(可选,int):超时时间,默认30秒:
    • 若夹爪因故障无法完成抓取动作,程序等待timeout秒后判定为执行失败,避免程序无限等待。
执行逻辑
  1. 调用SDK核心接口rm_set_gripper_pick_on,传入速度、力度等参数,返回执行结果(0=成功,非0=错误码);
  2. 打印执行结果,便于调试排查问题;
  3. time.sleep(2):额外等待2秒,确保夹爪完成物理闭合动作(即使block=True,硬件动作仍需短暂时间,避免后续运动指令打断抓取)。

3.2.5 set_gripper_release:夹爪释放(核心函数)

def set_gripper_release(self, speed, block=True, timeout=30):
    """
    Release the gripper.

    Args:
        speed (int): Speed of the gripper release.
        block (bool, optional): Whether the function is blocking. Defaults to True.
        timeout (int, optional): Timeout duration. Defaults to 30.

    Returns:
        None
    """
    gripper_result = self.robot.rm_set_gripper_release(speed, block, timeout)
    if gripper_result == 0:
        print("\nGripper release succeeded\n")
    else:
        print("\nGripper release failed, Error code: ", gripper_result, "\n")
    time.sleep(2)

这是控制夹爪完成“释放”动作的核心函数,拆解如下:

参数详解
  1. speed(必选,int):夹爪张开的速度,取值范围与抓取速度一致(通常0~1000),示例中设为500:
    • 释放速度需适配抓取目标:易碎物体建议低速释放,避免掉落;重型物体可适当提高速度。
  2. block/timeout:含义与set_gripper_pick_on完全一致,默认阻塞+30秒超时。
执行逻辑
  1. 调用SDK核心接口rm_set_gripper_release,传入释放速度等参数,返回执行结果;
  2. 打印执行结果;
  3. time.sleep(2):等待夹爪完成物理张开动作,确保物体顺利脱离夹爪。

3.3 主函数main:“运动+抓取+释放”完整流程

def main():
    # Create a robot arm controller instance and connect to the robot arm
    robot_controller = RobotArmController("192.168.1.18", 8080, 3)

    # Get API version
    print("\nAPI Version: ", rm_api_version(), "\n")

    # Perform movej motion (move to gripping position)
    robot_controller.movej([90, 90, 30, 0, 60, 0])

    # Perform continuous force-controlled gripping with the gripper
    robot_controller.set_gripper_pick_on(500, 200)

    # Perform movej motion (move to placing position)
    robot_controller.movej([0, 90, 30, 0, 60, 0])

    # Release the gripper
    robot_controller.set_gripper_release(500)

    # Perform movej motion (reset to initial position)
    robot_controller.movej([90, 90, 30, 0, 60, 0])

    # Disconnect the robot arm
    robot_controller.disconnect()

if __name__ == "__main__":
    main()

主函数是夹爪作业的“完整执行流程”,我们按步骤拆解核心逻辑:

  1. 建立连接:创建RobotArmController实例,传入机械臂IP(192.168.1.18)、端口(8080)、连接等级(3),完成机械臂+夹爪的连接;
  2. 确认SDK版本:打印rm_api_version(),确保SDK版本与机械臂固件兼容,避免夹爪指令执行失败;
  3. 运动到抓取位:调用movej将机械臂运动到预设的抓取位[90, 90, 30, 0, 60, 0](关节角度),此时夹爪正对抓取目标;
  4. 夹爪抓取:调用set_gripper_pick_on(500, 200),以500的速度、200N的力度完成抓取;
  5. 运动到放置位:调用movej将机械臂运动到放置位[0, 90, 30, 0, 60, 0],携带抓取目标移动;
  6. 夹爪释放:调用set_gripper_release(500),以500的速度张开夹爪,释放目标;
  7. 复位到初始位:调用movej将机械臂复位到抓取位,便于下一次作业;
  8. 断开连接:释放连接资源,完成整个作业流程。

四、应用实践:从代码到夹爪抓取实操

掌握夹爪控制代码逻辑后,我们通过实操完成“抓取-放置”作业,核心步骤如下:

4.1 环境搭建

4.1.1 硬件准备

  1. 基础硬件:睿尔曼第三代机械臂(如RM_65)、电脑(Windows/Linux)、网线/无线网卡(确保与机械臂同网段);
  2. 新增硬件:睿尔曼配套电动夹爪(已正确安装到机械臂末端);
  3. 辅助物料:待抓取物体(如塑料杯、小积木,建议先从轻型、规则形状物体开始)。

4.1.2 软件准备

与上一篇完全一致:

  1. 安装Python 3.7+(睿尔曼SDK推荐版本);
  2. 下载睿尔曼第三代机械臂SDK,解压到本地;
  3. 将夹爪控制例程脚本放在SDK指定目录(确保sys.path路径正确)。

4.1.3 网络配置

与上一篇完全一致:

  1. 机械臂默认IP:192.168.1.18(可通过示教器修改);
  2. 电脑IP设置为192.168.1.x(x≠18,子网掩码255.255.255.0);
  3. 测试连通性:ping 192.168.1.18,确保能ping通。

4.1.4 夹爪硬件确认

新增步骤:

  1. 检查夹爪与机械臂末端的连接:确保夹爪固定牢固,供电/通信接口无松动;
  2. 夹爪自检:启动机械臂后,通过示教器确认夹爪处于“就绪”状态,无报错信息。

4.2 运行步骤

  1. 启动机械臂:接通电源,待机械臂+夹爪完成自检(进入“就绪”状态);
  2. 放置抓取目标:将待抓取物体放在机械臂“抓取位”(与代码中[90, 90, 30, 0, 60, 0]对应的物理位置或修改代码中的位置参数);
  3. 修改代码:将RobotArmController("192.168.1.18", 8080, 3)中的IP改为实际机械臂IP;
  4. 运行脚本:在终端执行python 夹爪控制例程文件名.py
  5. 观察执行过程:
    • 机械臂先运动到抓取位;
    • 夹爪闭合完成抓取;
    • 机械臂运动到放置位;
    • 夹爪张开释放物体;
    • 机械臂复位到初始位;
    • 终端打印每一步的执行结果(成功/失败+错误码)。

4.3 常见问题与排查

针对夹爪控制的专属问题,补充如下排查方向:

1. 夹爪无动作(指令返回成功但无物理动作)

  • 排查:
    1. 夹爪是否已正确安装并完成自检(示教器查看夹爪状态);
    2. time.sleep()时间是否过短(建议至少2秒,确保硬件动作完成);
    3. 速度参数是否设为0(speed=0时夹爪无动作)。

2. 抓取失败(错误码非0)

  • 排查:
    1. 力度参数是否超出夹爪硬件限制(通常0~500N,需参考夹爪手册);
    2. 抓取位是否超出夹爪工作范围(夹爪开合角度有限,需确保物体在夹持范围内);
    3. 机械臂连接等级是否为3(等级不足无法执行夹爪控制指令)。

3. 抓取后物体掉落

  • 排查:
    1. 夹持力force是否过小(可适当提高,如从200调整为300);
    2. 机械臂运动速度v是否过快(运动时冲击导致物体掉落,可降低movej的速度参数);
    3. 夹爪表面是否光滑(可增加防滑垫提升摩擦力)。

4. 释放失败(夹爪无法张开)

  • 排查:
    1. 释放速度speed是否过小(可适当提高);
    2. 物体是否卡死在夹爪中(手动轻推物体,确认无卡顿);
    3. 超时时间timeout是否过短(可延长至60秒,排查是否为动作超时)。

五、总结与拓展

本文在上一篇基础运动控制的基础上,完成了睿尔曼机械臂夹爪控制的“代码解析+实操落地”,核心知识点如下:

  1. 夹爪控制的核心逻辑:机械臂连接→运动到抓取位→力控抓取→运动到放置位→释放→复位→断开连接;
  2. 夹爪核心函数参数:
    • set_gripper_pick_on:通过speed(闭合速度)、force(夹持力)控制抓取效果;
    • set_gripper_release:通过speed(张开速度)控制释放效果;
  3. 协同控制关键:夹爪动作需与机械臂运动配合,通过movej到达指定位置后,再执行抓取/释放,且需通过time.sleep()确保硬件动作完成。

具身智慧:零基礎入門睿爾曼機械臂(三)——夾爪抓取與釋放控制全解析

本文為睿爾曼第三代機械臂配套夾爪的入門實戰:基於官方 Python SDK 講解連接、movej 到位姿、rm_set_gripper_pick_on 力控抓取與 rm_set_gripper_release 釋放等核心 API,並給出完整 main 流程與硬件/網絡/示教器排查要點。讀者可據此完成“運動—抓取—搬運—釋放—復位”的閉環實驗並處理無動作、掉件等常見問題。

來源:https://blog.csdn.net/2403_87969572/article/details/155756274

抓取時間(ISO本地):2026-05-18 05:17:37


文章目錄

一、前言

上一篇我們掌握了睿爾曼第三代機械臂的基礎運動控制邏輯,而夾爪作為機械臂完成抓取、放置等作業的核心執行部件,是從“單純運動”到“實際作業”的關鍵環節。相比於傳統工業夾爪複雜的氣動/電動控制除錯,睿爾曼第三代機械臂配套夾爪透過Python SDK提供了封裝完善的控制介面,無需額外的硬體接線或底層驅動配置,只需呼叫簡單的函式即可實現夾爪的“抓取”“釋放”等核心操作。

在這裡插入圖片描述

本文的核心目標是:以睿爾曼夾爪控制官方例程為藍本,拆解夾爪控制的核心程式碼邏輯,從“引數含義”“函式作用”“執行流程”三個維度,讓零基礎讀者理解“如何透過程式碼控制夾爪完成抓取作業”,並能動手完成夾爪抓取-釋放的完整實操。無論你是高校學生、創客,還是剛接觸機械臂的工程師,都能透過本文掌握睿爾曼機械臂夾爪的基礎控制方法。

二、睿爾曼機械臂夾爪:抓取作業的核心執行部件

睿爾曼第三代機械臂配套夾爪是面向科研、教育、輕量工業場景的電動夾爪,與第三代機械臂(RM_65/RM_75/RML_63等)深度適配,核心特點如下:

1. 全型號適配

夾爪無需針對不同型號機械臂做硬體適配,透過統一的Python SDK介面控制,與上一篇學習的基礎運動指令相容,一套程式碼可適配所有第三代機械臂型號。

2. 簡潔的引數化控制

支援透過“速度”“力度”引數自定義夾爪動作:

  • 速度:控制夾爪開合的快慢,適配不同尺寸、重量的抓取目標;
  • 力度:控制夾爪抓取時的夾持力,避免損壞易碎物體或抓取力不足導致掉落。

3. 無額外硬體配置

夾爪透過機械臂本體供電並通訊,無需額外的控制器、接線或氣動迴路,僅需確保夾爪與機械臂末端正確安裝,即可透過網路通訊實現控制。

4. 核心功能

支援“連續力控抓取”“主動釋放”兩大核心動作,滿足入門階段抓取-放置作業的全部需求。

三、核心例程全解析:逐行吃透夾爪控制邏輯

接下來我們逐模組、逐行解析夾爪控制例程程式碼,重點拆解夾爪專屬的控制函式,同時梳理“運動+抓取”的協同控制邏輯。

3.1 環境配置與模組匯入

import sys
import os
import time

# Add the parent directory of src to sys.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))

from src.Robotic_Arm.rm_robot_interface import *
  • import sys/import os:與上一篇作用一致,用於補全SDK的模組搜尋路徑,確保能匯入核心介面rm_robot_interface.py
  • import time:新增的時間模組,核心作用是在夾爪執行抓取/釋放動作後,透過time.sleep(2)讓程式短暫等待,確保夾爪完成機械動作(夾爪開合需要物理時間,避免程式過快執行後續指令導致動作不完整);
  • from src.Robotic_Arm.rm_robot_interface import *:匯入的核心介面中,新增了rm_set_gripper_pick_on(夾爪抓取)、rm_set_gripper_release(夾爪釋放)等夾爪控制函式,是實現夾爪操作的核心依賴。

3.2 核心控制類RobotArmController解析

該類在基礎運動控制類的基礎上,新增了夾爪抓取、釋放的專屬函式,同時複用了機械臂連線、斷開、關節運動的核心函式,我們重點解析新增的夾爪控制函式,複用函式僅補充關鍵說明。

3.2.1 初始化函式__init__:建立機械臂(含夾爪)連線

def __init__(self, ip, port, level=3, mode=2):
    """
    Initialize and connect to the robotic arm (and gripper).

    Args:
        ip (str): IP address of the robot arm.
        port (int): Port number.
        level (int, optional): Connection level. Defaults to 3.
        mode (int, optional): Thread mode (0: single, 1: dual, 2: triple). Defaults to 2.
    """
    self.thread_mode = rm_thread_mode_e(mode)
    self.robot = RoboticArm(self.thread_mode)
    self.handle = self.robot.rm_create_robot_arm(ip, port, level)

    if self.handle.id == -1:
        print("\nFailed to connect to the robot arm\n")
        exit(1)
    else:
        print(f"\nSuccessfully connected to the robot arm: {self.handle.id}\n")
  • 複用邏輯:與上一篇一致,建立機械臂網路連線並返回控制代碼;
  • 關鍵補充:夾爪作為機械臂的末端部件,無需單獨建立連線,只要機械臂連線成功(handle.id≠-1),即可透過該控制代碼控制夾爪,這是睿爾曼SDK“一體化控制”的設計優勢。

3.2.2 disconnect:斷開機械臂(含夾爪)連線

def disconnect(self):
    """
    Disconnect from the robot arm (and release gripper resources).

    Returns:
        None
    """
    handle = self.robot.rm_delete_robot_arm()
    if handle == 0:
        print("\nSuccessfully disconnected from the robot arm\n")
    else:
        print("\nFailed to disconnect from the robot arm\n")
  • 複用邏輯:與上一篇一致,釋放機械臂連線控制代碼;
  • 關鍵補充:斷開連線時,SDK會自動釋放夾爪的控制資源,避免夾爪處於“卡死”狀態,因此程式結束前必須呼叫該函式。

3.2.3 movej:關節空間運動(抓取/釋放的基礎)

def movej(self, joint, v=20, r=0, connect=0, block=1):
    """
    Perform movej motion (move to gripper target position).

    Args:
        joint (list of float): Joint positions.
        v (float, optional): Speed of the motion. Defaults to 20.
        connect (int, optional): Trajectory connection flag. Defaults to 0.
        block (int, optional): Whether the function is blocking (1 for blocking, 0 for non-blocking). Defaults to 1.
        r (float, optional): Blending radius. Defaults to 0.

    Returns:
        None
    """
    movej_result = self.robot.rm_movej(joint, v, r, connect, block)
    if movej_result == 0:
        print("\nmovej motion succeeded\n")
    else:
        print("\nmovej motion failed, Error code: ", movej_result, "\n")
  • 複用邏輯:引數、返回值與上一篇完全一致;
  • 核心作用:夾爪無法在任意位置完成有效抓取,需透過movej將機械臂末端(夾爪)運動到“抓取位”“放置位”“復位位”,是夾爪作業的前提。

3.2.4 set_gripper_pick_on:夾爪連續力控抓取(核心函式)

def set_gripper_pick_on(self, speed, force, block=True, timeout=30):
    """
    Perform continuous force-controlled gripping with the gripper.

    Args:
        speed (int): Speed of the gripper.
        force (int): Force applied by the gripper.
        block (bool, optional): Whether the function is blocking. Defaults to True.
        timeout (int, optional): Timeout duration. Defaults to 30.

    Returns:
        None
    """
    gripper_result = self.robot.rm_set_gripper_pick_on(speed, force, block, timeout)
    if gripper_result == 0:
        print("\nGripper continuous force control gripping succeeded\n")
    else:
        print("\nGripper continuous force control gripping failed, Error code: ", gripper_result, "\n")
    time.sleep(2)

這是控制夾爪完成“抓取”動作的核心函式,我們從引數含義執行邏輯兩個維度拆解:

引數詳解
  1. speed(必選,int):夾爪閉合的速度,取值範圍需符合睿爾曼夾爪硬體限制(通常0~1000),示例中設為500(中等速度):
    • 速度過小:夾爪閉合慢,作業效率低;
    • 速度過大:易因衝擊導致抓取目標掉落或夾爪損壞。
  2. force(必選,int):夾爪抓取時的夾持力,取值範圍通常0~500(單位:N,牛頓),示例中設為200(適中力度):
    • 力度過小:無法夾緊物體,易掉落;
    • 力度過大:損壞易碎物體(如玻璃、塑膠件)或夾爪自身。
  3. block(可選,bool):阻塞標誌,預設True:
    • True(阻塞):程式等待夾爪完成抓取動作後,再執行下一行程式碼;
    • False(非阻塞):傳送抓取指令後程式立即執行後續程式碼,夾爪後臺完成抓取。
  4. timeout(可選,int):超時時間,預設30秒:
    • 若夾爪因故障無法完成抓取動作,程式等待timeout秒後判定為執行失敗,避免程式無限等待。
執行邏輯
  1. 呼叫SDK核心介面rm_set_gripper_pick_on,傳入速度、力度等引數,返回執行結果(0=成功,非0=錯誤碼);
  2. 列印執行結果,便於除錯排查問題;
  3. time.sleep(2):額外等待2秒,確保夾爪完成物理閉合動作(即使block=True,硬體動作仍需短暫時間,避免後續運動指令打斷抓取)。

3.2.5 set_gripper_release:夾爪釋放(核心函式)

def set_gripper_release(self, speed, block=True, timeout=30):
    """
    Release the gripper.

    Args:
        speed (int): Speed of the gripper release.
        block (bool, optional): Whether the function is blocking. Defaults to True.
        timeout (int, optional): Timeout duration. Defaults to 30.

    Returns:
        None
    """
    gripper_result = self.robot.rm_set_gripper_release(speed, block, timeout)
    if gripper_result == 0:
        print("\nGripper release succeeded\n")
    else:
        print("\nGripper release failed, Error code: ", gripper_result, "\n")
    time.sleep(2)

這是控制夾爪完成“釋放”動作的核心函式,拆解如下:

引數詳解
  1. speed(必選,int):夾爪張開的速度,取值範圍與抓取速度一致(通常0~1000),示例中設為500:
    • 釋放速度需適配抓取目標:易碎物體建議低速釋放,避免掉落;重型物體可適當提高速度。
  2. block/timeout:含義與set_gripper_pick_on完全一致,預設阻塞+30秒超時。
執行邏輯
  1. 呼叫SDK核心介面rm_set_gripper_release,傳入釋放速度等引數,返回執行結果;
  2. 列印執行結果;
  3. time.sleep(2):等待夾爪完成物理張開動作,確保物體順利脫離夾爪。

3.3 主函式main:“運動+抓取+釋放”完整流程

def main():
    # Create a robot arm controller instance and connect to the robot arm
    robot_controller = RobotArmController("192.168.1.18", 8080, 3)

    # Get API version
    print("\nAPI Version: ", rm_api_version(), "\n")

    # Perform movej motion (move to gripping position)
    robot_controller.movej([90, 90, 30, 0, 60, 0])

    # Perform continuous force-controlled gripping with the gripper
    robot_controller.set_gripper_pick_on(500, 200)

    # Perform movej motion (move to placing position)
    robot_controller.movej([0, 90, 30, 0, 60, 0])

    # Release the gripper
    robot_controller.set_gripper_release(500)

    # Perform movej motion (reset to initial position)
    robot_controller.movej([90, 90, 30, 0, 60, 0])

    # Disconnect the robot arm
    robot_controller.disconnect()

if __name__ == "__main__":
    main()

主函式是夾爪作業的“完整執行流程”,我們按步驟拆解核心邏輯:

  1. 建立連線:建立RobotArmController例項,傳入機械臂IP(192.168.1.18)、埠(8080)、連線等級(3),完成機械臂+夾爪的連線;
  2. 確認SDK版本:列印rm_api_version(),確保SDK版本與機械臂韌體相容,避免夾爪指令執行失敗;
  3. 運動到抓取位:呼叫movej將機械臂運動到預設的抓取位[90, 90, 30, 0, 60, 0](關節角度),此時夾爪正對抓取目標;
  4. 夾爪抓取:呼叫set_gripper_pick_on(500, 200),以500的速度、200N的力度完成抓取;
  5. 運動到放置位:呼叫movej將機械臂運動到放置位[0, 90, 30, 0, 60, 0],攜帶抓取目標移動;
  6. 夾爪釋放:呼叫set_gripper_release(500),以500的速度張開夾爪,釋放目標;
  7. 復位到初始位:呼叫movej將機械臂復位到抓取位,便於下一次作業;
  8. 斷開連線:釋放連線資源,完成整個作業流程。

四、應用實踐:從程式碼到夾爪抓取實操

掌握夾爪控制程式碼邏輯後,我們透過實操完成“抓取-放置”作業,核心步驟如下:

4.1 環境搭建

4.1.1 硬體準備

  1. 基礎硬體:睿爾曼第三代機械臂(如RM_65)、電腦(Windows/Linux)、網線/無線網絡卡(確保與機械臂同網段);
  2. 新增硬體:睿爾曼配套電動夾爪(已正確安裝到機械臂末端);
  3. 輔助物料:待抓取物體(如塑膠杯、小積木,建議先從輕型、規則形狀物體開始)。

4.1.2 軟體準備

與上一篇完全一致:

  1. 安裝Python 3.7+(睿爾曼SDK推薦版本);
  2. 下載睿爾曼第三代機械臂SDK,解壓到本地;
  3. 將夾爪控制例程指令碼放在SDK指定目錄(確保sys.path路徑正確)。

4.1.3 網路配置

與上一篇完全一致:

  1. 機械臂預設IP:192.168.1.18(可透過示教器修改);
  2. 電腦IP設定為192.168.1.x(x≠18,子網掩碼255.255.255.0);
  3. 測試連通性:ping 192.168.1.18,確保能ping通。

4.1.4 夾爪硬體確認

新增步驟:

  1. 檢查夾爪與機械臂末端的連線:確保夾爪固定牢固,供電/通訊介面無鬆動;
  2. 夾爪自檢:啟動機械臂後,透過示教器確認夾爪處於“就緒”狀態,無報錯資訊。

4.2 執行步驟

  1. 啟動機械臂:接通電源,待機械臂+夾爪完成自檢(進入“就緒”狀態);
  2. 放置抓取目標:將待抓取物體放在機械臂“抓取位”(與程式碼中[90, 90, 30, 0, 60, 0]對應的物理位置或修改程式碼中的位置引數);
  3. 修改程式碼:將RobotArmController("192.168.1.18", 8080, 3)中的IP改為實際機械臂IP;
  4. 執行指令碼:在終端執行python 夾爪控制例程檔名.py
  5. 觀察執行過程:
    • 機械臂先運動到抓取位;
    • 夾爪閉合完成抓取;
    • 機械臂運動到放置位;
    • 夾爪張開釋放物體;
    • 機械臂復位到初始位;
    • 終端列印每一步的執行結果(成功/失敗+錯誤碼)。

4.3 常見問題與排查

針對夾爪控制的專屬問題,補充如下排查方向:

1. 夾爪無動作(指令返回成功但無物理動作)

  • 排查:
    1. 夾爪是否已正確安裝並完成自檢(示教器檢視夾爪狀態);
    2. time.sleep()時間是否過短(建議至少2秒,確保硬體動作完成);
    3. 速度引數是否設為0(speed=0時夾爪無動作)。

2. 抓取失敗(錯誤碼非0)

  • 排查:
    1. 力度引數是否超出夾爪硬體限制(通常0~500N,需參考夾爪手冊);
    2. 抓取位是否超出夾爪工作範圍(夾爪開合角度有限,需確保物體在夾持範圍內);
    3. 機械臂連線等級是否為3(等級不足無法執行夾爪控制指令)。

3. 抓取後物體掉落

  • 排查:
    1. 夾持力force是否過小(可適當提高,如從200調整為300);
    2. 機械臂運動速度v是否過快(運動時衝擊導致物體掉落,可降低movej的速度引數);
    3. 夾爪表面是否光滑(可增加防滑墊提升摩擦力)。

4. 釋放失敗(夾爪無法張開)

  • 排查:
    1. 釋放速度speed是否過小(可適當提高);
    2. 物體是否卡死在夾爪中(手動輕推物體,確認無卡頓);
    3. 超時時間timeout是否過短(可延長至60秒,排查是否為動作超時)。

五、總結與拓展

本文在上一篇基礎運動控制的基礎上,完成了睿爾曼機械臂夾爪控制的“程式碼解析+實操落地”,核心知識點如下:

  1. 夾爪控制的核心邏輯:機械臂連線→運動到抓取位→力控抓取→運動到放置位→釋放→復位→斷開連線;
  2. 夾爪核心函式引數:
    • set_gripper_pick_on:透過speed(閉合速度)、force(夾持力)控制抓取效果;
    • set_gripper_release:透過speed(張開速度)控制釋放效果;
  3. 協同控制關鍵:夾爪動作需與機械臂運動配合,透過movej到達指定位置後,再執行抓取/釋放,且需透過time.sleep()確保硬體動作完成。

Embodied intelligence: Realman arm zero-to-one (3)—gripper pick & release, fully explained

In the previous post we covered basic motion for the third-generation Realman arm. The gripper is what turns “motion” into useful work—pick, place, hand-off. Compared with traditional industrial grippers that need separate pneumatic/electric commissioning, Realman’s gripper is driven through a mature Python SDK: no extra wiring or low-level drivers—call a few APIs to grasp and release.

Captured at (ISO local): 2026-05-18 05:17:37


I. Foreword

In the previous post we covered basic motion for the third-generation Realman arm. The gripper is what turns “motion” into useful work—pick, place, hand-off. Compared with traditional industrial grippers that need separate pneumatic/electric commissioning, Realman’s gripper is driven through a mature Python SDK: no extra wiring or low-level drivers—call a few APIs to grasp and release.

Image description

This article walks the official gripper demo, explaining parameters, roles of each call, and timing so beginners understand how code drives a real grasp cycle and can reproduce pick-and-place in the lab.

II. Realman gripper basics

The third-gen electric gripper pairs with RM_65 / RM_75 / RML_63, etc.; highlights:

1) One SDK for all models

Same Python surface for every third-gen arm—reuse motion code and gripper calls without hardware variants.

2) Parameterized speed & force

  • Speed shapes how fast jaws close—tune for object size/mass.
  • Force sets clamping effort—protect fragile parts, still hold reliably.

3) No extra controller box

Power and data ride through the arm; install the gripper on the flange, reach it over the network after the arm connects.

4) Core motions

Supports continuous force-controlled grasp and active release—enough for entry-level pick/place loops.

III. Walkthrough of the reference script

We explain imports, the controller class, gripper calls, then main().

3.1 Imports and path setup

import sys
import os
import time

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))

from src.Robotic_Arm.rm_robot_interface import *
  • sys/os: ensure the SDK (rm_robot_interface.py) imports cleanly.
  • time: time.sleep after gripper moves so mechanics finish before the next command.
  • from … import *: brings in rm_set_gripper_pick_on, rm_set_gripper_release, etc.

3.2 RobotArmController

The class adds gripper helpers while reusing connect/disconnect/movej.

__init__ — connect arm (+ gripper)

def __init__(self, ip, port, level=3, mode=2):
    self.thread_mode = rm_thread_mode_e(mode)
    self.robot = RoboticArm(self.thread_mode)
    self.handle = self.robot.rm_create_robot_arm(ip, port, level)

    if self.handle.id == -1:
        print("\nFailed to connect to the robot arm\n")
        exit(1)
    else:
        print(f"\nSuccessfully connected to the robot arm: {self.handle.id}\n")

The gripper shares the arm handle—one connection controls everything.

disconnect

def disconnect(self):
    handle = self.robot.rm_delete_robot_arm()
    if handle == 0:
        print("\nSuccessfully disconnected from the robot arm\n")
    else:
        print("\nFailed to disconnect from the robot arm\n")

Always call this at shutdown—SDK releases gripper resources and avoids a stuck jaw state.

movej — reach the pre-grasp / place poses

def movej(self, joint, v=20, r=0, connect=0, block=1):
    movej_result = self.robot.rm_movej(joint, v, r, connect, block)
    if movej_result == 0:
        print("\nmovej motion succeeded\n")
    else:
        print("\nmovej motion failed, Error code: ", movej_result, "\n")

You must bring the TCP (with gripper) into a valid workspace before clamping.

set_gripper_pick_on — force-controlled grasp

def set_gripper_pick_on(self, speed, force, block=True, timeout=30):
    gripper_result = self.robot.rm_set_gripper_pick_on(speed, force, block, timeout)
    if gripper_result == 0:
        print("\nGripper continuous force control gripping succeeded\n")
    else:
        print("\nGripper continuous force control gripping failed, Error code: ", gripper_result, "\n")
    time.sleep(2)

Parameters

  1. speed (int, required): jaw speed (typical range per hardware guide, e.g. 0–1000). Example 500. Too low = slow cycle; too high = impact/drop risk.
  2. force (int, required): clamping force (documentation often 0–500 N-class; verify on your hardware). Example 200.
  3. block (bool, default True): wait until motion completes vs fire-and-forget.
  4. timeout (seconds): fail if the motion cannot finish—prevents infinite waits.

Flow: call SDK → print status → sleep(2) to let mechanics finish even when blocking returns.

set_gripper_release

def set_gripper_release(self, speed, block=True, timeout=30):
    gripper_result = self.robot.rm_set_gripper_release(speed, block, timeout)
    if gripper_result == 0:
        print("\nGripper release succeeded\n")
    else:
        print("\nGripper release failed, Error code: ", gripper_result, "\n")
    time.sleep(2)

speed opens the fingers; block/timeout behave like grasp.

3.3 main() — full cycle

def main():
    robot_controller = RobotArmController("192.168.1.18", 8080, 3)
    print("\nAPI Version: ", rm_api_version(), "\n")
    robot_controller.movej([90, 90, 30, 0, 60, 0])
    robot_controller.set_gripper_pick_on(500, 200)
    robot_controller.movej([0, 90, 30, 0, 60, 0])
    robot_controller.set_gripper_release(500)
    robot_controller.movej([90, 90, 30, 0, 60, 0])
    robot_controller.disconnect()

if __name__ == "__main__":
    main()
  1. Connect at IP 192.168.1.18, port 8080, level 3.
  2. Print API version vs teach-pendant firmware expectations.
  3. Move to pre-grasp joints, clamp with speed/force (500/200).
  4. Move to place pose while holding.
  5. Release at speed 500.
  6. Retract/reset to a safe configuration.
  7. Disconnect.

IV. Hands-on

4.1 Environment

Hardware

  • Third-gen Realman arm (e.g. RM_65), PC, Ethernet to arm subnet.
  • Factory gripper mounted and seated on the flange.
  • Practice objects—start small, regular geometry.

Software

  • Python 3.7+ (per SDK guidance)
  • Official third-gen SDK extracted locally
  • Demo script placed so sys.path resolves to src

Network

  • Default arm IP 192.168.1.18 (change on pendant if needed)
  • PC on 192.168.1.x, mask 255.255.255.0, ping succeeds

Gripper checks

  • Mechanical mounting tight; power/data seated
  • Pendant shows gripper ready, no faults

4.2 Run book

  1. Power arm; wait for ready/teach mode as required by site policy.
  2. Place the part at the physical pose matching your joint target (or edit joints).
  3. Set RobotArmController("YOUR_IP", 8080, 3).
  4. python your_gripper_demo.py
  5. Observe printed success/error codes for each step.

4.3 Troubleshooting

1) No jaw motion though return code is “OK”

  • Confirm pendant gripper status
  • Increase time.sleep if marginal
  • Ensure speed != 0

2) Grasp error (non-zero code)

  • Force within allowed range
  • Object inside jaw stroke and symmetric to fingers
  • Connection level supports gripper IO (level 3 in article)

3) Drops after grasp

  • Raise force slightly
  • Lower movej speed to reduce inertial slinging
  • Jaw surfaces slippery? add soft pads

4) Release fails / jaws stuck

  • Raise open speed moderately
  • Clear mechanical interference
  • Extend timeout to rule out timer aborts

V. Wrap-up

You now have the grasp pipeline: connect → movej to pose → set_gripper_pick_on → carry → set_gripper_release → reset → disconnect. Tune speed/force, coordinate movej targets, and keep post-motion sleeps so hardware and software never race each other.