具身智能:零基础入门睿尔曼机械臂(二)——从API例程到Python实操全解析
一、前言
随着智能制造的普及,机械臂控制已成为机器人领域入门的核心技能。相比于传统工业机械臂复杂的调试流程和封闭的开发环境,睿尔曼第三代机械臂提供了简洁的Python SDK(软件开发工具包),无需深厚的底层控制知识,即可快速实现机械臂的运动控制。
本文的核心目标是:以睿尔曼官方例程为蓝本,拆解机械臂控制的核心逻辑,让零基础读者理解“如何通过代码指挥机械臂运动”,并能动手完成基础的运动控制实操。无论你是高校学生、创客,还是刚接触机械臂的工程师,都能通过本文掌握睿尔曼第三代机械臂的基础控制方法。
二、睿尔曼第三代机械臂:入门友好的轻量化选择
睿尔曼第三代机械臂是面向科研、教育、轻量工业、创客场景的系列化产品,核心特点如下:
1. 多型号适配
例程中涉及的RM_65、RM_75、RML_63、ECO_65/63、GEN_72等型号,覆盖6轴/7轴构型,工作半径、负载能力适配不同场景,核心控制逻辑统一,学习一套代码可适配多型号。
2. 易用的Python API
提供封装完善的Python接口,无需关注运动学逆解、轨迹规划等底层算法,直接调用movej(关节运动)、movel(直线运动)等接口即可实现运动控制。

