找回密码
 立即注册
首页 业界区 安全 具身智能:零基础入门睿尔曼机械臂(二)——从API例程 ...

具身智能:零基础入门睿尔曼机械臂(二)——从API例程到Python实操全解析

邹语彤 5 小时前
一、前言

随着智能制造的普及,机械臂控制已成为机器人领域入门的核心技能。相比于传统工业机械臂复杂的调试流程和封闭的开发环境,睿尔曼第三代机械臂提供了简洁的Python SDK(软件开发工具包),无需深厚的底层控制知识,即可快速实现机械臂的运动控制。
本文的核心目标是:以睿尔曼官方例程为蓝本,拆解机械臂控制的核心逻辑,让零基础读者理解“如何通过代码指挥机械臂运动”,并能动手完成基础的运动控制实操。无论你是高校学生、创客,还是刚接触机械臂的工程师,都能通过本文掌握睿尔曼第三代机械臂的基础控制方法。
二、睿尔曼第三代机械臂:入门友好的轻量化选择

睿尔曼第三代机械臂是面向科研、教育、轻量工业、创客场景的系列化产品,核心特点如下:
1. 多型号适配

例程中涉及的RM_65、RM_75、RML_63、ECO_65/63、GEN_72等型号,覆盖6轴/7轴构型,工作半径、负载能力适配不同场景,核心控制逻辑统一,学习一套代码可适配多型号。
2. 易用的Python API

提供封装完善的Python接口,无需关注运动学逆解、轨迹规划等底层算法,直接调用movej(关节运动)、movel(直线运动)等接口即可实现运动控制。
1.png

3. 网络通信方式

通过TCP/IP协议与机械臂通信,只需配置IP和端口即可建立连接,无需复杂的硬件接线。
4. 核心运动能力

支持关节空间运动、笛卡尔空间直线/圆弧运动,满足入门阶段的基础运动控制需求。
三、核心例程全解析:逐行吃透机械臂控制逻辑

接下来我们逐模块、逐行解析例程代码,从“代码为什么这么写”“每个参数是什么意思”两个维度,彻底掌握机械臂控制的核心逻辑。
3.1 环境配置与模块导入
  1. import sys
  2. import os
  3. # Add the parent directory of src to sys.path
  4. sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
  5. 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 机械臂型号-点位映射表
  1. # 定义机械臂型号到点位的映射  
  2. arm_models_to_points = {  
  3.     "RM_65": [  
  4.         [0, 20, 70, 0, 90, 0],
  5.         [0.3, 0, 0.3, 3.14, 0, 0],
  6.         [0.2, 0, 0.3, 3.14, 0, 0],
  7.         [0.3, 0, 0.3, 3.14, 0, 0],
  8.         [0.2, 0.05, 0.3, 3.14, 0, 0],
  9.         [0.2, -0.05, 0.3, 3.14, 0, 0] ,
  10.     ],  
  11.     # 其他型号省略...
  12. }
