具身智能:零基础入门睿尔曼机械臂(三)——夹爪抓取与释放控制全解析
本文为睿尔曼第三代机械臂配套夹爪的入门实战:基于官方 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)
这是控制夹爪完成“抓取”动作的核心函数,我们从参数含义和执行逻辑两个维度拆解:
参数详解
speed(必选,int):夹爪闭合的速度,取值范围需符合睿尔曼夹爪硬件限制(通常0~1000),示例中设为500(中等速度):- 速度过小:夹爪闭合慢,作业效率低;
- 速度过大:易因冲击导致抓取目标掉落或夹爪损坏。
force(必选,int):夹爪抓取时的夹持力,取值范围通常0~500(单位:N,牛顿),示例中设为200(适中力度):- 力度过小:无法夹紧物体,易掉落;
- 力度过大:损坏易碎物体(如玻璃、塑料件)或夹爪自身。
block(可选,bool):阻塞标志,默认True:- True(阻塞):程序等待夹爪完成抓取动作后,再执行下一行代码;
- False(非阻塞):发送抓取指令后程序立即执行后续代码,夹爪后台完成抓取。
timeout(可选,int):超时时间,默认30秒:- 若夹爪因故障无法完成抓取动作,程序等待
timeout秒后判定为执行失败,避免程序无限等待。
- 若夹爪因故障无法完成抓取动作,程序等待
执行逻辑
- 调用SDK核心接口
rm_set_gripper_pick_on,传入速度、力度等参数,返回执行结果(0=成功,非0=错误码); - 打印执行结果,便于调试排查问题;
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)
这是控制夹爪完成“释放”动作的核心函数,拆解如下:
参数详解
speed(必选,int):夹爪张开的速度,取值范围与抓取速度一致(通常0~1000),示例中设为500:- 释放速度需适配抓取目标:易碎物体建议低速释放,避免掉落;重型物体可适当提高速度。
block/timeout:含义与set_gripper_pick_on完全一致,默认阻塞+30秒超时。
执行逻辑
- 调用SDK核心接口
rm_set_gripper_release,传入释放速度等参数,返回执行结果; - 打印执行结果;
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()
主函数是夹爪作业的“完整执行流程”,我们按步骤拆解核心逻辑:
- 建立连接:创建
RobotArmController实例,传入机械臂IP(192.168.1.18)、端口(8080)、连接等级(3),完成机械臂+夹爪的连接; - 确认SDK版本:打印
rm_api_version(),确保SDK版本与机械臂固件兼容,避免夹爪指令执行失败; - 运动到抓取位:调用
movej将机械臂运动到预设的抓取位[90, 90, 30, 0, 60, 0](关节角度),此时夹爪正对抓取目标; - 夹爪抓取:调用
set_gripper_pick_on(500, 200),以500的速度、200N的力度完成抓取; - 运动到放置位:调用
movej将机械臂运动到放置位[0, 90, 30, 0, 60, 0],携带抓取目标移动; - 夹爪释放:调用
set_gripper_release(500),以500的速度张开夹爪,释放目标; - 复位到初始位:调用
movej将机械臂复位到抓取位,便于下一次作业; - 断开连接:释放连接资源,完成整个作业流程。
四、应用实践:从代码到夹爪抓取实操
掌握夹爪控制代码逻辑后,我们通过实操完成“抓取-放置”作业,核心步骤如下:
4.1 环境搭建
4.1.1 硬件准备
- 基础硬件:睿尔曼第三代机械臂(如RM_65)、电脑(Windows/Linux)、网线/无线网卡(确保与机械臂同网段);
- 新增硬件:睿尔曼配套电动夹爪(已正确安装到机械臂末端);
- 辅助物料:待抓取物体(如塑料杯、小积木,建议先从轻型、规则形状物体开始)。
4.1.2 软件准备
与上一篇完全一致:
- 安装Python 3.7+(睿尔曼SDK推荐版本);
- 下载睿尔曼第三代机械臂SDK,解压到本地;
- 将夹爪控制例程脚本放在SDK指定目录(确保
sys.path路径正确)。
4.1.3 网络配置
与上一篇完全一致:
- 机械臂默认IP:192.168.1.18(可通过示教器修改);
- 电脑IP设置为192.168.1.x(x≠18,子网掩码255.255.255.0);
- 测试连通性:ping 192.168.1.18,确保能ping通。
4.1.4 夹爪硬件确认
新增步骤:
- 检查夹爪与机械臂末端的连接:确保夹爪固定牢固,供电/通信接口无松动;
- 夹爪自检:启动机械臂后,通过示教器确认夹爪处于“就绪”状态,无报错信息。
4.2 运行步骤
- 启动机械臂:接通电源,待机械臂+夹爪完成自检(进入“就绪”状态);
- 放置抓取目标:将待抓取物体放在机械臂“抓取位”(与代码中
[90, 90, 30, 0, 60, 0]对应的物理位置或修改代码中的位置参数); - 修改代码:将
RobotArmController("192.168.1.18", 8080, 3)中的IP改为实际机械臂IP; - 运行脚本:在终端执行
python 夹爪控制例程文件名.py; - 观察执行过程:
- 机械臂先运动到抓取位;
- 夹爪闭合完成抓取;
- 机械臂运动到放置位;
- 夹爪张开释放物体;
- 机械臂复位到初始位;
- 终端打印每一步的执行结果(成功/失败+错误码)。
4.3 常见问题与排查
针对夹爪控制的专属问题,补充如下排查方向:
1. 夹爪无动作(指令返回成功但无物理动作)
- 排查:
- 夹爪是否已正确安装并完成自检(示教器查看夹爪状态);
time.sleep()时间是否过短(建议至少2秒,确保硬件动作完成);- 速度参数是否设为0(
speed=0时夹爪无动作)。
2. 抓取失败(错误码非0)
- 排查:
- 力度参数是否超出夹爪硬件限制(通常0~500N,需参考夹爪手册);
- 抓取位是否超出夹爪工作范围(夹爪开合角度有限,需确保物体在夹持范围内);
- 机械臂连接等级是否为3(等级不足无法执行夹爪控制指令)。
3. 抓取后物体掉落
- 排查:
- 夹持力
force是否过小(可适当提高,如从200调整为300); - 机械臂运动速度
v是否过快(运动时冲击导致物体掉落,可降低movej的速度参数); - 夹爪表面是否光滑(可增加防滑垫提升摩擦力)。
- 夹持力
4. 释放失败(夹爪无法张开)
- 排查:
- 释放速度
speed是否过小(可适当提高); - 物体是否卡死在夹爪中(手动轻推物体,确认无卡顿);
- 超时时间
timeout是否过短(可延长至60秒,排查是否为动作超时)。
- 释放速度
五、总结与拓展
本文在上一篇基础运动控制的基础上,完成了睿尔曼机械臂夹爪控制的“代码解析+实操落地”,核心知识点如下:
- 夹爪控制的核心逻辑:机械臂连接→运动到抓取位→力控抓取→运动到放置位→释放→复位→断开连接;
- 夹爪核心函数参数:
set_gripper_pick_on:通过speed(闭合速度)、force(夹持力)控制抓取效果;set_gripper_release:通过speed(张开速度)控制释放效果;
- 协同控制关键:夹爪动作需与机械臂运动配合,通过
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)
這是控制夾爪完成“抓取”動作的核心函式,我們從引數含義和執行邏輯兩個維度拆解:
引數詳解
speed(必選,int):夾爪閉合的速度,取值範圍需符合睿爾曼夾爪硬體限制(通常0~1000),示例中設為500(中等速度):- 速度過小:夾爪閉合慢,作業效率低;
- 速度過大:易因衝擊導致抓取目標掉落或夾爪損壞。
force(必選,int):夾爪抓取時的夾持力,取值範圍通常0~500(單位:N,牛頓),示例中設為200(適中力度):- 力度過小:無法夾緊物體,易掉落;
- 力度過大:損壞易碎物體(如玻璃、塑膠件)或夾爪自身。
block(可選,bool):阻塞標誌,預設True:- True(阻塞):程式等待夾爪完成抓取動作後,再執行下一行程式碼;
- False(非阻塞):傳送抓取指令後程式立即執行後續程式碼,夾爪後臺完成抓取。
timeout(可選,int):超時時間,預設30秒:- 若夾爪因故障無法完成抓取動作,程式等待
timeout秒後判定為執行失敗,避免程式無限等待。
- 若夾爪因故障無法完成抓取動作,程式等待
執行邏輯
- 呼叫SDK核心介面
rm_set_gripper_pick_on,傳入速度、力度等引數,返回執行結果(0=成功,非0=錯誤碼); - 列印執行結果,便於除錯排查問題;
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)
這是控制夾爪完成“釋放”動作的核心函式,拆解如下:
引數詳解
speed(必選,int):夾爪張開的速度,取值範圍與抓取速度一致(通常0~1000),示例中設為500:- 釋放速度需適配抓取目標:易碎物體建議低速釋放,避免掉落;重型物體可適當提高速度。
block/timeout:含義與set_gripper_pick_on完全一致,預設阻塞+30秒超時。
執行邏輯
- 呼叫SDK核心介面
rm_set_gripper_release,傳入釋放速度等引數,返回執行結果; - 列印執行結果;
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()
主函式是夾爪作業的“完整執行流程”,我們按步驟拆解核心邏輯:
- 建立連線:建立
RobotArmController例項,傳入機械臂IP(192.168.1.18)、埠(8080)、連線等級(3),完成機械臂+夾爪的連線; - 確認SDK版本:列印
rm_api_version(),確保SDK版本與機械臂韌體相容,避免夾爪指令執行失敗; - 運動到抓取位:呼叫
movej將機械臂運動到預設的抓取位[90, 90, 30, 0, 60, 0](關節角度),此時夾爪正對抓取目標; - 夾爪抓取:呼叫
set_gripper_pick_on(500, 200),以500的速度、200N的力度完成抓取; - 運動到放置位:呼叫
movej將機械臂運動到放置位[0, 90, 30, 0, 60, 0],攜帶抓取目標移動; - 夾爪釋放:呼叫
set_gripper_release(500),以500的速度張開夾爪,釋放目標; - 復位到初始位:呼叫
movej將機械臂復位到抓取位,便於下一次作業; - 斷開連線:釋放連線資源,完成整個作業流程。
四、應用實踐:從程式碼到夾爪抓取實操
掌握夾爪控制程式碼邏輯後,我們透過實操完成“抓取-放置”作業,核心步驟如下:
4.1 環境搭建
4.1.1 硬體準備
- 基礎硬體:睿爾曼第三代機械臂(如RM_65)、電腦(Windows/Linux)、網線/無線網絡卡(確保與機械臂同網段);
- 新增硬體:睿爾曼配套電動夾爪(已正確安裝到機械臂末端);
- 輔助物料:待抓取物體(如塑膠杯、小積木,建議先從輕型、規則形狀物體開始)。
4.1.2 軟體準備
與上一篇完全一致:
- 安裝Python 3.7+(睿爾曼SDK推薦版本);
- 下載睿爾曼第三代機械臂SDK,解壓到本地;
- 將夾爪控制例程指令碼放在SDK指定目錄(確保
sys.path路徑正確)。
4.1.3 網路配置
與上一篇完全一致:
- 機械臂預設IP:192.168.1.18(可透過示教器修改);
- 電腦IP設定為192.168.1.x(x≠18,子網掩碼255.255.255.0);
- 測試連通性:ping 192.168.1.18,確保能ping通。
4.1.4 夾爪硬體確認
新增步驟:
- 檢查夾爪與機械臂末端的連線:確保夾爪固定牢固,供電/通訊介面無鬆動;
- 夾爪自檢:啟動機械臂後,透過示教器確認夾爪處於“就緒”狀態,無報錯資訊。
4.2 執行步驟
- 啟動機械臂:接通電源,待機械臂+夾爪完成自檢(進入“就緒”狀態);
- 放置抓取目標:將待抓取物體放在機械臂“抓取位”(與程式碼中
[90, 90, 30, 0, 60, 0]對應的物理位置或修改程式碼中的位置引數); - 修改程式碼:將
RobotArmController("192.168.1.18", 8080, 3)中的IP改為實際機械臂IP; - 執行指令碼:在終端執行
python 夾爪控制例程檔名.py; - 觀察執行過程:
- 機械臂先運動到抓取位;
- 夾爪閉合完成抓取;
- 機械臂運動到放置位;
- 夾爪張開釋放物體;
- 機械臂復位到初始位;
- 終端列印每一步的執行結果(成功/失敗+錯誤碼)。
4.3 常見問題與排查
針對夾爪控制的專屬問題,補充如下排查方向:
1. 夾爪無動作(指令返回成功但無物理動作)
- 排查:
- 夾爪是否已正確安裝並完成自檢(示教器檢視夾爪狀態);
time.sleep()時間是否過短(建議至少2秒,確保硬體動作完成);- 速度引數是否設為0(
speed=0時夾爪無動作)。
2. 抓取失敗(錯誤碼非0)
- 排查:
- 力度引數是否超出夾爪硬體限制(通常0~500N,需參考夾爪手冊);
- 抓取位是否超出夾爪工作範圍(夾爪開合角度有限,需確保物體在夾持範圍內);
- 機械臂連線等級是否為3(等級不足無法執行夾爪控制指令)。
3. 抓取後物體掉落
- 排查:
- 夾持力
force是否過小(可適當提高,如從200調整為300); - 機械臂運動速度
v是否過快(運動時衝擊導致物體掉落,可降低movej的速度引數); - 夾爪表面是否光滑(可增加防滑墊提升摩擦力)。
- 夾持力
4. 釋放失敗(夾爪無法張開)
- 排查:
- 釋放速度
speed是否過小(可適當提高); - 物體是否卡死在夾爪中(手動輕推物體,確認無卡頓);
- 超時時間
timeout是否過短(可延長至60秒,排查是否為動作超時)。
- 釋放速度
五、總結與拓展
本文在上一篇基礎運動控制的基礎上,完成了睿爾曼機械臂夾爪控制的“程式碼解析+實操落地”,核心知識點如下:
- 夾爪控制的核心邏輯:機械臂連線→運動到抓取位→力控抓取→運動到放置位→釋放→復位→斷開連線;
- 夾爪核心函式引數:
set_gripper_pick_on:透過speed(閉合速度)、force(夾持力)控制抓取效果;set_gripper_release:透過speed(張開速度)控制釋放效果;
- 協同控制關鍵:夾爪動作需與機械臂運動配合,透過
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.

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.sleepafter gripper moves so mechanics finish before the next command.from … import *: brings inrm_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
speed(int, required): jaw speed (typical range per hardware guide, e.g. 0–1000). Example500. Too low = slow cycle; too high = impact/drop risk.force(int, required): clamping force (documentation often 0–500 N-class; verify on your hardware). Example200.block(bool, default True): wait until motion completes vs fire-and-forget.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()
- Connect at IP
192.168.1.18, port8080, level3. - Print API version vs teach-pendant firmware expectations.
- Move to pre-grasp joints, clamp with speed/force (500/200).
- Move to place pose while holding.
- Release at speed 500.
- Retract/reset to a safe configuration.
- 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.pathresolves tosrc
Network
- Default arm IP
192.168.1.18(change on pendant if needed) - PC on
192.168.1.x, mask255.255.255.0,pingsucceeds
Gripper checks
- Mechanical mounting tight; power/data seated
- Pendant shows gripper ready, no faults
4.2 Run book
- Power arm; wait for ready/teach mode as required by site policy.
- Place the part at the physical pose matching your joint target (or edit joints).
- Set
RobotArmController("YOUR_IP", 8080, 3). python your_gripper_demo.py- 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.sleepif 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
forceslightly - Lower
movejspeed to reduce inertial slinging - Jaw surfaces slippery? add soft pads
4) Release fails / jaws stuck
- Raise open
speedmoderately - Clear mechanical interference
- Extend
timeoutto 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.