3. 网络通信方式
通过TCP/IP协议与机械臂通信,只需配置IP和端口即可建立连接,无需复杂的硬件接线。
4. 核心运动能力
支持关节空间运动、笛卡尔空间直线/圆弧运动,满足入门阶段的基础运动控制需求。
三、核心例程全解析:逐行吃透机械臂控制逻辑
接下来我们逐模块、逐行解析例程代码,从“代码为什么这么写”“每个参数是什么意思”两个维度,彻底掌握机械臂控制的核心逻辑。
3.1 环境配置与模块导入
import sys
import os
# 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:导入Python系统模块和操作系统模块,核心作用是处理文件路径。sys.path.append(...):这是Python工程中常见的“路径补全”操作。睿尔曼SDK的核心接口文件rm_robot_interface.py位于src/Robotic_Arm目录下,而例程脚本可能不在该目录的同级/父级路径中,因此需要通过os.path系列函数计算并添加SDK的根路径到Python的系统路径中,确保后续能成功导入核心接口。os.path.dirname(__file__):获取当前脚本文件的所在目录;os.path.join(..., '..', '..'):向上回溯两级目录(适配SDK的目录结构);os.path.abspath():将拼接后的相对路径转为绝对路径;sys.path.append():将绝对路径添加到Python的模块搜索路径中。
from src.Robotic_Arm.rm_robot_interface import *:导入睿尔曼机械臂的核心接口,包括RoboticArm类、rm_thread_mode_e枚举、各类运动指令函数(rm_movej/rm_movel等),这是实现机械臂控制的核心依赖。
3.2 机械臂型号-点位映射表
# 定义机械臂型号到点位的映射
arm_models_to_points = {
"RM_65": [
[0, 20, 70, 0, 90, 0],
[0.3, 0, 0.3, 3.14, 0, 0],
[0.2, 0, 0.3, 3.14, 0, 0],
[0.3, 0, 0.3, 3.14, 0, 0],
[0.2, 0.05, 0.3, 3.14, 0, 0],
[0.2, -0.05, 0.3, 3.14, 0, 0] ,
],
# 其他型号省略...
}
这是一个“键值对”字典,核心作用是适配不同型号机械臂的运动点位:
- 键(Key):机械臂型号(如RM_65),与机械臂硬件的型号一一对应;
- 值(Value):该型号对应的6组运动点位列表,每组点位的含义分两类:
- 第一组(如
[0, 20, 70, 0, 90, 0]):关节空间点位,每个数值对应机械臂某一个关节的角度(单位:度),6轴机械臂对应6个数值,7轴(如RM_75)对应7个数值; - 第二至第六组(如
[0.3, 0, 0.3, 3.14, 0, 0]):笛卡尔空间点位,格式为[x, y, z, rx, ry, rz]:x/y/z:机械臂末端执行器的空间坐标(单位:米);rx/ry/rz:机械臂末端的姿态角(单位:弧度,3.14≈π,对应180度)。
- 第一组(如
- 设计逻辑:不同型号机械臂的工作空间、关节范围不同,通过字典映射可让一套代码适配多型号,无需为每个型号单独写运动点位。
3.3 核心控制类RobotArmController解析
该类是例程的核心,封装了机械臂的“连接-控制-断开”全生命周期,我们逐函数解析:
3.3.1 初始化函数__init__:建立机械臂连接
def __init__(self, ip, port, level=3, mode=2):
"""
Initialize and connect to the robotic arm.
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")
- 参数说明:
ip/port:机械臂的网络IP和端口(睿尔曼默认端口多为8080),需确保电脑与机械臂处于同一局域网;level:连接等级(默认3),睿尔曼将连接权限分为不同等级,等级3为常用的“控制级”,可执行运动指令;mode:线程模式(0=单线程/1=双线程/2=三线程),默认三线程,兼顾运动控制、状态反馈的实时性。
- 核心逻辑:
rm_thread_mode_e(mode):将整数型的线程模式转为SDK定义的枚举类型(确保参数格式符合SDK要求);RoboticArm(self.thread_mode):创建机械臂控制实例;rm_create_robot_arm(ip, port, level):调用SDK接口建立与机械臂的连接,返回一个“句柄(handle)”——句柄是机械臂的唯一标识,后续所有运动指令都通过该句柄关联到具体的机械臂;- 句柄校验:
handle.id == -1表示连接失败,直接退出程序;否则打印连接成功信息。
3.3.2 get_arm_model:获取机械臂型号
def get_arm_model(self):
"""Get robotic arm mode.
"""
res, model = self.robot.rm_get_robot_info()
if res == 0:
return model["arm_model"]
else:
print("\nFailed to get robot arm model\n")
rm_get_robot_info():调用SDK接口获取机械臂基础信息,返回两个值:res:执行结果(0=成功,非0=失败,对应错误码);model:字典格式的机械臂信息,包含型号、固件版本等,model["arm_model"]即为机械臂型号(如RM_65);
- 作用:获取型号后,可从
arm_models_to_points字典中匹配对应的运动点位,实现多型号适配。
3.3.3 disconnect:断开机械臂连接
def disconnect(self):
"""
Disconnect from the robot arm.
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")
rm_delete_robot_arm():释放机械臂连接句柄,断开网络连接;- 注意:程序结束前必须调用该函数,否则可能导致机械臂处于“占用状态”,后续无法重新连接。
3.3.4 get_arm_software_info:获取软件信息
def get_arm_software_info(self):
"""
Get the software information of the robotic arm.
Args:
None
Returns:
None
"""
software_info = self.robot.rm_get_arm_software_info()
if software_info[0] == 0:
print("\n================== Arm Software Information ==================")
print("Arm Model: ", software_info[1]['product_version'])
print("Algorithm Library Version: ", software_info[1]['algorithm_info']['version'])
print("Control Layer Software Version: ", software_info[1]['ctrl_info']['version'])
print("Dynamics Version: ", software_info[1]['dynamic_info']['model_version'])
print("Planning Layer Software Version: ", software_info[1]['plan_info']['version'])
print("==============================================================\n")
else:
print("\nFailed to get arm software information, Error code: ", software_info[0], "\n")
rm_get_arm_software_info():获取机械臂的软件层信息,包括算法库版本、控制层版本、规划层版本等;- 作用:调试阶段可通过该接口确认机械臂固件版本是否与SDK兼容,避免因版本不匹配导致指令执行失败。
3.3.5 movej:关节空间运动(核心运动指令)
def movej(self, joint, v=20, r=0, connect=0, block=1):
"""
Perform movej motion.
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是关节空间运动指令,核心是让机械臂的每个关节从当前角度运动到目标角度,运动轨迹由SDK自动规划(无需关心末端路径)。
- 参数详解:
joint:目标关节角度列表(如[0, 20, 70, 0, 90, 0]),6轴填6个值,7轴填7个值,单位:度;v:运动速度(默认20),单位:度/秒,范围需符合机械臂硬件限制;r:混合半径(默认0),用于多段轨迹的平滑过渡,0表示无过渡;connect:轨迹连接标志(默认0),0=新轨迹,1=接续上一段轨迹;block:阻塞标志(默认1):- 1(阻塞):程序等待机械臂完成该运动后,再执行下一行代码;
- 0(非阻塞):发送指令后程序立即执行下一行,机械臂后台执行运动。
rm_movej():SDK核心接口,返回0表示指令执行成功,非0为错误码(可查睿尔曼SDK手册定位问题)。
3.3.6 movel:笛卡尔空间直线运动
def movel(self, pose, v=20, r=0, connect=0, block=1):
"""
Perform movel motion.
Args:
pose (list of float): End position [x, y, z, rx, ry, rz].
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
"""
movel_result = self.robot.rm_movel(pose, v, r, connect, block)
if movel_result == 0:
print("\nmovel motion succeeded\n")
else:
print("\nmovel motion failed, Error code: ", movel_result, "\n")
movel是笛卡尔空间直线运动指令,核心是让机械臂末端从当前位置以“直线”运动到目标位置,适用于需要精准路径的场景(如抓取、放置)。
- 核心区别于
movej:movej控制关节角度,movel控制末端的空间位置和姿态; - 参数
pose:目标位姿[x, y, z, rx, ry, rz],单位:x/y/z(米)、rx/ry/rz(弧度); - 其他参数与
movej一致,v的单位为:米/秒(区别于movej的度/秒)。
3.3.7 movec:笛卡尔空间圆弧运动
def movec(self, pose_via, pose_to, v=20, r=0, loop=0, connect=0, block=1):
"""
Perform movec motion.
Args:
pose_via (list of float): Via position [x, y, z, rx, ry, rz].
pose_to (list of float): End position for the circular path [x, y, z, rx, ry, rz].
v (float, optional): Speed of the motion. Defaults to 20.
loop (int, optional): Number of loops. Defaults to 0.
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
"""
movec_result = self.robot.rm_movec(pose_via, pose_to, v, r, loop, connect, block)
if movec_result == 0:
print("\nmovec motion succeeded\n")
else:
print("\nmovec motion failed, Error code: ", movec_result, "\n")
movec是圆弧运动指令,需要指定“途经点”和“目标点”,机械臂末端从当前位置→途经点→目标点,沿圆弧轨迹运动。
- 核心参数:
pose_via:圆弧途经点(必选),决定圆弧的曲率;pose_to:圆弧终点;loop:循环次数(默认0),0=执行1次,n=循环n次;
- 应用场景:避障运动、圆弧轨迹作业(如焊接、打磨)。
3.3.8 movej_p:关节空间位姿运动
def movej_p(self, pose, v=20, r=0, connect=0, block=1):
"""
Perform movej_p motion.
Args:
pose (list of float): Position [x, y, z, rx, ry, rz].
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_p_result = self.robot.rm_movej_p(pose, v, r, connect, block)
if movej_p_result == 0:
print("\nmovej_p motion succeeded\n")
else:
print("\nmovej_p motion failed, Error code: ", movej_p_result, "\n")
movej_p是movej的“位姿版”:输入笛卡尔空间位姿(x/y/z/rx/ry/rz),SDK自动计算对应的关节角度,然后以关节运动的方式到达目标位姿。
- 区别于
movel:movej_p的轨迹是关节空间的最优轨迹(非直线),运动速度更快;movel是末端直线轨迹,精度更高但速度稍慢。
3.4 主函数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")
# Get basic arm information
robot_controller.get_arm_software_info()
arm_model = robot_controller.get_arm_model()
points = arm_models_to_points.get(arm_model, [])
# Define joint positions for 6 DOF
joint_6dof = points[0]
# Perform movej motion for 6 DOF robot arm
robot_controller.movej(joint_6dof)
# Perform movej_p motion
robot_controller.movej_p(points[1])
# Perform movel motion
robot_controller.movel(points[2])
# Perform movej_p motion again
robot_controller.movej_p(points[3])
# Perform movec motion
robot_controller.movec(points[4], points[5], loop=2)
# Disconnect the robot arm
robot_controller.disconnect()
if __name__ == "__main__":
main()
主函数是机械臂控制的“执行流程”,完整逻辑如下:
- 建立连接:创建
RobotArmController实例,传入机械臂IP(192.168.1.18)、端口(8080)、连接等级(3),建立网络连接; - 获取基础信息:
rm_api_version():打印SDK的API版本,确认版本兼容性;get_arm_software_info():打印机械臂软件层信息;get_arm_model():获取机械臂型号,匹配对应的运动点位;
- 执行运动指令:按“关节运动→位姿关节运动→直线运动→位姿关节运动→圆弧运动”的顺序执行,完成一套基础运动流程;
- 断开连接:运动完成后释放连接,避免资源占用。
四、应用实践:从代码到机械臂运动
掌握代码逻辑后,我们通过实操让机械臂动起来,核心步骤如下:
4.1 环境搭建
- 硬件准备:睿尔曼第三代机械臂(如RM_65)、电脑(Windows/Linux)、网线/无线网卡(确保与机械臂同网段);
- 软件准备:
- 安装Python 3.7+(睿尔曼SDK推荐版本);
- 下载睿尔曼第三代机械臂SDK,解压到本地;
- 将例程脚本放在SDK指定目录(确保
sys.path路径正确);
- 网络配置:
- 机械臂默认IP:192.168.1.18(可通过机械臂示教器修改);
- 电脑IP设置为192.168.1.x(x≠18,子网掩码255.255.255.0);
- 测试连通性:ping 192.168.1.18,确保能ping通。
4.2 运行步骤
- 启动机械臂:接通电源,待机械臂完成自检(进入“就绪”状态);
- 修改代码:将
RobotArmController("192.168.1.18", 8080, 3)中的IP改为实际机械臂IP; - 运行脚本:在终端执行
python 例程文件名.py; - 观察机械臂:机械臂会按代码顺序执行关节运动→直线运动→圆弧运动,终端会打印每一步的执行结果。
4.3 常见问题与排查
- 连接失败(handle.id=-1):
- 排查:电脑与机械臂是否同网段、IP/端口是否正确、机械臂是否已开机并就绪、防火墙是否拦截端口;
- 运动指令执行失败(错误码非0):
- 排查:运动点位是否超出机械臂工作空间、关节角度/位姿是否符合硬件限制、SDK版本与机械臂固件版本是否兼容;
- 机械臂无运动但指令返回成功:
- 排查:
block参数是否设为0(非阻塞)、运动速度是否设为0、机械臂是否处于“急停”状态。
- 排查:
五、总结与拓展
5.1 核心总结
本文通过睿尔曼第三代机械臂的官方例程,完成了从“代码解析”到“实操落地”的入门学习,核心知识点如下:
- 睿尔曼机械臂的核心控制逻辑:通过Python SDK建立网络连接→调用运动指令→断开连接;
- 三类核心运动指令:
movej:关节运动,速度快,适合快速复位;movel:直线运动,路径精准,适合作业场景;movec:圆弧运动,适合轨迹化作业;
- 多型号适配:通过“型号-点位”字典,实现一套代码适配不同型号机械臂。
5.2 拓展方向
掌握基础控制后,可进一步探索:
- 点位标定:通过示教器记录实际作业点位,替换例程中的默认点位,实现个性化作业;
- IO控制:调用SDK接口控制机械臂末端夹爪(开合)、气泵(启停);
- 视觉引导:结合OpenCV识别目标位置,动态生成运动点位,实现“视觉抓取”;
- 轨迹规划:自定义多段轨迹,实现复杂的连续运动。
睿尔曼第三代机械臂的Python SDK降低了机械臂控制的入门门槛,只要理解核心指令的逻辑,就能快速实现基础运动控制。希望本文能帮助大家迈出机械臂学习的第一步,后续可结合睿尔曼官方手册,深入探索更多高级功能!

浙公网安备 33010602011771号