复制代码
这是一个“键值对”字典,核心作用是适配不同型号机械臂的运动点位

  • 键(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__:建立机械臂连接
  1. def __init__(self, ip, port, level=3, mode=2):
  2.     """
  3.     Initialize and connect to the robotic arm.
  4.     Args:
  5.         ip (str): IP address of the robot arm.
  6.         port (int): Port number.
  7.         level (int, optional): Connection level. Defaults to 3.
  8.         mode (int, optional): Thread mode (0: single, 1: dual, 2: triple). Defaults to 2.
  9.     """
  10.     self.thread_mode = rm_thread_mode_e(mode)
  11.     self.robot = RoboticArm(self.thread_mode)
  12.     self.handle = self.robot.rm_create_robot_arm(ip, port, level)
  13.     if self.handle.id == -1:
  14.         print("\nFailed to connect to the robot arm\n")
  15.         exit(1)
  16.     else:
  17.         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:获取机械臂型号
  1. def get_arm_model(self):
  2.     """Get robotic arm mode.
  3.     """
  4.     res, model = self.robot.rm_get_robot_info()
  5.     if res == 0:
  6.         return model["arm_model"]
  7.     else:
  8.         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:断开机械臂连接
  1. def disconnect(self):
  2.     """
  3.     Disconnect from the robot arm.
  4.     Returns:
  5.         None
  6.     """
  7.     handle = self.robot.rm_delete_robot_arm()
  8.     if handle == 0:
  9.         print("\nSuccessfully disconnected from the robot arm\n")
  10.     else:
  11.         print("\nFailed to disconnect from the robot arm\n")
复制代码

  • rm_delete_robot_arm():释放机械臂连接句柄,断开网络连接;
  • 注意:程序结束前必须调用该函数,否则可能导致机械臂处于“占用状态”,后续无法重新连接。
3.3.4 get_arm_software_info:获取软件信息
  1. def get_arm_software_info(self):
  2.     """
  3.     Get the software information of the robotic arm.
  4.     Args:
  5.         None
  6.     Returns:
  7.         None
  8.     """
  9.     software_info = self.robot.rm_get_arm_software_info()
  10.     if software_info[0] == 0:
  11.         print("\n================== Arm Software Information ==================")
  12.         print("Arm Model: ", software_info[1]['product_version'])
  13.         print("Algorithm Library Version: ", software_info[1]['algorithm_info']['version'])
  14.         print("Control Layer Software Version: ", software_info[1]['ctrl_info']['version'])
  15.         print("Dynamics Version: ", software_info[1]['dynamic_info']['model_version'])
  16.         print("Planning Layer Software Version: ", software_info[1]['plan_info']['version'])
  17.         print("==============================================================\n")
  18.     else:
  19.         print("\nFailed to get arm software information, Error code: ", software_info[0], "\n")
复制代码

  • rm_get_arm_software_info():获取机械臂的软件层信息,包括算法库版本、控制层版本、规划层版本等;
  • 作用:调试阶段可通过该接口确认机械臂固件版本是否与SDK兼容,避免因版本不匹配导致指令执行失败。
3.3.5 movej:关节空间运动(核心运动指令)
  1. def movej(self, joint, v=20, r=0, connect=0, block=1):
  2.     """
  3.     Perform movej motion.
  4.     Args:
  5.         joint (list of float): Joint positions.
  6.         v (float, optional): Speed of the motion. Defaults to 20.
  7.         connect (int, optional): Trajectory connection flag. Defaults to 0.
  8.         block (int, optional): Whether the function is blocking (1 for blocking, 0 for non-blocking). Defaults to 1.
  9.         r (float, optional): Blending radius. Defaults to 0.
  10.     Returns:
  11.         None
  12.     """
  13.     movej_result = self.robot.rm_movej(joint, v, r, connect, block)
  14.     if movej_result == 0:
  15.         print("\nmovej motion succeeded\n")
  16.     else:
  17.         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:笛卡尔空间直线运动
  1. def movel(self, pose, v=20, r=0, connect=0, block=1):
  2.     """
  3.     Perform movel motion.
  4.     Args:
  5.         pose (list of float): End position [x, y, z, rx, ry, rz].
  6.         v (float, optional): Speed of the motion. Defaults to 20.
  7.         connect (int, optional): Trajectory connection flag. Defaults to 0.
  8.         block (int, optional): Whether the function is blocking (1 for blocking, 0 for non-blocking). Defaults to 1.
  9.         r (float, optional): Blending radius. Defaults to 0.
  10.     Returns:
  11.         None
  12.     """
  13.     movel_result = self.robot.rm_movel(pose, v, r, connect, block)
  14.     if movel_result == 0:
  15.         print("\nmovel motion succeeded\n")
  16.     else:
  17.         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:笛卡尔空间圆弧运动
  1. def movec(self, pose_via, pose_to, v=20, r=0, loop=0, connect=0, block=1):
  2.     """
  3.     Perform movec motion.
  4.     Args:
  5.         pose_via (list of float): Via position [x, y, z, rx, ry, rz].
  6.         pose_to (list of float): End position for the circular path [x, y, z, rx, ry, rz].
  7.         v (float, optional): Speed of the motion. Defaults to 20.
  8.         loop (int, optional): Number of loops. Defaults to 0.
  9.         connect (int, optional): Trajectory connection flag. Defaults to 0.
  10.         block (int, optional): Whether the function is blocking (1 for blocking, 0 for non-blocking). Defaults to 1.
  11.         r (float, optional): Blending radius. Defaults to 0.
  12.     Returns:
  13.         None
  14.     """
  15.     movec_result = self.robot.rm_movec(pose_via, pose_to, v, r, loop, connect, block)
  16.     if movec_result == 0:
  17.         print("\nmovec motion succeeded\n")
  18.     else:
  19.         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:关节空间位姿运动
  1. def movej_p(self, pose, v=20, r=0, connect=0, block=1):
  2.     """
  3.     Perform movej_p motion.
  4.     Args:
  5.         pose (list of float): Position [x, y, z, rx, ry, rz].
  6.         v (float, optional): Speed of the motion. Defaults to 20.
  7.         connect (int, optional): Trajectory connection flag. Defaults to 0.
  8.         block (int, optional): Whether the function is blocking (1 for blocking, 0 for non-blocking). Defaults to 1.
  9.         r (float, optional): Blending radius. Defaults to 0.
  10.     Returns:
  11.         None
  12.     """
  13.     movej_p_result = self.robot.rm_movej_p(pose, v, r, connect, block)
  14.     if movej_p_result == 0:
  15.         print("\nmovej_p motion succeeded\n")
  16.     else:
  17.         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:完整控制流程
  1. def main():
  2.     # Create a robot arm controller instance and connect to the robot arm
  3.     robot_controller = RobotArmController("192.168.1.18", 8080, 3)
  4.     # Get API version
  5.     print("\nAPI Version: ", rm_api_version(), "\n")
  6.     # Get basic arm information
  7.     robot_controller.get_arm_software_info()
  8.     arm_model = robot_controller.get_arm_model()
  9.     points = arm_models_to_points.get(arm_model, [])
  10.     # Define joint positions for 6 DOF
  11.     joint_6dof = points[0]
  12.     # Perform movej motion for 6 DOF robot arm
  13.     robot_controller.movej(joint_6dof)
  14.     # Perform movej_p motion
  15.     robot_controller.movej_p(points[1])
  16.     # Perform movel motion
  17.     robot_controller.movel(points[2])
  18.     # Perform movej_p motion again
  19.     robot_controller.movej_p(points[3])
  20.     # Perform movec motion
  21.     robot_controller.movec(points[4], points[5], loop=2)
  22.     # Disconnect the robot arm
  23.     robot_controller.disconnect()
  24. if __name__ == "__main__":
  25.     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降低了机械臂控制的入门门槛,只要理解核心指令的逻辑,就能快速实现基础运动控制。希望本文能帮助大家迈出机械臂学习的第一步,后续可结合睿尔曼官方手册,深入探索更多高级功能!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册