具身智能:零基础入门睿尔曼机械臂(二)——从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组运动点位列表,每组点位的含义分两类:
    1. 第一组(如[0, 20, 70, 0, 90, 0]):关节空间点位,每个数值对应机械臂某一个关节的角度(单位:度),6轴机械臂对应6个数值,7轴(如RM_75)对应7个数值;
    2. 第二至第六组(如[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=三线程),默认三线程,兼顾运动控制、状态反馈的实时性。
  • 核心逻辑
    1. rm_thread_mode_e(mode):将整数型的线程模式转为SDK定义的枚举类型(确保参数格式符合SDK要求);
    2. RoboticArm(self.thread_mode):创建机械臂控制实例;
    3. rm_create_robot_arm(ip, port, level):调用SDK接口建立与机械臂的连接,返回一个“句柄(handle)”——句柄是机械臂的唯一标识,后续所有运动指令都通过该句柄关联到具体的机械臂;
    4. 句柄校验: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自动规划(无需关心末端路径)。

  • 参数详解:
    1. joint:目标关节角度列表(如[0, 20, 70, 0, 90, 0]),6轴填6个值,7轴填7个值,单位:度;
    2. v:运动速度(默认20),单位:度/秒,范围需符合机械臂硬件限制;
    3. r:混合半径(默认0),用于多段轨迹的平滑过渡,0表示无过渡;
    4. connect:轨迹连接标志(默认0),0=新轨迹,1=接续上一段轨迹;
    5. 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笛卡尔空间直线运动指令,核心是让机械臂末端从当前位置以“直线”运动到目标位置,适用于需要精准路径的场景(如抓取、放置)。

  • 核心区别于movejmovej控制关节角度,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圆弧运动指令,需要指定“途经点”和“目标点”,机械臂末端从当前位置→途经点→目标点,沿圆弧轨迹运动。

  • 核心参数:
    1. pose_via:圆弧途经点(必选),决定圆弧的曲率;
    2. pose_to:圆弧终点;
    3. 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_pmovej的“位姿版”:输入笛卡尔空间位姿(x/y/z/rx/ry/rz),SDK自动计算对应的关节角度,然后以关节运动的方式到达目标位姿。

  • 区别于movelmovej_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()

主函数是机械臂控制的“执行流程”,完整逻辑如下:

  1. 建立连接:创建RobotArmController实例,传入机械臂IP(192.168.1.18)、端口(8080)、连接等级(3),建立网络连接;
  2. 获取基础信息
    • rm_api_version():打印SDK的API版本,确认版本兼容性;
    • get_arm_software_info():打印机械臂软件层信息;
    • get_arm_model():获取机械臂型号,匹配对应的运动点位;
  3. 执行运动指令:按“关节运动→位姿关节运动→直线运动→位姿关节运动→圆弧运动”的顺序执行,完成一套基础运动流程;
  4. 断开连接:运动完成后释放连接,避免资源占用。

四、应用实践:从代码到机械臂运动

掌握代码逻辑后,我们通过实操让机械臂动起来,核心步骤如下:

4.1 环境搭建

  1. 硬件准备:睿尔曼第三代机械臂(如RM_65)、电脑(Windows/Linux)、网线/无线网卡(确保与机械臂同网段);
  2. 软件准备
    • 安装Python 3.7+(睿尔曼SDK推荐版本);
    • 下载睿尔曼第三代机械臂SDK,解压到本地;
    • 将例程脚本放在SDK指定目录(确保sys.path路径正确);
  3. 网络配置
    • 机械臂默认IP:192.168.1.18(可通过机械臂示教器修改);
    • 电脑IP设置为192.168.1.x(x≠18,子网掩码255.255.255.0);
    • 测试连通性:ping 192.168.1.18,确保能ping通。

4.2 运行步骤

  1. 启动机械臂:接通电源,待机械臂完成自检(进入“就绪”状态);
  2. 修改代码:将RobotArmController("192.168.1.18", 8080, 3)中的IP改为实际机械臂IP;
  3. 运行脚本:在终端执行python 例程文件名.py
  4. 观察机械臂:机械臂会按代码顺序执行关节运动→直线运动→圆弧运动,终端会打印每一步的执行结果。

4.3 常见问题与排查

  1. 连接失败(handle.id=-1)
    • 排查:电脑与机械臂是否同网段、IP/端口是否正确、机械臂是否已开机并就绪、防火墙是否拦截端口;
  2. 运动指令执行失败(错误码非0)
    • 排查:运动点位是否超出机械臂工作空间、关节角度/位姿是否符合硬件限制、SDK版本与机械臂固件版本是否兼容;
  3. 机械臂无运动但指令返回成功
    • 排查:block参数是否设为0(非阻塞)、运动速度是否设为0、机械臂是否处于“急停”状态。

五、总结与拓展

5.1 核心总结

本文通过睿尔曼第三代机械臂的官方例程,完成了从“代码解析”到“实操落地”的入门学习,核心知识点如下:

  1. 睿尔曼机械臂的核心控制逻辑:通过Python SDK建立网络连接→调用运动指令→断开连接;
  2. 三类核心运动指令:
    • movej:关节运动,速度快,适合快速复位;
    • movel:直线运动,路径精准,适合作业场景;
    • movec:圆弧运动,适合轨迹化作业;
  3. 多型号适配:通过“型号-点位”字典,实现一套代码适配不同型号机械臂。

5.2 拓展方向

掌握基础控制后,可进一步探索:

  1. 点位标定:通过示教器记录实际作业点位,替换例程中的默认点位,实现个性化作业;
  2. IO控制:调用SDK接口控制机械臂末端夹爪(开合)、气泵(启停);
  3. 视觉引导:结合OpenCV识别目标位置,动态生成运动点位,实现“视觉抓取”;
  4. 轨迹规划:自定义多段轨迹,实现复杂的连续运动。

睿尔曼第三代机械臂的Python SDK降低了机械臂控制的入门门槛,只要理解核心指令的逻辑,就能快速实现基础运动控制。希望本文能帮助大家迈出机械臂学习的第一步,后续可结合睿尔曼官方手册,深入探索更多高级功能!

posted @ 2025-12-08 14:35  TTGF  阅读(7)  评论(0)    收藏  举报