--- url: /zh/1-python/0-prologue/0.1-version.html title: 版本记录 --- # 版本记录 [​](#版本记录) | 文档版本 | SDK 版本号 | 版本时间 | | ---- | ------- | ---------- | | V2.0 | 1.7.1.3 | 2025.07.07 | | V3.0 | 2.0.1.0 | 2026.01.26 | [更新说明](./../Agilebot%5FRobot%5FPython%5FSDK%5FChangeLog.html) --- url: /zh/1-python/0-prologue/0.2-compatibility.html title: 机器人版本兼容性 --- # 机器人版本兼容性 [​](#机器人版本兼容性) SDK 支持捷勃特 Scara、Puma 及协作机器人系列。请在已安装机器人软件的设备上使用。部分功能因版本不同返回结果有所差异,详见第 4 章功能列表。 SDK 连接到机械臂时会检查机械臂运动控制软件版本。低于最低要求将无法连接,低于推荐版本会提示版本过低,请及时更新兼容的机器人软件版本。 SDK 某些接口只支持对应版本的控制器,请注意查看具体接口兼容性。 | SDK 版本 | 兼容的机器人软件版本 | 支持状态 | | -------- | ------------------------------- | ---- | | v1.7.0.X | Copper v7.6.X.X、Bronze v7.6.X.X | 支持中 | | v1.7.1.X | Copper v7.6.X.X、Bronze v7.6.X.X | 支持中 | | v2.0.1.X | Copper v7.7.X.X、Bronze v7.7.X.X | 支持中 | --- url: /zh/1-python/1-intro/1.1-robot-system.html title: 1.1 机器人系统 --- # 1.1 机器人系统 [​](#1-1) SDK 安装于客户上位机,SDK 提供了上位机操作和检测机器人的接口,本系统由上位机、控制器和机器人本体组成。本体是指机械本体组成,机械本体由电机、减速机、编码器和传动机构等部分组成。控制柜操作面板上有状态指示灯、控制柜开关、通信接口等。 --- url: /zh/1-python/1-intro/1.2-envronment.html title: 1.2 环境要求 --- # 1.2 环境要求 [​](#1-2) 硬件及操作系统: * Windows 10 及以上 * x86\_64 架构 * Linux (推荐使用 Ubuntu 18.04 以上) * x86\_64 架构 * Arm 架构 Python 版本: * 3.8 及以上 --- url: /zh/1-python/1-intro/1.3-install.html title: 1.3 安装 --- # 1.3 安装 [​](#1-3) ## 环境安装 [​](#环境安装) * 下载 Python 环境,推荐使用 Conda 配置。安装适用于当前系统的最新版 Miniforge 或 Miniconda。 * Conda 下载地址:[Miniforge3](https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/LatestRelease) * 安装好后启动 Miniforge Prompt,输入以下指令进行 conda 初始化 ```shell conda init ``` * 安装好后启动 Miniforge Prompt 或者系统终端,输入下列命令创建新的 python 环境 ```shell conda create -n agilesdk python=3.10 ``` * 输入命令进入刚创建的环境 ```shell conda activate agilesdk ``` * 如果 Conda 环境安装不便,可使用 venv 创建和激活虚拟环境 ```shell # 创建 python3.10 -m venv agilesdk # Windows下激活环境 .\agilesdk\Scripts\activate # Linux下激活环境 source agilesdk/bin/activate ``` * 输入 cd 命令进入解压后目录,使用下方命令安装所需 python 包 ```shell cd 包解压目录 pip install -r requirements.txt ``` * 如果遇到安装错误,可重试、切换网络,或更换安装源后再试: ```shell pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ ``` * 如果 pip 安装失败,可打开 requirements.txt,对每个包使用 conda 进行安装 ```shell conda install package_name= ``` ## IDE 安装 [​](#ide安装) * 推荐使用 PyCharm 作为开发环境 * PyCharm 下载地址: * 下载并安装好 PyCharm Community Edition 后,启动软件 * 新建 Python 项目,项目类型选择纯 Python * 解释器类型选择基础 Conda,路径设置为之前创建的 agilesdk 环境 * 点击创建,即可开始编写代码 ## SDK 安装及测试 [​](#sdk安装及测试) * 输入下述命令安装 python 版本的机器人 SDK,将 x.x.x 替换为当前 sdk 版本号 ```shell pip install Agilebot.SDK.A-x.x.x-py3-none-any.whl ``` * 进入 example 示例文件夹,使用下述命令运行测试 ```shell cd example python 示例程序名(示例:python arm/get_version.py) ``` * 运行示例时上位机必须连接到机器人网络中。 --- url: /zh/1-python/2-glossary/ title: 2 名词解释 --- # 2 名词解释 [​](#2) | 名词 | 描述 | | ------ | ---------------------------------------------------------------- | | 示教器 | 连接在机器人上的手持设备,用于对机器人进行示教和控制 | | SDK | 软件开发工具包,用于对机器人进行编程和控制 | | 机器人网络 | 机器人与外部计算机之间的网络连接 | | 控制器 | 机器人的控制单元,负责执行运动指令、处理传感器数据和管理机器人状态 | | 机械臂 | 机器人的主要运动部分,由多个关节和连杆组成 | | 伺服系统 | 控制机器人关节运动的电机驱动系统,提供精确的位置和速度控制 | | 示教 | 通过手动操作机器人或示教器来记录机器人运动轨迹和动作的过程 | | 关节 | 机器人机械臂中连接各个连杆的可动部件,每个关节对应一个自由度 | | 笛卡尔坐标 | 以 X、Y、Z 三个相互垂直的轴为基准的三维坐标系统,用于描述机器人在空间中的位置和姿态 | | 位姿 | 机器人在空间中的位置和姿态的组合,包括位置坐标和旋转角度 | | 轨迹 | 机器人末端执行器在空间中移动的路径,通常由一系列位姿点组成 | | 负载 | 机器人末端执行器所承载的重量和物体,影响机器人的运动性能和精度 | | 坐标系 | 用于描述机器人位置和姿态的参考系统,包括基坐标系、工具坐标系、用户坐标系等 | | OVC | Overall Velocity Control,全局速度控制,用于设置机器人整体运动速度的倍率 | | OAC | Overall Acceleration Control,全局加速度控制,用于设置机器人整体加速度的倍率 | | TF | Tool Frame,工具坐标系,以机器人末端工具为原点的坐标系 | | UF | User Frame,用户坐标系,用户自定义的坐标系,便于编程和定位 | | TCS | Teach Coordinate System,示教坐标系,用于示教时的坐标参考系统 | | DH 参数 | Denavit-Hartenberg 参数,用于描述机器人连杆几何关系的标准参数 | | PR 寄存器 | Pose Register,位姿寄存器,用于存储机器人位姿信息的寄存器 | | MR 寄存器 | Motion Register,运动寄存器,用于存储运动相关参数的寄存器 | | SR 寄存器 | String Register,字符串寄存器,用于存储字符串信息的寄存器 | | R 寄存器 | Real Register,实数寄存器,用于存储数值信息的寄存器 | | MH 寄存器 | Modbus Holding Register,Modbus 保持寄存器,用于 Modbus 通信的保持寄存器 | | MI 寄存器 | Modbus Input Register,Modbus 输入寄存器,用于 Modbus 通信的输入寄存器 | | DI | Digital Input,数字信号输入,用于接收外部数字信号 | | DO | Digital Output,数字信号输出,用于控制外部设备或执行器 | | BAS | Basic Script,基础脚本语言,用于编写机器人控制程序的高级编程语言 | | Scara | Selective Compliance Assembly Robot Arm,选择性柔顺装配机器人手臂,一种四轴工业机器人类型 | | 协作机器人 | 能够与人类安全协作的机器人,通常具有力感知和碰撞检测功能 | | 工业机器人 | 用于工业自动化生产的机器人,通常具有高精度、高速度和高负载能力 | | Copper | 捷勃特协作机器人产品线的代号 | | Bronze | 捷勃特工业机器人产品线的代号 | --- url: /zh/1-python/3-struct/ title: 3 数据结构 --- # 3 数据结构 [​](#3) ## 3.1 StatusCodeEnum [​](#3-1) **说明** 接口返回状态码 备注:如发现未在说明书里显示的返回码,需要查看机器人故障码表或者根据返回值的字面意思理解 **导入** ```python from Agilebot import StatusCodeEnum ``` **属性** | **名称** | **枚举值** | **描述** | | ----------------------------------------- | ------- | ------------------------------------ | | OK | 0 | 成功 | | INCOMPATIBLE\_VERSION | \-1 | 版本不兼容 | | CONNECTION\_TIMEOUT | \-3 | 连接超时 | | INTERFACE\_NOTIMPLEMENTED | \-4 | 当前控制器该接口未实现 | | INDEX\_OUT\_OF\_RANGE | \-5 | 索引下标越界 | | UNSUPPORTED\_FILETYPE | \-6 | 不支持的文件类型 | | UNSUPPORTED\_PARAMETER | \-7 | 不支持的机器人参数 | | UNSUPPORTED\_SIGNAL\_TYPE | \-8 | 不支持的 IO 信号类型 | | PROGRAM\_NOT\_FOUND | \-9 | 找不到对应的程序 | | PROGRAM\_POSE\_NOT\_FOUND | \-10 | 找不到对应的程序点位 | | WRITE\_PROGRAM\_POSE\_FAILED | \-11 | 更新写入程序点位失败 | | GET\_ALARM\_CODE\_FAILED | \-12 | 访问报警服务获取报警码失败 | | WRONG\_POSITION\_INFO | \-13 | 控制器返回错误的点位信息 | | UNSUPPORTED\_TRATYPE | \-14 | 不支持的运动类型 | | INVALID\_DH\_LIST | \-15 | 错误的变换参数列表,请联系开发人员 | | INTERVAL\_PORTS\_MUST\_NOTNONE | \-16 | 时间间隔和输出端口列表和电平持续时间必须非空 | | INVALID\_IP\_ADDRESS | \-17 | 无效的 IP 地址 | | INVALID\_DH\_PARAMETERS | \-18 | 无效的 DH 参数 | | INVALID\_PAYLOAD\_INFO | \-19 | 无效的负载信息 | | INVALID\_FLYSHOT\_CONFIG | \-20 | 无效的飞拍配置参数 | | FAILED\_TO\_DOWNLOAD\_SAME\_NAME\_FILE | \-21 | 因重名不允许覆写 | | FAILED\_TO\_CONVERT\_CART\_TO\_JOINT | \-22 | 转换笛卡尔坐标失败 | | FAILED\_TO\_GET\_ALL\_INVERSE\_KINEMATICS | \-23 | 获取一个回转数内的八组解失败 | | COORDINATE\_LIMIT\_EXCEEDED | \-24 | 坐标系个数上限为 50 个,坐标系 ID 合法范围为 \[1, 50\] | | FILE\_NOTEXIST | \-25 | 文件不存在 | | INVALID\_IO\_LIST\_PARAMETERS | \-26 | 无效的 IO 列表参数 | | INVALID\_PARAMETER | \-27 | 无效的参数 | | NOT\_FOUND | \-28 | 找不到对应的数据 | | LOCAL\_PROXY\_UNSUPPORTED | \-29 | 当前环境不支持本地代理 | | CONTROLLER\_ERROR | \-254 | 控制器错误,详情请联系开发人员 | | SERVER\_ERR | \-255 | 其他原因 | ## 3.2 RobotStatusEnum [​](#3-2) **说明** 机器人运行状态 **导入** ```python from Agilebot import RobotStatusEnum ``` **属性** | **名称** | **枚举值** | **描述** | | ------------------------- | ------- | --------------- | | ROBOT\_UNKNOWN | \-1 | 未知状态 | | ROBOT\_IDLE | 0 | 机器人空闲 | | ROBOT\_RUNNING | 1 | 机器人运行中 | | ROBOT\_TEACHING | 2 | 机器人示教中 | | ROBOT\_DRAG | 3 | 机器人拖动中 | | ROBOT\_FORCE\_DRAG | 4 | 机器人强制拖动中 | | ROBOT\_IDLE\_TO\_RUNNING | 101 | 机器人中间状态 空闲转换为运行 | | ROBOT\_IDLE\_TO\_TEACHING | 102 | 机器人中间状态 空闲转换为示教 | | ROBOT\_RUNNING\_TO\_IDLE | 103 | 机器人中间状态 运行转换为空闲 | | ROBOT\_TEACHING\_TO\_IDLE | 104 | 机器人中间状态 示教转换为空闲 | ## 3.3 CtrlStatusEnum [​](#3-3) **说明** 控制器运行状态 **导入** ```python from Agilebot import CtrlStatusEnum ``` **属性** | 名称 | 枚举值 | 描述 | | --------------------------- | --- | --------------- | | CTRL\_UNKNOWN | \-1 | 未知的控制器状态 | | CTRL\_INIT | 0 | 控制器初始化 | | CTRL\_ENGAGED | 1 | 控制器使能 | | CTRL\_ESTOP | 2 | 控制器急停 | | CTRL\_TERMINATED | 3 | 控制器中止 | | CTRL\_ANY\_TO\_ESTOP | 101 | 控制器中间状态 其他转换为急停 | | CTRL\_ESTOP\_TO\_ENGAGED | 102 | 控制器中间状态 急停到使能 | | CTRL\_ESTOP\_TO\_TERMINATED | 103 | 控制器中间状态 急停到中止 | ## 3.4 ServoStatusEnum [​](#3-4) **说明** 伺服控制器状态 **导入** ```python from Agilebot import ServoStatusEnum ``` **属性** | 名称 | 枚举值 | 描述 | | ------------------ | --- | ---------- | | SERVO\_UNKNOWN | \-1 | 未知的伺服控制器状态 | | SERVO\_IDLE | 1 | 伺服控制器空闲 | | SERVO\_RUNNING | 2 | 伺服控制器运行中 | | SERVO\_DISABLE | 3 | 伺服控制器关闭 | | SERVO\_WAIT\_READY | 4 | 伺服控制器等待就绪 | | SERVO\_WAIT\_DOWN | 5 | 伺服控制器等待关闭 | | SERVO\_INIT | 10 | 伺服控制器初始化 | ## 3.5 SoftModeEnum [​](#3-5) **说明** 机器人 PC 模式状态 **导入** ```python from Agilebot import SoftModeEnum ``` **属性** | 名称 | 枚举值 | 描述 | | ------------- | --- | ------ | | UNKNOWN | 0 | 未知 | | AUTO | 1 | 自动模式 | | MANUAL\_LIMIT | 2 | 手动限速模式 | | MANUAL | 3 | 手动模式 | ## 3.6 PoseType [​](#3-6) **说明** 机器人参数类型 **导入** ```python from Agilebot import PoseType ``` **属性** | 名称 | 枚举值 | 描述 | | ----- | --- | ----- | | JOINT | 0 | 关节空间 | | CART | 1 | 笛卡尔坐标 | ## 3.7 TCSType [​](#3-7) **说明** 坐标系类型 **导入** ```python from Agilebot import TCSType ``` **属性** | 名称 | 枚举值 | 描述 | | ---------- | --- | ---------- | | JOINT | 0 | 关节空间 | | BASE | 1 | 基坐标系 | | WORLD | 2 | 世界坐标系 | | USER | 3 | 用户坐标系 | | TOOL | 4 | 工具坐标系 | | RTCP\_USER | 5 | RTCP 用户坐标系 | | RTCP\_TOOL | 6 | RTCP 工具坐标系 | ## 3.8 Joint [​](#3-8) **说明** 描述机器人关节位置的数据结构 **导入** ```python from Agilebot import Joint ``` **属性** | 属性 | 类型 | 描述 | | -- | ----- | ------- | | j1 | float | 关节 1 的值 | | j2 | float | 关节 2 的值 | | j3 | float | 关节 3 的值 | | j4 | float | 关节 4 的值 | | j5 | float | 关节 5 的值 | | j6 | float | 关节 6 的值 | | j7 | float | 关节 7 的值 | | j8 | float | 关节 8 的值 | | j9 | float | 关节 9 的值 | ## 3.9 Position [​](#3-9) **说明** 描述机器人笛卡尔位姿的数据结构 **导入** ```python from Agilebot import Position ``` **属性** | 属性 | 类型 | 描述 | | -- | ----- | ----- | | x | float | X 轴坐标 | | y | float | Y 轴坐标 | | z | float | Z 轴坐标 | | a | float | A 轴角度 | | b | float | B 轴角度 | | c | float | C 轴角度 | ## 3.10 Posture [​](#3-10) **说明** 描述机器人形态参数的数据结构 **导入** ```python from Agilebot import Posture ``` **属性** | 属性 | 类型 | 描述 | | ---------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- | | turn\_cycle | int\[\] | 各轴的回转数,取值范围为..., -2,-1,0,1,2,...。各轴处在 0° 姿势下为 0;执行直线、圆弧动作时目标点回转数自动选择。对应关节回转角≥180° 时取值≥1,-179.99\~179.99° 对应 0,≤-180° 时取值≤-1 | | wrist\_flip | int | 腕部翻转姿态,取值范围为 - 1、1。在 6 轴机器人 J5 关节配置中,值 = 1 表示腕向下翻转,值 =-1 表示腕向上翻转 | | arm\_up\_down | int | 臂部上下姿态,取值范围为 - 1、1。在 6 轴机器人 J3 关节配置中,值 = 1 表示手臂在上(前向条件下,3 轴在 4 轴到 2 轴连线上方且 J3<0),值 =-1 表示手臂在下(前向条件下,3 轴在该连线下方且 J3>0) | | arm\_back\_front | int | 臂部前后姿态,取值范围为 - 1、1。在 6 轴机器人 J1 关节配置中,值 = 1 表示手臂在前(协作面向前方,2 轴在 1 轴左侧),值 =-1 表示手臂在后(协作面向前方,2 轴在 1 轴右侧) | | arm\_left\_right | int | 臂部左右姿态,取值范围为 - 1、1。在 4 轴 Scara 机器人 J2 关节配置中,值 = 1 表示 Scara 手臂在右,值 =-1 表示 Scara 手臂在左 | ## 3.11 BaseCartData [​](#3-11) **说明** 描述机器人笛卡尔目标位姿的数据结构 **导入** ```python from Agilebot import BaseCartData ``` **属性** | 属性 | 类型 | 描述 | | -------- | ---------------- | -------- | | position | [Position](#3-9) | 笛卡尔位姿的数据 | | posture | [Posture](#3-10) | 机器人形态参数 | ## 3.12 MotionPose [​](#3-12) **说明** 描述机器人点位的结构。坐标数据中,XYZ 方向距离单位为毫米(mm),角度单位为度(°)。部分版本角度信息为弧度,详见功能列表返回结果说明。 **导入** ```python from Agilebot import MotionPose ``` **属性** | 属性 | 类型 | 描述 | | -------- | --------------------- | ----------------------- | | cartData | [BaseCartData](#3-11) | 笛卡尔数据 | | joint | [Joint](#3-8) | 关节数据 | | pt | [PoseType](#3-6) | 点位类型,默认为 PoseType.JOINT | ## 3.13 DHparam [​](#3-13) **说明** 机器人 DH 参数列表 **导入** ```python from Agilebot import DHparam ``` **属性** | 属性 | 类型 | 描述 | | ------ | ----- | --------- | | id | int | DH 参数的 ID | | d | float | 关节距离 | | a | float | 杆件长度 | | alpha | float | 杆件扭角 | | offset | float | 关节转角 | ## 3.14 PayloadInfo [​](#3-14) **说明** 机器人负载信息。 **导入** ```python from Agilebot import PayloadInfo ``` **属性** | 属性 | 类型 | 描述 | | --------------- | ------------- | -------- | | id | int | 序号 ID | | weight | float | 负载重量(kg) | | comment | str | 注释 | | mass\_center | MassCenter | 质心 | | inertia\_moment | InertiaMoment | 惯性矩 | ### MassCenter [​](#masscenter) | 属性 | 类型 | 描述 | | -- | ----- | -- | | x | float | X | | y | float | Y | | z | float | Z | ### InertiaMoment [​](#inertiamoment) | 属性 | 类型 | 描述 | | -- | ----- | -- | | lx | float | LX | | ly | float | LY | | lz | float | LZ | ## 3.15 ProgramCartData [​](#3-15) **说明** 程序点位信息 **导入** ```python from Agilebot import ProgramCartData ``` **属性** | 属性 | 类型 | 描述 | | -------- | --------------------- | ----------- | | baseCart | [BaseCartData](#3-11) | 笛卡尔数据 | | uf | int | 使用的用户坐标系 ID | | tf | int | 使用的工具坐标系 ID | ## 3.16 ProgramPoseData [​](#3-16) **说明** 程序点位信息 **导入** ```python from Agilebot import ProgramPoseData ``` **属性** | 属性 | 类型 | 描述 | | -------- | ------------------------ | ----------------------- | | cartData | [ProgramCartData](#3-15) | 程序点位数据 | | joint | [Joint](#3-8) | 关节数据 | | pt | [PoseType](#3-6) | 点位类型,默认为 PoseType.JOINT | ## 3.17 ProgramPose [​](#3-17) **说明** 程序点位信息 **导入** ```python from Agilebot import ProgramPose ``` **属性** | 属性 | 类型 | 描述 | | -------- | ------------------------ | ------ | | poseData | [ProgramPoseData](#3-16) | 程序点位数据 | | id | int | 点位 ID | | name | str | 点位名称 | | comment | str | 点位注释 | ## 3.18 PoseRegisterData [​](#3-18) **说明** 寄存器点类,用于表示和处理机械臂的寄存器点数据。 **导入** ```python from Agilebot import PoseRegisterData ``` **属性** | 属性 | 类型 | 描述 | | -------- | --------------------- | ----------------------- | | cartData | [BaseCartData](#3-11) | 笛卡尔数据 | | joint | [Joint](#3-8) | 关节数据 | | pt | [PoseType](#3-6) | 点位类型,默认为 PoseType.JOINT | ## 3.19 PoseRegister [​](#3-19) **说明** 寄存器点类,用于表示和处理机械臂的寄存器点数据。 **导入** ```python from Agilebot import PoseRegister ``` **属性** | 属性 | 类型 | 描述 | | ---------------- | ------------------------- | ------ | | poseRegisterData | [PoseRegisterData](#3-18) | 程序点位数据 | | id | int | 点位 ID | | name | str | 点位名称 | | comment | str | 点位注释 | ## 3.20 TransformStatusEnum [​](#3-20) **说明** 离线轨迹文件转换状态的枚举 **导入** ```python from Agilebot import TransformStatusEnum ``` **属性** | 名称 | 枚举值 | 描述 | | --------------------- | --- | --------- | | TRANSFORM\_START | 0 | 转换任务开始 | | TRANSFORM\_RUNNING | 1 | 转换任务执行中 | | TRANSFORM\_SUCCESS | 2 | 转换任务已完成 | | TRANSFORM\_FAILED | 3 | 转换任务失败 | | TRANSFORM\_NOT\_FOUND | 4 | 转换任务没找到 | | TRANSFORM\_UNKNOWN | 5 | 未知的转换任务状态 | ## 3.21 HWState [​](#3-21) **说明** 机器人状态 HWState 枚举 **导入** ```python from Agilebot import HWState ``` **属性** | 名称 | 描述 | | ---------------------------------- | -------------- | | TOPIC\_JOINT | 发布机械臂关节状态反馈 | | TOPIC\_CURRENT\_CARTESIAN | 发布 TCP 当前笛卡尔坐标 | | TOPIC\_UF | 发布当前用户坐标系信息 | | TOPIC\_TF | 发布当前工具坐标系信息 | | TOPIC\_VELOCITY | 发布全局速度比率 | | TOPIC\_RUNNING\_STATUS | 发布控制器运行状态 | | TOPIC\_INTERPRETER\_STATUS | 发布解释器状态 | | TOPIC\_ROBOT\_STATUS | 发布机器人状态 | | TOPIC\_CTRL\_STATUS | 发布控制器状态 | | TOPIC\_SERVO\_STATUS | 发布伺服控制器状态 | | TOPIC\_TRAJECTORY\_RECORDS\_STATUS | 发布轨迹复现记录状态 | ## 3.22 CoordinateSystemType [​](#3-22) **说明** 机器人坐标系相关信息 **导入** ```python from Agilebot import CoordinateSystemType ``` **属性** | 名称 | 枚举值 | 描述 | | --------- | --- | ----- | | UserFrame | 0 | 用户坐标系 | | ToolFrame | 1 | 工具坐标系 | ## 3.23 Coordinate [​](#3-23) **说明** 坐标系信息,用于工具坐标系和用户坐标系。 Coordinate system data, including tool frame and user frame. **导入** ```python from Agilebot import Coordinate ``` **属性** | 属性 | 类型 | 描述 | | ------- | ---------------- | ------- | | id | int | 坐标系 ID | | name | str | 坐标系名称 | | comment | str | 坐标系描述 | | data | [Position](#3-9) | 坐标系位置数据 | ## 3.24 DragStatus [​](#3-24) **说明** 机器人轴拖动状态类 **导入** ```python from Agilebot import DragStatus ``` **属性** | 属性 | 类型 | 描述 | | -------------------- | ---------------------- | -------------- | | cart\_status | [CartStatus](#3-24-1) | 笛卡尔坐标系各轴拖动锁定状态 | | joint\_status | [JointStatus](#3-24-2) | 关节轴拖动锁定状态 | | is\_continuous\_drag | bool | 持续拖动的标志 | ### 3.24.1 CartStatus [​](#3-24-1) **说明** 笛卡尔状态类,用于表示笛卡尔坐标系的状态。 **导入** ```python from Agilebot import CartStatus ``` **属性** | 属性 | 类型 | 描述 | | -- | ---- | ----- | | x | bool | X 轴状态 | | y | bool | Y 轴状态 | | z | bool | Z 轴状态 | | a | bool | A 轴状态 | | b | bool | B 轴状态 | | c | bool | C 轴状态 | ### 3.24.2 JointStatus [​](#3-24-2) **说明** 关节状态类,用于表示机械臂各关节的状态。所有关节的状态默认为 True(可用)。 **导入** ```python from Agilebot import JointStatus ``` **属性** | 属性 | 类型 | 描述 | | -- | ---- | ------ | | j1 | bool | J1 轴状态 | | j2 | bool | J2 轴状态 | | j3 | bool | J3 轴状态 | | j4 | bool | J4 轴状态 | | j5 | bool | J5 轴状态 | | j6 | bool | J6 轴状态 | | j7 | bool | J7 轴状态 | | j8 | bool | J8 轴状态 | | j9 | bool | J9 轴状态 | ## 3.25 ModbusChannel [​](#3-25) **说明** Modbus 通道类型 **导入** ```python from Agilebot import ModbusChannel ``` **属性** | 名称 | 枚举值 | 描述 | | ------------------------ | --- | --------------- | | CONTROLLER\_TCP\_TO\_485 | 2 | TCP2RS485 模块通道。 | | WRIST\_485\_0 | 3 | 手腕 AI 通道。 | | WRIST\_485\_1 | 4 | 手腕 DO 通道。 | | CONTROLLER\_485 | 5 | 控制柜 485 通道。 | ## 3.26 PayloadIdentifyState [​](#3-26) **说明** 负载测定状态。 **导入** ```python from Agilebot import PayloadIdentifyState ``` **属性** | 名称 | 枚举值 | 描述 | | -------------------------- | --- | ---------- | | PAYLOAD\_CHECK\_INIT | 0 | 负载测定检查初始化中 | | PAYLOAD\_CHECK\_RUNNING | 1 | 负载测定检查运行中 | | PAYLOAD\_CHECK\_SUCCESS | 2 | 负载测定检查成功 | | PAYLOAD\_CHECK\_FAILED | 3 | 负载测定检查失败 | | PAYLOAD\_IDENTIFY\_INIT | 4 | 负载测定初始化 | | PAYLOAD\_IDENTIFY\_RUNNING | 5 | 负载测定运行中 | | PAYLOAD\_IDENTIFY\_SUCCESS | 6 | 负载测定成功 | | PAYLOAD\_IDENTIFY\_FAILED | 7 | 负载测定失败 | ## 3.27 MoveMode [​](#3-27) **说明** 示教运动模式 **导入** ```python from Agilebot import MoveMode ``` **属性** | 名称 | 枚举值 | 描述 | | ---------- | --- | ---- | | Continuous | 0 | 连续运动 | | Stepping | 1 | 步进运动 | ## 3.28 SignalType [​](#3-28) **说明** `SignalType` 是一个枚举类,用于区分不同类型的输入输出信号。它涵盖了数字信号、专用信号、手臂信号、组信号、模拟信号等多种类型,帮助在机器人控制系统中准确识别和管理不同类型的信号。 **导入** ```python from Agilebot import SignalType ``` **属性** | 名称 | 枚举值 | 描述 | | --- | --- | ------------------------------- | | DI | 1 | 数字输入信号(Digital Input) | | DO | 2 | 数字输出信号(Digital Output) | | UI | 3 | 专用输入信号(User Input) | | UO | 4 | 专用输出信号(User Output) | | RI | 5 | 远程控制输入信号(Remote Control Input) | | RO | 6 | 远程控制输出信号(Remote Control Output) | | GI | 7 | 组输入信号(Group Input) | | GO | 8 | 组输出信号(Group Output) | | TAI | 9 | 手腕模拟输入信号(Tool Analog Input) | | TDI | 10 | 手腕数字输入信号(Tool Digital Input) | | TDO | 11 | 手腕数字输出信号(Tool Digital Output) | | AI | 12 | 模拟输入信号(Analog Input) | | AO | 13 | 模拟输出信号(Analog Output) | ## 3.29 SignalValue [​](#3-29) **说明** `SignalValue` 类用于定义信号的开关值。它通过两个常量 `OFF` 和 `ON` 来表示信号的关闭和开启状态。此类在机器人控制系统中用于控制和读取信号的状态。 **导入** ```python from Agilebot import SignalValue ``` **属性** | 名称 | 值 | 描述 | | --- | - | ---- | | OFF | 0 | 信号关闭 | | ON | 1 | 信号开启 | ## 3.30 SerialParams [​](#3-30) **说明** 串口通讯参数类,用于配置 Modbus-RTU/TCP 转 485 通讯时的完整参数集合。 实例化后可直接传递给底层通讯接口,实现一键参数下发。 **导入** ```python from Agilebot import SerialParams, ModbusChannel, ModbusParity ``` **构造方法** ```python SerialParams( id: int = 1, channel: ModbusChannel = ModbusChannel.CONTROLLER_TCP_TO_485, ip: str = "10.27.1.80", port: int = 502, baud: int = 9600, data_bit: int = 8, stop_bit: int = 1, parity: ModbusParity = ModbusParity.NONE, timeout: int = 1000 ) ``` **属性** | 属性 | 类型 | 描述 | | --------- | ------------- | ----------------------------------------------------------------------- | | id | int | 主站 id | | channel | ModbusChannel | 通讯通道,如 CONTROLLER\_TCP\_TO\_485 | | ip | str | CONTROLLER\_TCP\_TO\_485 模块的地址,仅 channel 为 CONTROLLER\_TCP\_TO\_485 时有效 | | port | int | CONTROLLER\_TCP\_TO\_485 模块的端口,仅 channel 为 CONTROLLER\_TCP\_TO\_485 时有效 | | baud | int | 串口波特率,可选 9600\\19200\\38400\\57600\\115200\\1000000 | | data\_bit | int | 数据位长度,可选 8\\9 | | stop\_bit | int | 停止位长度,可选 1\\2 | | parity | ModbusParity | 校验位,可选 NONE\\ODD\\EVEN,默认无校验 ModbusParity.NONE | | timeout | int | 读 / 写超时时间,单位毫秒,默认 1000 ms | ## 3.31 SubPub 订阅相关类型 [​](#3-31) ### 3.31.1 RobotTopicType [​](#3-31-1) **说明** 机器人实时数据主题枚举,用于订阅或发布机器人状态。 **导入** ```python from Agilebot import RobotTopicType ``` **枚举值** | 名称 | 描述 | | ---------------------------- | ------------------------------------ | | JOINT\_POSITION | 关节实际位置 | | CARTESIAN\_POSITION | 当前用户工具坐标系下 TCP 笛卡尔位姿(x,y,z,rx,ry,rz) | | TCP\_WORLD\_CARTESIAN | 世界坐标系下的 TCP 笛卡尔位姿 | | TCP\_BASE\_CARTESIAN | 基坐标系下的 TCP 笛卡尔位姿 | | USER\_FRAME | 当前用户坐标系编号 | | TOOL\_FRAME | 当前工具坐标系编号 | | VELOCITY\_RATIO | 全局速度比率(0–100 %) | | GLOBAL\_ACC\_RATIO | 全局加速度比率(0–100 %) | | CALIBRATE\_STATUS | 轴组校准状态 | | TRAJECTORY\_RECORD | 轨迹记录状态 | | RUNNING\_STATUS | 控制器运行状态 | | INTERPRETER\_STATUS | 解释器状态(运行 / 暂停 / 停止 / 错误) | | ROBOT\_STATUS | 机器人本体综合状态 | | CTRL\_STATUS | 控制器就绪状态 | | SERVO\_STATUS | 伺服使能状态 | | USER\_OP\_MODE | 当前用户操作模式 | | SOFT\_OP\_MODE | 当前软操作模式 | | OPERATION\_STATUS | 操作状态 | | PERFORMANCE\_GEAR | 性能档位 | | POWER\_STATUS | 电源状态 | | POWER\_ON\_STATUS | 上电状态 | | SAFETY\_ALARM | 安全报警 | | SAFETY\_PLANE\_STATUS | 安全平面状态 | | TOOL\_POSTURE\_LIMIT\_STATUS | 工具姿态限制状态 | | JOINTS\_RECORD | 关节记录 | | TP\_PROGRAM\_STATUS | TP 程序运行状态 | --- ### 3.31.2 RegTopicType [​](#3-31-2) **说明** 预置寄存器主题类型枚举,用于访问控制器内部 R / MR / SR / PR 寄存器。 **导入** ```python from Agilebot import RegTopicType ``` **枚举值** | 名称 | 枚举值 | 描述 | | -- | --- | ------ | | R | R | 通用寄存器 | | MR | MR | 运动寄存器 | | SR | SR | 字符串寄存器 | | PR | PR | 位置寄存器 | --- ### 3.31.3 IOTopicType [​](#3-31-3) **说明** 预置 IO 主题类型枚举,涵盖数字、组、模拟、工具 IO 及专用 IO。 **导入** ```python from Agilebot import IOTopicType ``` **枚举值** | 名称 | 枚举值 | 描述 | | --- | --- | ------ | | DI | DI | 数字输入 | | DO | DO | 数字输出 | | GI | GI | 组输入 | | GO | GO | 组输出 | | RI | RI | 远程控制输入 | | RO | RO | 远程控制输出 | | UI | UI | 专用输入 | | UO | UO | 专用输出 | | TDI | TDI | 工具数字输入 | | TDO | TDO | 工具数字输出 | | TAI | TAI | 工具模拟输入 | | AI | AI | 通用模拟输入 | | AO | AO | 通用模拟输出 | ## 3.32 BasScript 相关类型 [​](#3-32) BasScript 类使用以下枚举类型来定义各种参数和配置选项: ### 3.32.1 MovePoseType [​](#3-32-1) **说明** 坐标类型 / Coordinate types **导入** ```python from Agilebot import MovePoseType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ------ | | PR | "PR" | PR | ### 3.32.2 SmoothType [​](#3-32-2) **说明** 平滑类型 / Smooth types **导入** ```python from Agilebot import SmoothType ``` **属性** | **名称** | **枚举值** | **描述** | | ---------------- | ------- | ----------- | | FINE | "FINE" | 无 / None | | SMOOTH\_DISTANCE | "SD" | 线性 / Linear | ### 3.32.3 SpeedType [​](#3-32-3) **说明** 速度类型 / Speed types **导入** ```python from Agilebot import SpeedType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ------------- | | VALUE | 0 | 绝对 / Absolute | | MR | 1 | 相对 / Relative | ### 3.32.4 RegisterType [​](#3-32-4) **说明** 寄存器类型 / Register types **导入** ```python from Agilebot import RegisterType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ------ | | R | "R" | R | | SR | "SR" | SR | | MH | "MH" | MH | | MI | "MI" | MI | ### 3.32.5 IOType [​](#3-32-5) **说明** IO 类型 / IO types **导入** ```python from Agilebot import IOType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ------ | | DI | "DI" | DI | | DO | "DO" | DO | | AI | "AI" | AI | | AO | "AO" | AO | | RI | "RI" | RI | | RO | "RO" | RO | | UI | "UI" | UI | | UO | "UO" | UO | | GI | "GI" | GI | | GO | "GO" | GO | | TAI | "TAI" | TAI | | TAO | "TAO" | TAO | | TDI | "TDI" | TDI | | TDO | "TDO" | TDO | ### 3.32.6 IOStatus [​](#3-32-6) **说明** IO 开关状态 / IO switch status **导入** ```python from Agilebot import IOStatus ``` **属性** | **名称** | **枚举值** | **描述** | | -------------- | ------- | ------------------- | | ON | "ON" | 开 / On | | OFF | "OFF" | 关 / Off | | PULSE | "PULSE" | 脉冲 / Pulse | | POSITIVE\_EDGE | "PE" | 上升沿 / Positive edge | | NEGATIVE\_EDGE | "NE" | 下降沿 / Negative edge | ### 3.32.7 MathOperator [​](#3-32-7) **说明** 数学操作符 / Math operators **导入** ```python from Agilebot import MathOperator ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ------------ | | ADD | "+" | 加 / Add | | SUB | "-" | 减 / Subtract | | MUL | "\*" | 乘 / Multiply | | DIV | "/" | 除 / Divide | ### 3.32.8 BooleanOperator [​](#3-32-8) **说明** 布尔操作符 / Boolean operators **导入** ```python from Agilebot import BooleanOperator ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ---------------------------- | | AND | "AND" | 与 / And | | OR | "OR" | 或 / Or | | EQ | "=" | 等于 / Equal | | NE | "<>" | 不等于 / Not equal | | GT | ">" | 大于 / Greater than | | GE | ">=" | 大于等于 / Greater than or equal | | LT | "<" | 小于 / Less than | | LE | "<=" | 小于等于 / Less than or equal | ### 3.32.9 AssignType [​](#3-32-9) **说明** 赋值类型 / Assignment types **导入** ```python from Agilebot import AssignType ``` **属性** | **名称** | **枚举值** | **描述** | | ----------- | ------- | ------------------- | | R | "R" | R | | MR | "MR" | MR | | PR | "PR" | PR | | PR\_ELEMENT | " PR" | PR 子元素 / PR element | | SR | "SR" | SR | | UF | "UF" | UF | | TF | "TF" | TF | | MH | "MH" | MH | | MI | "MI" | MI | | DO | "DO" | DO | | RO | "RO" | RO | | GO | "GO" | GO | | AO | "AO" | AO | | TAO | "TAO" | TAO | | TDO | "TDO" | TDO | ### 3.32.10 OtherType [​](#3-32-10) **说明** 其他类型 / Other types **导入** ```python from Agilebot import OtherType ``` **属性** | **名称** | **枚举值** | **描述** | | ------------- | ------- | ------------------- | | VALUE | 0 | 值 / Value | | STRING | 1 | 字符串 / String | | IO\_STATUS | 2 | 状态 / Status | | CURRENT\_POSE | 3 | 当前位姿 / Current pose | ### 3.32.11 CurrentPose [​](#3-32-11) **说明** 当前位姿 / Current pose **导入** ```python from Agilebot import CurrentPose ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | -------- | ----------------------- | | J\_POS | "J\_POS" | 关节值 / Joint values | | L\_POS | "L\_POS" | 笛卡尔值 / Cartesian values | ### 3.32.12 LoadType [​](#3-32-12) **说明** 载入类型 / Load types **导入** ```python from Agilebot import LoadType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | -------- | ------------ | | R | "R" | R | | SR | "SR" | SR | | STRING | "STRING" | 字符串 / String | | VALUE | "VALUE" | 值 / Value | ### 3.32.13 StrType [​](#3-32-13) **说明** 字符串类型 / String types **导入** ```python from Agilebot import StrType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | -------- | -------------------- | | STRING | "STRING" | 字符串 / String | | SR | "SR" | SR 寄存器 / SR register | ### 3.32.14 ValueType [​](#3-32-14) **说明** 数值类型 / Value types **导入** ```python from Agilebot import ValueType ``` **属性** | **名称** | **枚举值** | **描述** | | ------ | ------- | ------------------ | | VALUE | "VALUE" | 数值 / Value | | R | "R" | R 寄存器 / R register | ### 3.32.15 ParamType [​](#3-32-15) **说明** 参数类型 / Parameter types **导入** ```python from Agilebot import ParamType ``` **属性** | **名称** | **枚举值** | **描述** | | ----------- | ------------- | --------------------------- | | TF\_NO | "TF\_NO" | TF 号 / TF number | | UF\_NO | "UF\_NO" | UF 号 / UF number | | OVC | "OVC" | 全局速度 / Global velocity | | OAC | "OAC" | 全局加速度 / Global acceleration | | PAYLOAD\_NO | "PAYLOAD\_NO" | 负载序号 / Payload number | --- url: /zh/1-python/4-methods/4.1-arm.html title: 4.1 机器人基础操作 --- # 4.1 机器人基础操作 [​](#4-1) ## 概述 [​](#概述) Arm 类封装了绝大多数与捷勃特机器人相关的高频接口,负责完成连接管理、状态查询、控制指令发送等核心能力。典型使用流程: 1. 实例化 `Arm(local_proxy=False)` 2. 调用 `connect()` 建立与控制器 / 示教器的通信 3. 根据业务调用运动、状态、I/O 等接口 4. 最后调用 `disconnect()` 或 `release_access()` 等方法释放资源 实例化后无需手动加载配置,类会在内部完成: * SDK 版本检查 * 控制器类型识别 * 代理服务的自动选择 * 在日志中提示所使用的通信链路 ### 注意事项 [​](#注意事项) * 当机器人软件版本低于 7.7.0 时,请确保 `Arm` 类实例化时 `local_proxy=True` ,且 PC 具备本地通信能力。 * 与工业机器人配合时,若需要保持 PC 模式: * 连接后调用 `acquire_access()` 申请示教器控制权限 * 操作完成后及时调用 `release_access()` 释放权限 * 避免示教器控制权限被长时间占用 ## 类构造函数 [​](#类构造函数) | 方法名 | **Arm**( local\_proxy : bool = False) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 捷勃特机器人类,封装了所有可用接口。 | | 请求参数 | local\_proxy : bool 是否使用本地控制器代理服务 (默认 False ; True : 在本机启动代理服务,仅支持输入 IP 地址(不支持域名),需 PC 具备本地通信能力; False : 使用控制器 / 示教器内置代理服务,机器人软件需为 v7.7 及以上并已安装代理服务)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.1 连接机器人 [​](#4-1-1) | 方法名 | **connect**( arm\_controller\_ip : str = COBOT\_IP , teach\_panel\_ip : Optional\[str\] = None) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 连接捷勃特机器人。该方法会自动检测机器人类型(协作 / 工业),处理示教器 IP,并启动相应的代理服务。 | | 请求参数 | arm\_controller\_ip : str 协作或工业机器人控制柜 IP 地址 (缺省使用 COBOT\_IP 常量)。 teach\_panel\_ip : Optional \[str\] 工业机器人示教器 IP (缺省时协作机器人无需示教器 IP,工业机器人自动匹配默认示教器 IP 或沿用控制柜 IP)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | \- 仅当 local\_proxy=True 且 arm\_controller\_ip 为有效 IP 地址时才会启动本地代理;Airbot 域名仅支持直连,无法配合本地代理。\- 当 arm\_controller\_ip 的 IP / 域名无效时返回 INVALID\_IP\_ADDRESS 。\- 若无法连接控制器,会返回 CONTROLLER\_CONNECTION\_ERROR 并附带错误信息。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.2 判断与机器人的连接是否有效 [​](#4-1-2) | 方法名 | **is\_connected**() -> bool | | ---------- | ------------------------------------------------- | | 描述 | 判断与机器人的连接是否有效 | | 请求参数 | 无参数 | | 返回值 | bool: 连接状态,True: 连接有效,False: 连接失效 | | 备注 | 旧版 is\_connect() 已标记为废弃,等价功能请使用 is\_connected() 。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.3 与机器人断开连接 [​](#4-1-3) | 方法名 | **disconnect**() | | ---------- | ---------------------------------------------- | | 描述 | 断开与捷勃特机器人的连接 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/connect\_disconnect.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的基础通讯连接断开示例 / Example of a basic communication connection """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 检查连接状态 # [EN] Check connection status connect_status = arm.is_connected() # [ZH] 打印结果 # [EN] Print the result print(f"当前连接状态 / Current connection status: {connect_status}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.4 获取当前机器人型号 [​](#4-1-4) | 方法名 | **get\_arm\_model\_info**() -> tuple\[str, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------ | | 描述 | 获取当前机器人型号信息 | | 请求参数 | 无参数 | | 返回值 | str: 机器人型号如 "GBT-C5A" [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_arm\_model\_info.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的型号获取示例 / Example of model info acquisition """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取型号 # [EN] Get the robot model model_info, ret = arm.get_arm_model_info() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取型号成功 / Get robot model successfully") print(f"机器人型号 / Robot model: {model_info}") else: print(f"获取型号失败,错误代码 / Get robot model failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() ``` ## 4.1.5 获取机器人运行状态 [​](#4-1-5) | 方法名 | **get\_robot\_status**() -> tuple\[RobotStatusEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人运行状态 | | 请求参数 | 无参数 | | 返回值 | [RobotStatusEnum](./../3-struct/#3-2): 机器人运行状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_robot\_status.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的机器人状态获取示例 / Example of obtaining robot status """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取机器人运行状态 # [EN] Get the robot running status state, ret = arm.get_robot_status() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取机器人运行状态成功 / Get robot running status successful") print(f"机器人运行状态 / Robot running status: {state.msg}") else: print(f"获取机器人运行状态失败,错误代码 / Get robot running status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.6 获取当前控制器运行状态 [​](#4-1-6) | 方法名 | **get\_ctrl\_status**() -> tuple\[CtrlStatusEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------ | | 描述 | 获取捷勃特机器人控制器当前运行状态 | | 请求参数 | 无参数 | | 返回值 | [CtrlStatusEnum](./../3-struct/#3-3): 控制器运行状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_ctrl\_status.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的获取运动控制器运行状态示例 / Example of the operating status of the controller """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取运动控制器运行状态 # [EN] Get the controller running status state, ret = arm.get_ctrl_status() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取运动控制器运行状态成功 / Get controller running status successful") print(f"运动控制器运行状态 / Controller running status: {state.msg}") else: print(f"获取运动控制器运行状态失败,错误代码 / Get controller running status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.7 获取当前伺服控制器状态 [​](#4-1-7) | 方法名 | **get\_servo\_status**() -> tuple\[ServoStatusEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人伺服控制器当前状态 | | 请求参数 | 无参数 | | 返回值 | [ServoStatusEnum](./../3-struct/#3-4): 伺服控制器状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_servo\_status.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的伺服状态获取示例 / Example of obtaining servo status """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取伺服控制器状态 # [EN] Get the servo controller status state, ret = arm.get_servo_status() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取伺服控制器状态成功 / Get servo controller status successful") print(f"伺服控制器状态 / Servo controller status: {state.msg}") else: print(f"获取伺服控制器状态失败,错误代码 / Get servo controller status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.8 获取机器人当前的软状态 [​](#4-1-8) | 方法名 | **get\_soft\_mode**() -> tuple\[SoftModeEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------ | | 描述 | 获取捷勃特机器人当前的软状态(PC 模式下的手 / 自动状态) | | 请求参数 | 无参数 | | 返回值 | [SoftModeEnum](./../3-struct/#3-5): 软状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.9 设置机器人当前的软状态 [​](#4-1-9) | 方法名 | **set\_soft\_mode**( soft\_mode : SoftModeEnum) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------- | | 描述 | 设置机器人当前的软状态(PC 模式下的手 / 自动状态) | | 请求参数 | soft\_mode : [SoftModeEnum](./../3-struct/#3-5) 软状态值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/soft\_mode.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的机器人软状态获取示例 / Example of obtaining the soft state of a robot """ from Agilebot import Arm, SoftModeEnum, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置机器人当前的软状态为手动限速模式 # [EN] Set the robot's current soft state to manual limit mode ret = arm.set_soft_mode(SoftModeEnum.MANUAL_LIMIT) # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print( "设置机器人当前的软状态为手动限速模式成功 / Set the robot's current soft state to manual limit mode successfully" ) else: print( f"设置机器人当前的软状态为手动限速模式失败,错误代码 / Set the robot's current soft state to manual limit mode failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 获取机器人当前的软状态 # [EN] Get the robot's current soft state state, ret = arm.get_soft_mode() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取机器人当前的软状态成功 / Get the robot's current soft state successfully") print(f"机器人当前的软状态 / Robot current soft state: {state.name}") else: print(f"获取机器人当前的软状态失败,错误代码 / Get the robot's current soft state failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.10 获取机器人操作模式 [​](#4-1-10) | 方法名 | **get\_op\_mode**() -> tuple\[SoftModeEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人操作模式(如机器人 / 虚拟控制器的手动、自动等操作权限状态)。 | | 请求参数 | 无参数 | | 返回值 | [SoftModeEnum](./../3-struct/#3-5): 操作模式 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 当控制器未返回有效模式时将回退为 SoftModeEnum.UNKNOWN 。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.11 设置机器人操作模式 [​](#4-1-11) | 方法名 | **set\_op\_mode**( soft\_mode : SoftModeEnum) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------- | | 描述 | 设置机器人操作模式,仅支持虚拟机器人 / 仿真控制器。 | | 请求参数 | soft\_mode : [SoftModeEnum](./../3-struct/#3-5) 目标操作模式 (不能为 UNKNOWN )。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 如果传入 SoftModeEnum.UNKNOWN ,接口将返回 UNSUPPORTED\_PARAMETER 。 | | 兼容的机器人软件版本 | 协作 (Copper): 仅仿真;工业 (Bronze): 仅仿真 | ## 4.1.12 上位机获取操作权限 [​](#4-1-12) | 方法名 | **acquire\_access**() | | ---------- | --------------------------------------------------------------------- | | 描述 | 上位机获取操作权限,使机器人进入[ PC 模式](./../2-glossary/#2)。内部会启动心跳线程,每 2 秒向控制器发送保活。 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | 仅工业机器人需要调用此接口保持 PC 模式,协作机器人及 P7A 无需使用。 | | 兼容的机器人软件版本 | 协作 (Copper): 不支持 工业 (Bronze): v7.5.0.0+ | ## 4.1.13 上位机返还操作权限 [​](#4-1-13) | 方法名 | **release\_access**() | | ---------- | --------------------------------------------------------------------------- | | 描述 | 上位机返还操作权限,使机器人退出[ PC 模式](./../2-glossary/#2),并停止 acquire\_access() 启动的心跳线程。 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | 仅工业机器人需要调用此接口。 | | 兼容的机器人软件版本 | 协作 (Copper): 不支持 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/access\_operate.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的操作权限获取示例 / Example of obtaining operation permissions """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取权限 # [EN] Acquire access arm.acquire_access() # [ZH] 返还权限 # [EN] Release access arm.release_access() # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.14 获取机器人控制器版本 [​](#4-1-14) | 方法名 | **get\_controller\_version**() -> tuple\[str, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------- | | 描述 | 获取捷勃特机器人控制器当前版本 | | 请求参数 | 无参数 | | 返回值 | str: 控制器版本 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 控制器版本低于推荐版本时,SDK 会在连接流程中输出升级建议。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_version.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的运动控制器版本获取示例 / Example of obtaining the controller version """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取运动控制器版本 # [EN] Get the controller version version_info, ret = arm.get_controller_version() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取运动控制器版本成功 / Get controller version successful") print(f"运动控制器版本 / Controller version: {version_info}") else: print(f"获取运动控制器版本失败,错误代码 / Get controller version failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.15 设置机器人 LED 指示灯 [​](#4-1-15) | 方法名 | **switch\_led\_light**( mode : bool) -> StatusCodeEnum | | ---------- | ------------------------------------------------------ | | 描述 | 控制捷勃特机器人的 LED 指示灯开关 | | 请求参数 | mode : bool 指示灯状态 (True 打开,False 关闭) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.1.3+ 工业 (Bronze): 不支持 | 示例代码 arm/switch\_led\_light.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的机器人灯环状态获取示例 / Example of obtaining the status of the LED """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 控制LED灯光关闭 # [EN] Control LED light off ret = arm.switch_led_light(mode=False) # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("LED灯光关闭成功 / Control LED light off successfully") else: print(f"LED灯光关闭失败,错误代码 / Control LED light off failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 控制LED灯光开启 # [EN] Control LED light on ret = arm.switch_led_light(mode=True) # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("LED灯光开启成功 / Control LED light on successfully") else: print(f"LED灯光开启失败,错误代码 / Control LED light on failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.16 机器人伺服上电 [​](#4-1-16) | 方法名 | **servo\_on**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 使捷勃特机器人伺服上电 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.17 机器人伺服下电 [​](#4-1-17) | 方法名 | **servo\_off**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 使捷勃特机器人伺服下电 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.18 机器人伺服重置 [​](#4-1-18) | 方法名 | **servo\_reset**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 使捷勃特机器人伺服重置 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/servo\_operate.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的控制伺服操作示例 / Eexample of control servo operation example """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 机器人伺服重置 # [EN] Robot servo reset ret = arm.servo_reset() if ret == StatusCodeEnum.OK: print("伺服重置成功 / Servo reset successfully") else: print(f"伺服重置失败,错误代码 / Servo reset failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 机器人伺服下电 # [EN] Robot servo power off ret = arm.servo_off() if ret == StatusCodeEnum.OK: print("伺服下电成功 / Servo power off successfully") else: print(f"伺服下电失败,错误代码 / Servo power off failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 机器人伺服上电 # [EN] Robot servo power on ret = arm.servo_on() if ret == StatusCodeEnum.OK: print("伺服上电成功 / Servo power on successfully") else: print(f"伺服上电失败,错误代码 / Servo power on failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.19 机器人紧急停止 [​](#4-1-19) | 方法名 | **estop**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 使捷勃特机器人紧急停止 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/estop.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的紧急停止示例 / Example of emergency stop """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 机器人紧急停止 # [EN] Robot emergency stop ret = arm.estop() if ret == StatusCodeEnum.OK: print("机器人紧急停止成功 / Robot emergency stop successfully") else: print(f"机器人紧急停止失败,错误代码 / Robot emergency stop failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.2-motion.html title: 4.2 机器人运动控制和状态 --- # 4.2 机器人运动控制和状态 [​](#4-2) ## 概述 [​](#概述) Motion 类是捷勃特机器人运动控制的核心对象,负责封装以下核心功能: * 速度 / 加速度参数管理 * 坐标系管理 * 点位转换 * 轨迹运动控制 * 拖动示教 * 实时控制 * 负载管理 ### 常见使用流程 [​](#常见使用流程) 在 `Arm` 完成连接后,通过 `arm.motion` 获取 Motion 实例,无需单独初始化。 ## 4.2.1 获取机器人参数 [​](#4-2-1) ### 4.2.1.1 获取 OVC 全局速度比率 [​](#4-2-1-1) | 方法名 | **motion.get\_OVC**() -> tuple\[float, StatusCodeEnum\] | | ---- | ------------------------------------------------------------------ | | 描述 | 获取当前机器人 OVC 全局速度比率,比率范围为 0\~1 | | 请求参数 | 无 | | 返回值 | float:速度比率,结果范围为 0\~1 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.2 获取 OAC 全局加速度比率 [​](#4-2-1-2) | 方法名 | **motion.get\_OAC**() -> tuple\[float, StatusCodeEnum\] | | ---- | --------------------------------------------------------------------- | | 描述 | 获取当前机器人 OAC 全局加速度比率,比率范围为 0\~1.2 | | 请求参数 | 无 | | 返回值 | float:加速度比率,结果范围为 0\~1.2 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.3 获取当前使用的 TF 工具坐标系编号 [​](#4-2-1-3) | 方法名 | **motion.get\_TF**() -> tuple\[int, StatusCodeEnum\] | | ---- | --------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TF 工具坐标系编号,序号范围为 0\~50 | | 请求参数 | 无 | | 返回值 | int: 工具坐标系编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.4 获取当前使用的 UF 用户坐标系编号 [​](#4-2-1-4) | 方法名 | **motion.get\_UF**() -> tuple\[int, StatusCodeEnum\] | | ---- | --------------------------------------------------------- | | 描述 | 获取当前机器人使用的 UF 用户坐标系编号,序号范围为 0\~50 | | 请求参数 | 无 | | 返回值 | int: 用户坐标系编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.5 获取当前使用的 TCS 示教坐标系 [​](#4-2-1-5) | 方法名 | **motion.get\_TCS**() -> tuple\[TCSType, StatusCodeEnum\] | | ---- | ----------------------------------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TCS 示教坐标系,具体参见[ TCSType](./../3-struct/#3-7) | | 请求参数 | 无 | | 返回值 | [TCSType](./../3-struct/#3-7): 示教坐标系类型 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_param.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 全局参数获取示例 / Example of system parameter acquisition """ from Agilebot import Arm, StatusCodeEnum, TCSType # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取机器人各参数并打印 # [EN] Get robot parameters and print res, ret = arm.motion.get_OVC() if ret == StatusCodeEnum.OK: print("获取全局速度比率成功 / Get global velocity ratio successful") else: print(f"获取全局速度比率失败,错误代码 / Get global velocity ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"全局速度比率 / Global velocity ratio: {res}") res, ret = arm.motion.get_OAC() if ret == StatusCodeEnum.OK: print("获取全局加速度比率成功 / Get global acceleration ratio successful") else: print(f"获取全局加速度比率失败,错误代码 / Get global acceleration ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"全局加速度比率 / Global acceleration ratio: {res}") res, ret = arm.motion.get_TCS() if ret == StatusCodeEnum.OK: print("获取示教坐标系类型成功 / Get teaching coordinate system type successful") else: print(f"获取示教坐标系类型失败,错误代码 / Get teaching coordinate system type failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"示教坐标系类型 / Teaching coordinate system type: {TCSType(res).name}") res, ret = arm.motion.get_UF() if ret == StatusCodeEnum.OK: print("获取用户坐标系成功 / Get user coordinate system successful") else: print(f"获取用户坐标系失败,错误代码 / Get user coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"用户坐标系 / User coordinate system: {res}") res, ret = arm.motion.get_TF() if ret == StatusCodeEnum.OK: print("获取工具坐标系成功 / Get tool coordinate system successful") else: print(f"获取工具坐标系失败,错误代码 / Get tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"工具坐标系 / Tool coordinate system: {res}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.2 设置机器人参数 [​](#4-2-2) ### 4.2.2.1 设置 OVC 全局速度比率 [​](#4-2-2-1) | 方法名 | **motion.set\_OVC**( value : float) -> StatusCodeEnum | | ---- | ----------------------------------------------------- | | 描述 | 设置机器人的 OVC 全局速度比率 | | 请求参数 | value : float 速度比率 (范围 0\~1,且大于 0) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.2 设置 OAC 全局加速度比率 [​](#4-2-2-2) | 方法名 | **motion.set\_OAC**( value : float) -> StatusCodeEnum | | ---- | ----------------------------------------------------- | | 描述 | 设置机器人的 OAC 全局加速度比率 | | 请求参数 | value : float 加速度比率 (范围 0.01\~1.2) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.3 设置当前使用的 TF 工具坐标系 [​](#4-2-2-3) | 方法名 | **motion.set\_TF**( value : int) -> StatusCodeEnum | | ---- | -------------------------------------------------- | | 描述 | 设置机器人当前使用的 TF 工具坐标系 | | 请求参数 | value : int 工具坐标系编号 (范围 0\~50) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.4 设置当前使用的 UF 用户坐标系 [​](#4-2-2-4) | 方法名 | **motion.set\_UF**( value : int) -> StatusCodeEnum | | ---- | -------------------------------------------------- | | 描述 | 设置机器人当前使用的 UF 用户坐标系 | | 请求参数 | value : int 用户坐标系编号 (范围 0\~50) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.5 设置当前使用的 TCS 示教坐标系 [​](#4-2-2-5) | 方法名 | **motion.set\_TCS**( value : TCSType) -> StatusCodeEnum | | ---- | ------------------------------------------------------- | | 描述 | 设置机器人当前使用的 TCS 示教坐标系,具体参见[ TCSType](./../3-struct/#3-7) | | 请求参数 | value : [TCSType](./../3-struct/#3-7) TCS 示教坐标系类型 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/set\_param.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 全局参数设置示例 / Example of system parameter setting """ from Agilebot import Arm, StatusCodeEnum, TCSType # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置机器人各参数 # [EN] Set robot parameters ret = arm.motion.set_OVC(0.7) if ret == StatusCodeEnum.OK: print("设置全局速度比率成功 / Set global velocity ratio successful") else: print(f"设置全局速度比率失败,错误代码 / Set global velocity ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_OAC(0.7) if ret == StatusCodeEnum.OK: print("设置全局加速度比率成功 / Set global acceleration ratio successful") else: print(f"设置全局加速度比率失败,错误代码 / Set global acceleration ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_TCS(TCSType.TOOL) if ret == StatusCodeEnum.OK: print("设置示教坐标系类型成功 / Set teaching coordinate system type successful") else: print(f"设置示教坐标系类型失败,错误代码 / Set teaching coordinate system type failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_UF(0) if ret == StatusCodeEnum.OK: print("设置用户坐标系成功 / Set user coordinate system successful") else: print(f"设置用户坐标系失败,错误代码 / Set user coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_TF(0) if ret == StatusCodeEnum.OK: print("设置工具坐标系成功 / Set tool coordinate system successful") else: print(f"设置工具坐标系失败,错误代码 / Set tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.3 将笛卡尔点位转换成关节值点位 [​](#4-2-3) | 方法名 | **motion.convert\_cart\_to\_joint**( pose : MotionPose, uf\_index : int = 0, tf\_index : int = 0) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将位姿数据从笛卡尔点位转换成关节值点位表达 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 机器人的笛卡尔位姿 (PoseType.CART;未指定 posture 时 SDK 自动求解可行姿态) uf\_index : int 用户坐标系 id (默认 0) tf\_index : int 工具坐标系 id (默认 0) | | 返回值 | [MotionPose](./../3-struct/#3-12): 机器人点位 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.4 将关节值点位转换成笛卡尔点位 [​](#4-2-4) | 方法名 | **motion.convert\_joint\_to\_cart**( pose : MotionPose, uf\_index : int = 0, tf\_index : int = 0) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将关节值点位转换成笛卡尔点位 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 机器人的关节位姿 uf\_index : int 用户坐标系 id (默认 0) tf\_index : int 工具坐标系 id (默认 0) | | 返回值 | [MotionPose](./../3-struct/#3-12): 机器人点位 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/convert\_pose.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 转换关节值坐标使用示例 / Example of converting joint coordinates """ from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.CART motion_pose.cartData.position.x = 221.5 motion_pose.cartData.position.y = -494.1 motion_pose.cartData.position.z = 752.0 motion_pose.cartData.position.a = -89.1 motion_pose.cartData.position.b = 31.6 motion_pose.cartData.position.c = -149.3 # [ZH] 转换关节值坐标 # [EN] Convert to joint coordinates joint_pose, ret = arm.motion.convert_cart_to_joint(motion_pose) if ret == StatusCodeEnum.OK: print("转换关节值坐标成功 / Convert to joint coordinates successful") else: print(f"转换关节值坐标失败,错误代码 / Convert to joint coordinates failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {joint_pose.pt}") print( f"轴位置 / Axis position: \n" f"J1:{joint_pose.joint.j1}\n" f"J2:{joint_pose.joint.j2}\n" f"J3:{joint_pose.joint.j3}\n" f"J4:{joint_pose.joint.j4}\n" f"J5:{joint_pose.joint.j5}\n" f"J6:{joint_pose.joint.j6}" ) # [ZH] 转换笛卡尔坐标 # [EN] Convert to Cartesian coordinates cart_pose, ret = arm.motion.convert_joint_to_cart(joint_pose) if ret == StatusCodeEnum.OK: print("转换笛卡尔坐标成功 / Convert to Cartesian coordinates successful") else: print(f"转换笛卡尔坐标失败,错误代码 / Convert to Cartesian coordinates failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {cart_pose.pt}") print( f"笛卡尔位置 / Cartesian position: \n" f"X:{cart_pose.cartData.position.x}\n" f"Y:{cart_pose.cartData.position.y}\n" f"Z:{cart_pose.cartData.position.z}\n" f"A:{cart_pose.cartData.position.a}\n" f"B:{cart_pose.cartData.position.b}\n" f"C:{cart_pose.cartData.position.c}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.5 关节空间运动 [​](#4-2-5) | 方法名 | **motion.move\_joint**( pose : MotionPose, vel : float = 1, acc : float = 1) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人末端沿关节空间最快路径移动到指定位置 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 笛卡尔空间或关节坐标系点位 vel : float 速度比率 (范围 0\~1) acc : float 加速度比率 (范围 0\~1.2) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/move\_joint.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 关节运动使用示例 / Example of joint movement usage """ from Agilebot import Arm, MotionPose, PoseType, Posture, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.CART motion_pose.cartData.position.x = 121.3 motion_pose.cartData.position.y = 416.386 motion_pose.cartData.position.z = 74.104 motion_pose.cartData.position.a = -180 motion_pose.cartData.position.b = 0 motion_pose.cartData.position.c = 0 motion_pose.cartData.posture = Posture() motion_pose.cartData.posture.arm_back_front = -1 motion_pose.cartData.posture.arm_left_right = -1 motion_pose.cartData.posture.arm_up_down = -1 motion_pose.cartData.posture.wrist_flip = -1 # [ZH] 发送运动请求 # [EN] Send motion request ret = arm.motion.move_joint(motion_pose, vel=1, acc=1) if ret == StatusCodeEnum.OK: print("运动指令下发成功 / Joint motion command issued successfully") else: print(f"运动指令下发失败,错误代码 / Joint motion command issued failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.6 直线运动 [​](#4-2-6) | 方法名 | **motion.move\_line**( pose : MotionPose, vel : float = 100, acc : float = 1) -> StatusCodeEnum | | ---- | ----------------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人末端沿直线移动到指定位置,运动轨迹为两点之间的直线 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 笛卡尔空间或关节坐标系点位 vel : float 末端速度 (范围 1\~4000 mm/s) acc : float 加速度比率 (范围 0\~1.2) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/move\_line.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 直线运动使用示例 / Example of linear motion usage """ from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.JOINT motion_pose.joint.j1 = 0 motion_pose.joint.j2 = 0 motion_pose.joint.j3 = 60 motion_pose.joint.j4 = 60 motion_pose.joint.j5 = 0 motion_pose.joint.j6 = 0 # [ZH] 发送运动请求 # [EN] Send motion request ret = arm.motion.move_line(motion_pose, vel=100, acc=0.5) if ret == StatusCodeEnum.OK: print("直线运动指令下发成功 / Line motion command issued successfully") else: print(f"直线运动指令下发失败,错误代码 / Line motion command issued failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 结束后断开机器人连接 # [EN] Disconnect from the robot after completion arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.7 圆弧运动 [​](#4-2-7) | 方法名 | **motion.move\_circle**( pose1 : MotionPose, pose2 : MotionPose, vel : float = 100, acc : float = 1.0) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人末端沿圆弧轨迹移动到指定位置,通过途经点和终点确定圆弧 | | 请求参数 | pose1 : [MotionPose](./../3-struct/#3-12) 途经点位姿 pose2 : [MotionPose](./../3-struct/#3-12) 终点位姿 vel : float 末端速度 (范围 1\~4000 mm/s) acc : float 加速度比率 (范围 0\~1.2) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/move\_circle.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 圆弧运动使用示例 / Example of circular arc motion usage """ import time from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.CART motion_pose.cartData.position.x = 377.000 motion_pose.cartData.position.y = 202.820 motion_pose.cartData.position.z = 507.155 motion_pose.cartData.position.c = 0 motion_pose.cartData.position.b = 0 motion_pose.cartData.position.a = 0 # [ZH] 运动到初始点 # [EN] Move to initial position ret = arm.motion.move_joint(motion_pose) if ret == StatusCodeEnum.OK: print("运动到初始点指令下发成功 / Move to initial position command issued successfully") else: print( f"运动到初始点指令下发失败,错误代码 / Move to initial position command issued failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 修改为运动中间点 # [EN] Modify to intermediate motion point motion_pose.cartData.position.x = 488.300 motion_pose.cartData.position.y = 359.120 motion_pose.cartData.position.z = 507.155 # [ZH] 运动终点 # [EN] End position motion_pose2 = MotionPose() motion_pose2.pt = PoseType.CART motion_pose2.cartData.position.x = 629.600 motion_pose2.cartData.position.y = 509.270 motion_pose2.cartData.position.z = 507.155 motion_pose2.cartData.position.c = 0 motion_pose2.cartData.position.b = 0 motion_pose2.cartData.position.a = 0 # [ZH] 等待运动结束 # [EN] Wait for motion to complete time.sleep(10) # [ZH] 开始运动 # [EN] Start motion ret_code = arm.motion.move_circle(motion_pose, motion_pose2, vel=100) if ret_code == StatusCodeEnum.OK: print("圆弧运动指令下发成功 / Circle motion command issued successfully") else: print(f"圆弧运动指令下发失败,错误代码 / Circle motion command issued failed, error code: {ret_code.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.8 获取当前位姿 [​](#4-2-8) | 方法名 | **motion.get\_current\_pose**( pose\_type : PoseType, uf\_index : int = 0, tf\_index : int = 0) -> tuple\[MotionPose, StatusCodeEnum\] | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 获取机器人当前位姿,支持笛卡尔空间或关节坐标系下的位姿信息 | | 请求参数 | pose\_type : [PoseType](./../3-struct/#3-6) 位姿类型 uf\_index : int 用户坐标系 ID (仅 PoseType.CART 生效;默认 0) tf\_index : int 工具坐标系 ID (仅 PoseType.CART 生效;默认 0) | | 返回值 | [MotionPose](./../3-struct/#3-12): 机器人位姿 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_current\_pose.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 当前关节位姿获取示例 / Example of current joint pose acquisition """ from Agilebot import Arm, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前位姿 # [EN] Get current pose motion_pose, ret = arm.motion.get_current_pose(PoseType.JOINT) if ret == StatusCodeEnum.OK: print("获取关节位姿成功 / Get joint pose successful") else: print(f"获取关节位姿失败,错误代码 / Get joint pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {motion_pose.pt}") print( f"轴位置 / Axis position:\n" f"J1:{motion_pose.joint.j1}\n" f"J2:{motion_pose.joint.j2}\n" f"J3:{motion_pose.joint.j3}\n" f"J4:{motion_pose.joint.j4}\n" f"J5:{motion_pose.joint.j5}\n" f"J6:{motion_pose.joint.j6}" ) # [ZH] 获取当前位姿 # [EN] Get current pose motion_pose, ret = arm.motion.get_current_pose(PoseType.CART, 0, 0) if ret == StatusCodeEnum.OK: print("获取笛卡尔位姿成功 / Get Cartesian pose successful") else: print(f"获取笛卡尔位姿失败,错误代码 / Get Cartesian pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {motion_pose.pt}") print( f"坐标位置 / Coordinate position:\n" f"X:{motion_pose.cartData.position.x}\n" f"Y:{motion_pose.cartData.position.y}\n" f"Z:{motion_pose.cartData.position.z}\n" f"A:{motion_pose.cartData.position.a}\n" f"B:{motion_pose.cartData.position.b}\n" f"C:{motion_pose.cartData.position.c}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.9 获取 DH 参数 [​](#4-2-9) | 方法名 | **motion.get\_DH\_param**() -> tuple\[list\[DHparam\], StatusCodeEnum\] | | ---- | ------------------------------------------------------------------------------------------ | | 描述 | 获取机器人的 DH 参数 | | 请求参数 | 无 | | 返回值 | list([DHparam](./../3-struct/#3-13)): DH 参数列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | ## 4.2.10 设置 DH 参数 [​](#4-2-10) | 方法名 | **motion.set\_DH\_param**( dh\_list : list\[DHparam\]) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------ | | 描述 | 设置机器人的 DH 参数 | | 请求参数 | dh\_list : list([DHparam](./../3-struct/#3-13)) DH 参数列表 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/DH\_param.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: DH参数设置使用示例 / Example of DH parameter setting usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取DH参数 # [EN] Get DH parameters res, ret = arm.motion.get_DH_param() if ret == StatusCodeEnum.OK: print("获取DH参数成功 / Get DH parameters successful") else: print(f"获取DH参数失败,错误代码 / Get DH parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置DH参数 # [EN] Set DH parameters ret = arm.motion.set_DH_param(res) if ret == StatusCodeEnum.OK: print("设置DH参数成功 / Set DH parameters successful") else: print(f"设置DH参数失败,错误代码 / Set DH parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result for param in res: print( f"DH参数的ID / DH parameter ID: {param.id}\n" f"杆件长度 / Link length: {param.a}\n" f"杆件扭角 / Link twist angle: {param.alpha}\n" f"关节距离 / Joint distance: {param.d}\n" f"关节转角 / Joint angle: {param.offset}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.11 获取轴锁定状态 [​](#4-2-11) | 方法名 | **motion.get\_drag\_set**() -> tuple\[DragStatus, StatusCodeEnum\] | | ---- | ----------------------------------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人轴锁定状态,轴锁定仅针对示教运动 | | 请求参数 | 无 | | 返回值 | [DragStatus](./../3-struct/#3-27): 轴锁定状态,True 表示该轴为可移动状态,False 表示被锁定 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/get\_drag\_set.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 拖动设置使用示例 / Example of drag Settings usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前轴锁定状态 # [EN] Get current axis lock status drag_status, ret = arm.motion.get_drag_set() if ret == StatusCodeEnum.OK: print("获取拖动设置成功 / Get drag set successful") else: print(f"获取拖动设置失败,错误代码 / Get drag set failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"当前X轴拖动状态 / Current X axis drag status: {drag_status.cart_status.x}\n" f"当前Y轴拖动状态 / Current Y axis drag status: {drag_status.cart_status.y}\n" f"当前Z轴拖动状态 / Current Z axis drag status: {drag_status.cart_status.z}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.12 设定机器人轴锁定状态 [​](#4-2-12) | 方法名 | **motion.set\_drag\_set**( drag\_status : DragStatus) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------- | | 描述 | 设定当前机器人轴锁定状态,轴锁定只针对示教运动 | | 请求参数 | drag\_status :[DragStatus](./../3-struct/#3-27) 各轴锁定状态 (默认全部 True:解锁) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/set\_drag\_set.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 拖动状态设置实例 / Example of dragging status setting """ from Agilebot import Arm, DragStatus, StatusCodeEnum, TCSType # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置示教坐标系 # [EN] Set teaching coordinate system arm.motion.set_TCS(TCSType.BASE) if ret == StatusCodeEnum.OK: print("操作成功 / Operation successful") else: print(f"操作失败,错误代码 / Operation failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置要锁定的轴 # [EN] Set axes to be locked drag_status = DragStatus() drag_status.cart_status.x = False drag_status.cart_status.y = False # [ZH] 设置连续拖动开关 # [EN] Set continuous drag switch drag_status.is_continuous_drag = True # [ZH] 设置轴锁定状态 # [EN] Set axis lock status ret = arm.motion.set_drag_set(drag_status) if ret == StatusCodeEnum.OK: print("设置拖动状态成功 / Set drag status successful") else: print(f"设置拖动状态失败,错误代码 / Set drag status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"当前X轴拖动状态 / Current X axis drag status: {drag_status.cart_status.x}\n" f"当前Y轴拖动状态 / Current Y axis drag status: {drag_status.cart_status.y}\n" f"当前Z轴拖动状态 / Current Z axis drag status: {drag_status.cart_status.z}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.13 设定当前机器人是否启动拖动 [​](#4-2-13) | 方法名 | **motion.enable\_drag**( drag\_state : bool) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------- | | 描述 | 设定当前机器人是否启动拖动 | | 请求参数 | drag\_state :bool 机器人拖动开关 (True 进入拖动状态,False 退出拖动状态) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/enable\_drag.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 拖动示教使用示例 / example of drag teaching usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 进入拖动示教 # [EN] Enter drag teaching mode ret = arm.motion.enable_drag(True) if ret == StatusCodeEnum.OK: print("进入拖动示教成功 / Enter drag teaching successful") else: print(f"进入拖动示教失败,错误代码 / Enter drag teaching failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 退出拖动示教 # [EN] Exit drag teaching mode ret = arm.motion.enable_drag(False) if ret == StatusCodeEnum.OK: print("退出拖动示教成功 / Exit drag teaching successful") else: print(f"退出拖动示教失败,错误代码 / Exit drag teaching failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.14 进入实时位置控制模式 [​](#4-2-14) | 方法名 | **motion.enter\_position\_control**() -> StatusCodeEnum | | ---- | ------------------------------------------------------- | | 描述 | 进入实时位置控制模式,允许对机器人进行精确的位置控制 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 进入实时控制模式后,必须通过 UDP 发送控制指令 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.15 退出实时位置控制模式 [​](#4-2-15) | 方法名 | **motion.exit\_position\_control**() -> StatusCodeEnum | | ---- | ------------------------------------------------------ | | 描述 | 退出实时位置控制模式,恢复默认的机器人控制状态 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 退出后,机器人将不再接受实时控制指令 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | 示例代码 motion/position\_control.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 实时位置控制模式使用示例 / Example of the real-time location control mode usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 进入实时位置控制模式 # [EN] Enter real-time position control mode ret = arm.motion.enter_position_control() if ret == StatusCodeEnum.OK: print("进入实时位置控制模式成功 / Enter real-time position control mode successful") else: print( f"进入实时位置控制模式失败,错误代码 / Enter real-time position control mode failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 在此插入发送UDP数据控制机器人代码 # [EN] Insert UDP data sending code to control robot here # [ZH] 退出实时位置控制模式 # [EN] Exit real-time position control mode ret = arm.motion.exit_position_control() if ret == StatusCodeEnum.OK: print("退出实时位置控制模式成功 / Exit real-time position control mode successful") else: print(f"退出实时位置控制模式失败,错误代码 / Exit real-time position control mode failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.16 设置 UDP 反馈参数 [​](#4-2-16) | 方法名 | **motion.set\_udp\_feedback\_params**( flag : bool, ip : str, interval : int, feedback\_type : int, DO\_list : list\[int\] = None) -> StatusCodeEnum | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 配置机器人向指定 IP 地址推送数据的 UDP 反馈参数 | | 请求参数 | flag :bool 是否开启 UDP 数据推送; ip :str 接收端 IP 地址; interval :int 发送间隔 (毫秒); feedback\_type :int 反馈数据格式 (0: XML,1: JSON,2: PROTO); DO\_list :list \[int\] DO 信号列表 (最多 10 个,可选) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 参数设置仅在 UDP 数据推送功能启用时有效 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | 示例代码 motion/UDP\_pose\_feedback.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: UDP位置反馈示例 / Example of using UDP to receive robot pose feedback """ import json import socket from Agilebot.IR.A.arm import Arm from Agilebot.IR.A.status_code import StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置udp反馈参数 # [EN] Set UDP feedback parameters udp_local_ip = "10.27.1.225" udp_feedback_interval = 4 udp_feedback_type = 1 # 0: xml, 1: json, 2: proto udp_do_list = [] ret = arm.motion.set_udp_feedback_params(True, udp_local_ip, udp_feedback_interval, udp_feedback_type, udp_do_list) if ret == StatusCodeEnum.OK: print("设置UDP反馈参数成功 / Set UDP feedback parameters successful") else: print(f"设置UDP反馈参数失败,错误代码 / Set UDP feedback parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 使用UDP连接机器人并接收反馈数据 # [EN] Use UDP to connect to the robot and receive feedback data udp_feedback_port = 5605 # 按控制器UDP反馈端口配置修改 / Update to match controller UDP feedback port udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_sock.settimeout(2.0) udp_sock.bind((udp_local_ip, udp_feedback_port)) # [ZH] 接收UDP反馈数据示例 # [EN] Example of receiving UDP feedback data for _ in range(50): try: data, addr = udp_sock.recvfrom(2048) except socket.timeout: print("UDP接收超时 / UDP receive timeout") continue if udp_feedback_type == 1: try: payload = json.loads(data.decode("utf-8", errors="ignore")) print(f"UDP反馈 / UDP feedback from {addr}\n") print(f"关节坐标 / AIPos: {payload.get('AIPos')}\n") print(f"笛卡尔坐标 / RIst: {payload.get('RIst')}\n") except json.JSONDecodeError: print(f"UDP反馈解析失败 / Failed to parse UDP feedback: {data}") else: print(f"UDP反馈原始数据 / UDP raw feedback from {addr}: {data}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot udp_sock.close() ret = arm.motion.set_udp_feedback_params(False, udp_local_ip, udp_feedback_interval, udp_feedback_type, udp_do_list) if ret == StatusCodeEnum.OK: print("设置UDP反馈参数成功 / Set UDP feedback parameters successful") else: print(f"设置UDP反馈参数失败,错误代码 / Set UDP feedback parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 推送数据说明 [​](#推送数据说明) | 名称 | 字段 | 描述 | | ------------------------- | ---------------------------------------------------------------------------- | ------------------ | | **RIst: 笛卡尔位置** | X | 工具坐标系下 X 方向值,单位为毫米 | | Y | 工具坐标系下 Y 方向值,单位为毫米 | | | Z | 工具坐标系下 Z 方向值,单位为毫米 | | | A | 工具坐标系下绕 X 方向旋转,单位为度 | | | B | 工具坐标系下绕 Y 方向旋转,单位为度 | | | C | 工具坐标系下绕 Z 方向旋转,单位为度 | | | **AIPos: 关节位置** | A1-A6 | 六个关节的值,单位为角度 | | **EIPos: 附加轴数据** | EIPos | 附加轴数据 | | **WristBtnState: 手腕按键状态** | 按键状态 | 1 = 按键按下,0 = 按键抬起 | | DragModel | 拖拽按键状态 | | | RecordJoint | 示教记录按键状态 | | | PauseResume | 暂停恢复按键状态 | | | **Digout: DO 输出** | Digout | 数字输出(DO)的状态 | | **ProgramStatus: 程序状态** | ProgId | 程序 ID | | Status | 解释器执行状态:0 = INTERPRETER\_IDLE1 = INTERPRETER\_EXECUTE2 = INTERPRETER\_PAUSED | | | Xpath | 程序片段返回值,格式为 程序名:行号 | | | **IPOC: 时间戳** | IPOC | 时间戳 | ## 4.2.17 获取机器人软限位 [​](#4-2-17) | 方法名 | **motion.get\_user\_soft\_limit**() -> tuple\[list\[list\[float\]\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------ | | 描述 | 获取当前机器人软限位信息 | | 请求参数 | 无 | | 返回值 | List (List (float)): 机器人软限位信息,列表第一层代表各轴,第二层代表每个轴的下限位和上限位值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_user\_soft\_limit.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 用户软限位设置获取示例 / Example of obtaining the user's soft limit setting """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前机器人软限位信息 # [EN] Get current robot soft limit information res, ret = arm.motion.get_user_soft_limit() if ret == StatusCodeEnum.OK: print("获取用户软限位成功 / Get user soft limit successful") else: print(f"获取用户软限位失败,错误代码 / Get user soft limit failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"当前机器人软限位信息 / Current robot soft limit information: {res}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.18 负载相关接口 [​](#4-2-18) ### 4.2.18.1 获取当前激活的负载编号 [​](#4-2-18-1) | 方法名 | **motion.payload.get\_current\_payload**() -> tuple\[int, StatusCodeEnum\] | | ---- | -------------------------------------------------------------------------- | | 描述 | 获取当前激活的负载编号,返回对应的 ID 编号 | | 请求参数 | 无 | | 返回值 | int: 负载编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_current\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 获取当前负载示例 / Example of get the current load """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前激活负载 # [EN] Get current active payload current_payload_id, ret = arm.motion.payload.get_current_payload() if ret == StatusCodeEnum.OK: print("获取当前负载成功 / Get current payload successful") else: print(f"获取当前负载失败,错误代码 / Get current payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"当前激活负载ID为 / Current active payload ID: {current_payload_id}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.2 根据 ID 获取负载信息 [​](#4-2-18-2) | 方法名 | **motion.payload.get\_payload\_by\_id**( payload\_id : int) -> tuple\[PayloadInfo, StatusCodeEnum\] | | ---- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取指定 ID 的负载信息 | | 请求参数 | payload\_id : int 负载 ID 编号 | | 返回值 | [PayloadInfo](./../3-struct/#3-14): 负载信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_payload\_by\_id.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 根据ID获取负载参数示例 / Example of obtaining load parameters based on ID """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取负载 # [EN] Get payload res, ret = arm.motion.payload.get_payload_by_id(6) if ret == StatusCodeEnum.OK: print("获取负载成功 / Get payload successful") else: print(f"获取负载失败,错误代码 / Get payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"负载ID / Payload ID: {res.id}\n" f"负载质量 / Payload mass: {res.weight}\n" f"负载注释 / Payload comment: {res.comment}\n" f"负载质心 / Payload mass center: {res.mass_center.x}, {res.mass_center.y}, {res.mass_center.z}\n" f"负载转动惯量 / Payload inertia moment: {res.inertia_moment.lx}, {res.inertia_moment.ly}, {res.inertia_moment.lz}\n" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.3 激活指定负载 [​](#4-2-18-3) | 方法名 | **motion.payload.set\_current\_payload**( payload\_id : int) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------ | | 描述 | 根据 ID 激活指定负载 | | 请求参数 | payload\_id : int 负载 ID 编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/set\_current\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 当前负载设置示例 / Example of the current load settings """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 指定编号激活负载 # [EN] Activate payload by specified ID ret = arm.motion.payload.set_current_payload(1) if ret == StatusCodeEnum.OK: print("设置当前负载成功 / Set current payload successful") else: print(f"设置当前负载失败,错误代码 / Set current payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.4 添加自定义负载 [​](#4-2-18-4) | 方法名 | **motion.payload.add\_payload**( payload\_info : PayloadInfo) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------- | | 描述 | 向机器人控制柜添加用户自定义负载信息 | | 请求参数 | payload\_info : [PayloadInfo](./../3-struct/#3-14) 用户自定义负载信息 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/add\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 添加负载使用示例 / Example of Add load usage """ from Agilebot import Arm, PayloadInfo, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化负载 # [EN] Initialize payload new_payload = PayloadInfo() new_payload.id = 6 new_payload.comment = "Test" new_payload.weight = 5 new_payload.mass_center.x = -151 new_payload.mass_center.y = 1.0 new_payload.mass_center.z = 75 new_payload.inertia_moment.lx = 0.11 new_payload.inertia_moment.ly = 0.61 new_payload.inertia_moment.lz = 0.54 # [ZH] 添加负载 # [EN] Add payload ret = arm.motion.payload.add_payload(new_payload) if ret == StatusCodeEnum.OK: print("添加负载成功 / Add payload successful") else: print(f"添加负载失败,错误代码 / Add payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.5 删除负载 [​](#4-2-18-5) | 方法名 | **motion.payload.delete\_payload**( payload\_id : int) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------ | | 描述 | 从控制器删除指定 ID 的用户自定义负载 | | 请求参数 | payload\_id : int 负载 ID 编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 无法删除当前激活的负载,如需删除激活负载,请先激活其他负载再删除当前负载 | 示例代码 motion/delete\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 删除负载使用示例 / Example of delete the load usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除指定ID负载 # [EN] Delete payload with specified ID ret = arm.motion.payload.delete_payload(6) if ret == StatusCodeEnum.OK: print("删除负载成功 / Delete payload successful") else: print(f"删除负载失败,错误代码 / Delete payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print("删除负载6成功 / Delete payload 6 successful") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.6 更新负载 [​](#4-2-18-6) | 方法名 | **motion.payload.update\_payload**( payload\_info : PayloadInfo) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------- | | 描述 | 更新机器人中已存在的用户自定义负载信息 | | 请求参数 | payload\_info : [PayloadInfo](./../3-struct/#3-14) 包含更新信息的负载对象 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/update\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 更新负载使用示例 / Example of updating the load """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取负载 # [EN] Get payload payload_info, ret_code = arm.motion.payload.get_payload_by_id(6) payload_info.comment = "Test" payload_info.weight = 10 payload_info.mass_center.x = -100 payload_info.mass_center.y = 10 payload_info.mass_center.z = 10 payload_info.inertia_moment.lx = 10 payload_info.inertia_moment.ly = 10 payload_info.inertia_moment.lz = 10 # [ZH] 更新负载 # [EN] Update payload ret = arm.motion.payload.update_payload(payload_info) if ret == StatusCodeEnum.OK: print("更新负载成功 / Update payload successful") else: print(f"更新负载失败,错误代码 / Update payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"负载ID / Payload ID: {payload_info.id}\n" f"负载质量 / Payload mass: {payload_info.weight}\n" f"负载质心 / Payload mass center: {payload_info.mass_center.x}, {payload_info.mass_center.y}, {payload_info.mass_center.z}\n" f"负载转动惯量 / Payload inertia moment: {payload_info.inertia_moment.lx}, {payload_info.inertia_moment.ly}, {payload_info.inertia_moment.lz}\n" f"负载注释 / Payload comment: {payload_info.comment}\n" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.7 获取所有负载 [​](#4-2-18-7) | 方法名 | **motion.payload.get\_all\_payload**() -> tuple\[list, StatusCodeEnum\] | | ---- | ----------------------------------------------------------------------- | | 描述 | 获取所有负载信息列表 | | 请求参数 | 无 | | 返回值 | list : 所有负载信息列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_all\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 所有负载获取示例 / Example of all load acquisition """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to controller ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有负载 # [EN] Get all payloads res, ret = arm.motion.payload.get_all_payload() if ret == StatusCodeEnum.OK: print("获取所有负载成功 / Get all payloads successful") else: print(f"获取所有负载失败,错误代码 / Get all payloads failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result for payload in res: print(f"负载ID / Payload ID: {payload[0]}\n负载注释 / Payload comment: {payload[1]}\n") # [ZH] 结束后断开机器人连接 # [EN] Disconnect from robot after completion arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.8 检测 3 轴水平度 [​](#4-2-18-8) | 方法名 | **motion.payload.check\_axis\_three\_horizontal**() -> tuple\[float, StatusCodeEnum\] | | ---- | ------------------------------------------------------------------------------------- | | 描述 | 检测机器人 3 轴是否水平 | | 请求参数 | 无 | | 返回值 | float: 返回 3 轴的水平角度,单位为度 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 水平角度必须在 - 1\~1 度之间才能进行负载测定 | ### 4.2.18.9 获取负载测定状态 [​](#4-2-18-9) | 方法名 | **motion.payload.get\_payload\_identify\_state**() -> tuple\[PayloadIdentifyState, StatusCodeEnum\] | | ---- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取负载测定的状态 | | 请求参数 | 无 | | 返回值 | [PayloadIdentifyState](./../3-struct/#3-31): 负载测定状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.10 开始负载测定 [​](#4-2-18-10) | 方法名 | **motion.payload.start\_payload\_identify**( weight : float, angle : float) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------- | | 描述 | 开始负载测定过程 | | 请求参数 | weight :float 负载重量 (未知填 -1); angle :float 6 轴允许转动角度 (30\~90 度) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 开始负载测定前必须先进入负载测定状态 | ### 4.2.18.11 获取负载测定结果 [​](#4-2-18-11) | 方法名 | **motion.payload.payload\_identify\_result**() -> tuple\[PayloadInfo, StatusCodeEnum\] | | ---- | --------------------------------------------------------------------------------------- | | 描述 | 获取负载测定结果 | | 请求参数 | 无 | | 返回值 | [PayloadInfo](./../3-struct/#3-14): 负载测定结果 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.12 开始干涉检查 [​](#4-2-18-12) | 方法名 | **motion.payload.interference\_check\_for\_payload\_identify**( weight : float, angle : float) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------------------------------------- | | 描述 | 开始负载测定的干涉检查 | | 请求参数 | weight : float 负载重量; angle : float 6 轴转动角度 (30\~90 度) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.13 进入负载测定状态 [​](#4-2-18-13) | 方法名 | **motion.payload.payload\_identify\_start**() -> StatusCodeEnum | | ---- | --------------------------------------------------------------- | | 描述 | 进入负载测定准备状态 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.14 结束负载测定状态 [​](#4-2-18-14) | 方法名 | **motion.payload.payload\_identify\_done**() -> StatusCodeEnum | | ---- | -------------------------------------------------------------- | | 描述 | 结束负载测定准备状态 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.15 负载测定全流程 [​](#4-2-18-15) | 方法名 | **motion.payload.payload\_identify**( weight : float, angle : float) -> tuple\[PayloadInfo, StatusCodeEnum\] | | ---- | ------------------------------------------------------------------------------------------------------------ | | 描述 | 完整的负载测定流程,包含负载测定全部步骤,无特殊需求时仅使用此接口即可 | | 请求参数 | weight : float 负载重量 (未知填 -1); angle : float 6 轴转动角度 (30\~90 度) | | 返回值 | [PayloadInfo](./../3-struct/#3-14): 负载测定结果 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 返回的负载可新增到机器人中或写入机器人中已有的某个负载 全流程步骤: 1\. 移动到指定水平位并检测是否水平 2\. 进入负载测定状态 3\. 开始负载测定 4\. 获取负载测定结果 5\. 结束负载测定状态 | 示例代码 motion/payload\_identify.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 负载识别使用示例 / Example of load identification usage """ import time from Agilebot import Arm, MotionPose, PoseType, ServoStatusEnum, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) motion_pose = MotionPose() motion_pose.pt = PoseType.JOINT motion_pose.joint.j1 = 0 motion_pose.joint.j2 = 0 motion_pose.joint.j3 = 0 motion_pose.joint.j4 = 0 motion_pose.joint.j5 = 0 motion_pose.joint.j6 = 0 # [ZH] 运动到指定点 # [EN] Move to specified position code = arm.motion.move_joint(motion_pose) if ret == StatusCodeEnum.OK: print("运动到指定点成功 / Move to specified position successful") else: print(f"运动到指定点失败,错误代码 / Move to specified position failed, error code: {ret.errmsg}") arm.disconnect() exit(1) while True: # [ZH] 获取伺服状态 # [EN] Get servo status state, ret = arm.get_servo_status() if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) if state == ServoStatusEnum.SERVO_IDLE: break else: time.sleep(1) # [ZH] 开始负载测定并获取结果 # [EN] Start payload identification and get result res, ret = arm.motion.payload.payload_identify(-1, 90) if ret == StatusCodeEnum.OK: print("负载识别成功 / Payload identification successful") else: print(f"负载识别失败,错误代码 / Payload identification failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.3-execution.html title: 4.3 机器人程序操作类 --- # 4.3 机器人程序操作类 [​](#4-3) ## 概述 [​](#概述) Execution 类提供机器人程序与运动任务的统一调度接口,负责以下核心功能: * 启动 / 停止 / 暂停 / 恢复示教程序 * 管理并发运行的任务列表 * 执行 BAS 脚本等自定义流程 结合 `Arm` 与 `Motion` 的连接和运动能力,Execution 负责在上位机侧触发和管控控制器中的程序流程。 ## 4.3.1 执行指定程序 [​](#4-3-1) | 方法名 | **execution.start**( program\_name : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------- | | 描述 | 执行指定程序 | | 请求参数 | program\_name : str 需要执行的程序名称 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.2 停止正在执行的程序 [​](#4-3-2) | 方法名 | **execution.stop**( program\_name : str = '') -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 停止正在执行的程序或停止机器人当前执行的运动 | | 请求参数 | program\_name : str 需要停止的程序名称 (默认为空字符串,表示停止当前运行的程序或运动指令) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.3 返回所有正在运行的程序详细信息 [​](#4-3-3) | 方法名 | **execution.all\_running\_programs**() -> tuple\[list, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 返回所有正在运行的程序详细信息,包含线程 ID、程序名、xpath、程序状态以及程序类型 | | 请求参数 | 无参数 | | 返回值 | list: 运行的程序详细信息列表,列表中的每个元素包含 thread\_id 、 program\_name 、 xpath 、 program\_status 、 program\_type 等字段 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.4 暂停程序运行 [​](#4-3-4) | 方法名 | **execution.pause**( program\_name : str = '') -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------- | | 描述 | 暂停当前执行的程序或暂停机器人当前执行的运动 | | 请求参数 | program\_name : str 需要暂停的程序名称 (默认为空字符串,表示暂停当前运行的程序或运动指令) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.5 恢复程序运行 [​](#4-3-5) | 方法名 | **execution.resume**( program\_name : str = '') -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------- | | 描述 | 继续运行处于暂停状态的程序 | | 请求参数 | program\_name : str 需要继续运行的程序名称 (默认为空字符串,表示继续运行当前处于暂停状态的程序或运动指令) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 execution/program\_execution.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 自定义程序使用示例 / Example of custom program usage """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connection successful") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) program_name = "test" # [ZH] 执行程序 # [EN] Execute program ret = arm.execution.start(program_name) if ret == StatusCodeEnum.OK: print("程序启动成功 / Program start successful") else: print(f"程序启动失败,错误代码 / Program start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有正在运行的程序 # [EN] Get all running programs programs_list, ret = arm.execution.all_running_programs() if ret == StatusCodeEnum.OK: print("获取运行程序列表成功 / Get running programs list successful") else: print(f"获取运行程序列表失败,错误代码 / Get running programs list failed, error code: {ret.errmsg}") arm.disconnect() exit(1) for program in programs_list: print(f"正在运行的程序名:{program}") time.sleep(2) # [ZH] 暂停程序 # [EN] Pause program ret = arm.execution.pause(program_name) if ret == StatusCodeEnum.OK: print("程序暂停成功 / Program pause successful") else: print(f"程序暂停失败,错误代码 / Program pause failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(2) # [ZH] 恢复程序 # [EN] Resume program ret = arm.execution.resume(program_name) if ret == StatusCodeEnum.OK: print("程序恢复成功 / Program resume successful") else: print(f"程序恢复失败,错误代码 / Program resume failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(2) # [ZH] 停止程序 # [EN] Stop program ret = arm.execution.stop(program_name) if ret == StatusCodeEnum.OK: print("程序停止成功 / Program stop successful") else: print(f"程序停止失败,错误代码 / Program stop failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.3.6 执行 BAS 脚本程序 [​](#4-3-6) | 方法名 | **execution.execute\_bas\_script**( bas\_script : BasScript \| list\[str\]) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 执行用户自定义的 BAS 脚本程序 | | 请求参数 | bas\_script : [BasScript](./4.12-bas%5Fscript.html#4-12) 或 list \[str\] 用户自定义的 BAS 脚本程序 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | BAS 脚本程序的暂停、恢复、停止方法同普通程序 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): v7.6.0.0+ | execution/bas\_script\_execution.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Bas脚本创建和使用示例 / Example of Bas script creation and usage """ from Agilebot import * # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 创建BasScript对象 # [EN] Create BasScript object bs = BasScript(name="bas_test") ret = bs.assign_value(AssignType.R, 1, OtherType.VALUE, 10) ret = bs.move_joint( pose_type=MovePoseType.PR, pose_index=1, speed_type=SpeedType.VALUE, speed_value=100, smooth_type=SmoothType.SMOOTH_DISTANCE, smooth_distance=200.5, ) ret = bs.wait_time(ValueType.VALUE, 10) if ret == StatusCodeEnum.OK: print("创建BasScript对象成功 / Create BasScript object successfully") else: print(f"创建BasScript对象失败,错误代码 / Create BasScript object failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 执行脚本 # [EN] Execute script ret = arm.execution.execute_bas_script(bs) if ret == StatusCodeEnum.OK: print("执行脚本成功 / Execute script successfully") else: print(f"执行脚本失败,错误代码 / Execute script failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 结束后断开机器人连接 # [EN] Disconnect from the robot after completion arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.4-program_pose.html title: 4.4 程序位姿读写 --- # 4.4 程序位姿读写 [​](#4-4) ## 概述 [​](#概述) ProgramPose 相关接口用于读取、写入和转换机器人示教程序中的位姿点。通过 `program_pose` 模块可以: * 定位到指定程序与点位序号 * 执行增删改查操作 * 在笛卡尔 / 关节表示之间进行转换 便于在上位机场景下批量维护程序点位或进行离线编辑。 ## 4.4.1 获取指定程序中指定位姿点值 [​](#4-4-1) | 方法名 | **program\_pose.read**( program\_name : str, index : int, program\_type : str = USER\_PROGRAM) -> tuple\[ProgramPose, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取指定程序中指定序号的位姿点值 | | 请求参数 | program\_name : str 指定程序名 index : int 位姿点序号 program\_type : str 程序类型 (默认 USER\_PROGRAM) | | 返回值 | [ProgramPose](./../3-struct/#3-17): 位姿信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.2 修改指定程序中指定位姿点值 [​](#4-4-2) | 方法名 | **program\_pose.write**( program\_name : str, index : int, value : ProgramPose, program\_type : str = USER\_PROGRAM) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 修改指定程序中指定序号的位姿点值 | | 请求参数 | program\_name : str 指定程序名 index : int 位姿点序号 value : [ProgramPose](./../3-struct/#3-17) 需更新的位姿点值 program\_type : str 程序类型 (默认 USER\_PROGRAM) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.3 获取指定程序中所有位姿点 [​](#4-4-3) | 方法名 | **program\_pose.read\_all\_poses**( program\_name : str, program\_type : str = USER\_PROGRAM) -> tuple\[list\[ProgramPose\], StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取指定程序中所有位姿点信息 | | 请求参数 | program\_name : str 指定程序名 program\_type : str 程序类型 (默认 USER\_PROGRAM) | | 返回值 | list([ProgramPose](./../3-struct/#3-17)): 位姿信息列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.4 向程序中添加指定位姿点 [​](#4-4-4) | 方法名 | **program\_pose.add**( program\_name : str, index : int, value : ProgramPose, program\_type : str = USER\_PROGRAM) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 在指定程序的指定序号处新增位姿点,若序号已存在则返回错误 | | 请求参数 | program\_name : str 指定程序名 index : int 位姿点序号 value : [ProgramPose](./../3-struct/#3-17) 需新增的位姿点值 program\_type : str 程序类型 (默认 USER\_PROGRAM) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.5 写入程序中一个或多个位姿点值 [​](#4-4-5) | 方法名 | **program\_pose.write\_poses**( program\_name : str, poses\_to\_update : list\[ProgramPose\]) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 写入指定程序中一个或多个机器人位姿点值。注意:只能写入已存在的点位,无法新增点位 | | 请求参数 | program\_name : str 指定程序名 poses\_to\_update : list([ProgramPose](./../3-struct/#3-17)) 待更新的点位列表 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.6 机器人程序位姿点类型转换 [​](#4-4-6) | 方法名 | **ProgramPoses.convert\_pose**( pose : ProgramPose, from\_type : PoseType, to\_type : PoseType) -> tuple\[ProgramPose, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将机器人程序位姿点在轴坐标和笛卡尔空间坐标之间转换 | | 请求参数 | pose : [ProgramPose](./../3-struct/#3-17) 要转换的位姿点值 from\_type : [PoseType](./../3-struct/#3-6) 转换前的类型 to\_type : [PoseType](./../3-struct/#3-6) 转换后的目标类型 | | 返回值 | [ProgramPose](./../3-struct/#3-17): 位姿信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 program\_pose.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 机器人位姿使用示例 / Example of robot pose usage """ from Agilebot import Arm, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) program_name = "test_prog" # [ZH] 读取所有位姿 # [EN] Read all poses poses, ret = arm.program_pose.read_all_poses(program_name) if ret == StatusCodeEnum.OK: print("读取所有位姿成功 / Read all poses successfully") # [ZH] 打印位姿信息 # [EN] Print pose information for p in poses: print(f"位姿ID / Pose ID:{p.id}\n位姿名称 / Pose name:{p.name}") else: print(f"读取所有位姿失败,错误代码 / Read all poses failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取单个位姿 # [EN] Read a single pose pose, ret = arm.program_pose.read(program_name, 1) if ret == StatusCodeEnum.OK: print("读取单个位姿成功 / Read single pose successfully") # [ZH] 打印位姿信息 # [EN] Print pose information print( f"位姿ID / Pose ID:{pose.id}\n" f"位姿名称 / Pose name:{pose.name}\n" f"位姿类型 / Pose type:{pose.poseData.pt}\n" f"X:{pose.poseData.cartData.baseCart.position.x}\n" f"Y:{pose.poseData.cartData.baseCart.position.y}\n" f"Z:{pose.poseData.cartData.baseCart.position.z}\n" f"J1:{pose.poseData.joint.j1}\n" f"J2:{pose.poseData.joint.j2}\n" f"J3:{pose.poseData.joint.j3}\n" ) else: print(f"读取单个位姿失败,错误代码 / Read single pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 修改位姿 # [EN] Modify pose pose.comment = "SDK_TEST_COMMENT" ret = arm.program_pose.write(program_name, 1, pose) if ret == StatusCodeEnum.OK: print("修改位姿成功 / Modify pose successfully") else: print(f"修改位姿失败,错误代码 / Modify pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 转换位姿 # [EN] Convert pose converted_pose, ret = arm.program_pose.convert_pose(pose, PoseType.CART, PoseType.JOINT) if ret == StatusCodeEnum.OK: print("转换位姿成功 / Convert pose successfully") else: print(f"转换位姿失败,错误代码 / Convert pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印位姿信息 # [EN] Print pose information print( f"位姿ID / Pose ID:{converted_pose.id}\n" f"位姿名称 / Pose name:{converted_pose.name}\n" f"位姿类型 / Pose type:{converted_pose.poseData.pt}\n" f"X:{converted_pose.poseData.cartData.baseCart.position.x}\n" f"Y:{converted_pose.poseData.cartData.baseCart.position.y}\n" f"Z:{converted_pose.poseData.cartData.baseCart.position.z}\n" f"J1:{converted_pose.poseData.joint.j1}\n" f"J2:{converted_pose.poseData.joint.j2}\n" f"J3:{converted_pose.poseData.joint.j3}\n" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.5-signals.html title: 4.5 IO信号 --- # 4.5 IO 信号 [​](#4-5) ## 概述 [​](#概述) Signals 模块提供控制器 IO 的统一读写接口,封装了以下核心功能: * 数字 / 模拟输入输出控制 * 多路批量操作 * 定时触发能力 通过 `signals` 可以: * 读取当前信号状态 * 批量写入 DO/RO/GO 等端口 * 根据时间间隔触发脉冲 用于与外部夹爪、传感器或生产线设备的联动。 ## 4.5.1 读取指定类型和端口的 IO 值 [​](#4-5-1) | 方法名 | **signals.read**( signal\_type : SignalType, index : int) -> tuple\[float, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取指定类型和端口的 IO 值(支持 DI/DO/UI/UO/RI/RO/GI/GO/TAI/TDI/TDO/AI/AO) | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要读取的 IO 类型 index : int IO 序号 (从 1 开始) | | 返回值 | float: IO 值,DI/DO/RI/RO/TAI/TDI/TDO/AI/AO 返回 0 或 1,GI/GO 返回整型数值(负数表示 Off 状态) [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 只能读不能写 | ## 4.5.2 写入指定类型和端口的 IO 值 [​](#4-5-2) | 方法名 | **signals.write**( signal\_type : SignalType, index : int, value : float) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 写入指定类型和端口的 IO 值,当前仅支持 DO/RO/GO/TDO/AO | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要写入的 IO 类型 index : int IO 序号 (从 1 开始) value : float IO 值 (DO/RO/TDO 仅允许 0 或 1;GO 为整型;AO 为浮点模拟量) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) signals/signals.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 单信号IO读写示例 / Example of single-signal I/O reading and writing """ from Agilebot import Arm, SignalType, SignalValue, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取IO # [EN] Read IO do_value, ret = arm.signals.read(SignalType.DO, 1) if ret == StatusCodeEnum.OK: print("读取IO成功 / Read IO successfully") print(f"DO 1 状态 / DO 1 status:{do_value}") else: print(f"读取IO失败,错误代码 / Read IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 写入IO # [EN] Write IO ret = arm.signals.write(SignalType.DO, 1, SignalValue.ON) if ret == StatusCodeEnum.OK: print("写入IO成功 / Write IO successfully") else: print(f"写入IO失败,错误代码 / Write IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.5.3 批量读取 DO (数字输出) 端口值 [​](#4-5-3) | 方法名 | **signals.multi\_read**( signal\_type : SignalType, io\_list : list) -> tuple\[list, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------- | | 描述 | 批量读取 DO (数字输出) 端口值 | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要读取的 IO 类型 (仅支持 DO) io\_list : list 端口号列表 (不能为空) | | 返回值 | list: 控制器返回的端口值列表,形式为 \[port1, state1, port2, state2, ...\] [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 只能读不能写 | ## 4.5.4 批量写入 DO (数字输出) 信号 [​](#4-5-4) | 方法名 | **signals.multi\_write**( signal\_type : SignalType, io\_list : list) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 批量写入 DO (数字输出) 信号 | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要写入的 IO 类型 (仅支持 DO) io\_list : list 端口号和端口值列表 (例如 \[port1, state1, port2, state2\];长度为偶数且大于 0) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-1) signals/multi\_read\_write.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 多信号IO读写示例 / Example of multi-signal I/O reading and writing """ from Agilebot import Arm, SignalType, SignalValue, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取IO # [EN] Read IO do_value, ret = arm.signals.multi_read(SignalType.DO, [1, 2]) if ret == StatusCodeEnum.OK: print("读取IO成功 / Read IO successfully") print(f"DO 1 状态 / DO 1 status:{do_value}") else: print(f"读取IO失败,错误代码 / Read IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 写入IO # [EN] Write IO ret = arm.signals.multi_write(SignalType.DO, [1, SignalValue.ON, 2, SignalValue.ON]) if ret == StatusCodeEnum.OK: print("写入IO成功 / Write IO successfully") else: print(f"写入IO失败,错误代码 / Write IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.5.5 根据时间间隔触发多路 IO [​](#4-5-5) | 方法名 | **signals.trigger\_io\_with\_intervals**( in\_port : int = -1, intervals : list, out\_ports : list, pulse\_duration : int) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 基于一组时间间隔触发多路输出端口,可选地在检测到某个 DI 输入口上升沿后开始计时 | | 请求参数 | in\_port : int 输入端口号 (默认 -1,表示无需等待输入触发) intervals : list 触发时间间隔列表 (毫秒) out\_ports : list 输出端口号列表 pulse\_duration : int 输出脉冲持续时间 (毫秒) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/1-python/4-methods/4.6-register.html title: 4.6 寄存器信息 --- # 4.6 寄存器信息 [​](#4-6) ## 概述 [​](#概述) Register 模块提供上位机读写控制器寄存器的统一入口,支持多种寄存器类型的操作。 ### 核心功能 [​](#核心功能) * 支持数值寄存器(R)的读写操作 * 支持运动寄存器(MR)的读写操作 * 支持字符串寄存器(SR)的读写操作 * 支持位姿寄存器(PR)的读写操作 * 支持 Modbus 寄存器(MH 保持寄存器、MI 输入寄存器)的读写操作 ### 使用场景 [​](#使用场景) * 程序运行时传递参数 * 同步机器人状态信息 * 与外部系统共享配置数据 * 实现机器人与外部设备的交互控制 ## 4.6.1 R 数值寄存器操作 [​](#4-6-1) ### 4.6.1.1 读取 R 寄存器值 [​](#4-6-1-1) | 方法名 | **register.read\_R**( index : int, with\_meta : bool = False) -> tuple\[float \| Register, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 R 数值寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 with\_meta : bool 是否返回寄存器元信息(name/comment) | | 返回值 | float: 寄存器值( with\_meta=False ) Register: 寄存器对象( with\_meta=True ) [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.1.2 写入 R 寄存器值 [​](#4-6-1-2) | 方法名 | **register.write\_R**( index : int, value : float) -> StatusCodeEnum **register.write\_R**( register : Register) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入 R 数值寄存器的值 | | 请求参数 | index : int 要写入的 R 寄存器编号 value : float 要写入的寄存器数值 register : Register 寄存器对象(包含 id/name/comment/value) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.1.3 删除 R 寄存器 [​](#4-6-1-3) | 方法名 | **register.delete\_R**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------ | | 描述 | 删除指定的 R 数值寄存器 | | 请求参数 | index : int 要删除的 R 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) registers/R.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: R寄存器读写示例 / Example of reading and writing the R register """ from Agilebot import Arm, Register, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加R寄存器 # [EN] Add R register ret = arm.register.write_R(5, 8.6) if ret == StatusCodeEnum.OK: print("写入R寄存器成功 / Write R register successful") else: print(f"写入R寄存器失败,错误代码 / Write R register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取R寄存器 # [EN] Read R register res, ret = arm.register.read_R(5) if ret == StatusCodeEnum.OK: print("读取R寄存器成功 / Read R register successful") else: print(f"读取R寄存器失败,错误代码 / Read R register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print the result print(f"R寄存器值 / R register value: {res}") # [ZH] 使用Register对象写入R寄存器 # [EN] Write R register with Register object reg = Register() reg.id = 5 reg.value = 8.6 reg.name = "R5" reg.comment = "example" ret = arm.register.write_R(reg) if ret == StatusCodeEnum.OK: print("使用Register写入R寄存器成功 / Write R register with Register successful") else: print(f"使用Register写入R寄存器失败,错误代码 / Write R register with Register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取R寄存器元信息 # [EN] Read R register meta info reg_meta, ret = arm.register.read_R(5, with_meta=True) if ret == StatusCodeEnum.OK: print("读取R寄存器元信息成功 / Read R register meta successful") print(f"名称 / Name: {reg_meta.name}, 注释 / Comment: {reg_meta.comment}") else: print(f"读取R寄存器元信息失败,错误代码 / Read R register meta failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除R寄存器 # [EN] Delete R register ret = arm.register.delete_R(5) if ret == StatusCodeEnum.OK: print("删除R寄存器成功 / Delete R register successful") else: print(f"删除R寄存器失败,错误代码 / Delete R register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.2 MR 运动寄存器操作 [​](#4-6-2) ### 4.6.2.1 读取 MR 寄存器值 [​](#4-6-2-1) | 方法名 | **register.read\_MR**( index : int, with\_meta : bool = False) -> tuple\[int \| MotionRegister, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 MR 运动寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 with\_meta : bool 是否返回寄存器元信息(name/comment) | | 返回值 | int: 寄存器值( with\_meta=False ) MotionRegister: 寄存器对象( with\_meta=True ) [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.2.2 写入 MR 寄存器值 [​](#4-6-2-2) | 方法名 | **register.write\_MR**( index : int, value : int) -> StatusCodeEnum **register.write\_MR**( register : MotionRegister) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入 MR 运动寄存器的值 | | 请求参数 | index : int 要写入的 MR 寄存器编号 value : int 要写入的寄存器数值 register : MotionRegister 寄存器对象(包含 id/name/comment/value) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.2.3 删除 MR 寄存器 [​](#4-6-2-3) | 方法名 | **register.delete\_MR**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 删除指定的 MR 运动寄存器 | | 请求参数 | index : int 要删除的 MR 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-1) registers/MR.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: MR寄存器读写示例 / Example of reading and writing MR Registers """ from Agilebot import Arm, MotionRegister, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加MR寄存器 # [EN] Add MR register ret = arm.register.write_MR(5, 8) if ret == StatusCodeEnum.OK: print("写入MR寄存器成功 / Write MR register successful") else: print(f"写入MR寄存器失败,错误代码 / Write MR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取MR寄存器 # [EN] Read MR register res, ret = arm.register.read_MR(5) if ret == StatusCodeEnum.OK: print("读取MR寄存器成功 / Read MR register successful") else: print(f"读取MR寄存器失败,错误代码 / Read MR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print the result print(f"MR寄存器值 / MR register value: {res}") # [ZH] 使用MotionRegister对象写入MR寄存器 # [EN] Write MR register with MotionRegister object reg = MotionRegister() reg.id = 5 reg.value = 8 reg.name = "MR5" reg.comment = "example" ret = arm.register.write_MR(reg) if ret == StatusCodeEnum.OK: print("使用MotionRegister写入MR寄存器成功 / Write MR register with MotionRegister successful") else: print( f"使用MotionRegister写入MR寄存器失败,错误代码 / Write MR register with MotionRegister failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 读取MR寄存器元信息 # [EN] Read MR register meta info reg_meta, ret = arm.register.read_MR(5, with_meta=True) if ret == StatusCodeEnum.OK: print("读取MR寄存器元信息成功 / Read MR register meta successful") print(f"名称 / Name: {reg_meta.name}, 注释 / Comment: {reg_meta.comment}") else: print(f"读取MR寄存器元信息失败,错误代码 / Read MR register meta failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除MR寄存器 # [EN] Delete MR register ret = arm.register.delete_MR(5) if ret == StatusCodeEnum.OK: print("删除MR寄存器成功 / Delete MR register successful") else: print(f"删除MR寄存器失败,错误代码 / Delete MR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.3 SR 字符串寄存器操作 [​](#4-6-3) ### 4.6.3.1 读取 SR 寄存器值 [​](#4-6-3-1) | 方法名 | **register.read\_SR**( index : int, with\_meta : bool = False) -> tuple\[str \| StringRegister, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 SR 字符串寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 with\_meta : bool 是否返回寄存器元信息(name/comment) | | 返回值 | str: 寄存器值( with\_meta=False ) StringRegister: 寄存器对象( with\_meta=True ) [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.3.2 写入 SR 寄存器值 [​](#4-6-3-2) | 方法名 | **register.write\_SR**( index : int, value : str) -> StatusCodeEnum **register.write\_SR**( register : StringRegister) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入 SR 字符串寄存器的值 | | 请求参数 | index : int 要写入的 SR 寄存器编号 value : str 要写入的寄存器字符串值 register : StringRegister 寄存器对象(包含 id/name/comment/value) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.3.3 删除 SR 寄存器 [​](#4-6-3-3) | 方法名 | **register.delete\_SR**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 删除指定的 SR 字符串寄存器 | | 请求参数 | index : int 要删除的 SR 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-2) registers/SR.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: SR寄存器读写示例 / Example of reading and writing SR registers """ from Agilebot import Arm, StatusCodeEnum, StringRegister # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加SR寄存器 # [EN] Add SR register ret = arm.register.write_SR(5, "pytest") if ret == StatusCodeEnum.OK: print("写入SR寄存器成功 / Write SR register successful") else: print(f"写入SR寄存器失败,错误代码 / Write SR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取SR寄存器 # [EN] Read SR register res, ret = arm.register.read_SR(5) if ret == StatusCodeEnum.OK: print("读取SR寄存器成功 / Read SR register successful") else: print(f"读取SR寄存器失败,错误代码 / Read SR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print the result print(f"SR寄存器值 / SR register value: {res}") # [ZH] 使用StringRegister对象写入SR寄存器 # [EN] Write SR register with StringRegister object reg = StringRegister() reg.id = 5 reg.value = "pytest" reg.name = "SR5" reg.comment = "example" ret = arm.register.write_SR(reg) if ret == StatusCodeEnum.OK: print("使用StringRegister写入SR寄存器成功 / Write SR register with StringRegister successful") else: print( f"使用StringRegister写入SR寄存器失败,错误代码 / Write SR register with StringRegister failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 读取SR寄存器元信息 # [EN] Read SR register meta info reg_meta, ret = arm.register.read_SR(5, with_meta=True) if ret == StatusCodeEnum.OK: print("读取SR寄存器元信息成功 / Read SR register meta successful") print(f"名称 / Name: {reg_meta.name}, 注释 / Comment: {reg_meta.comment}") else: print(f"读取SR寄存器元信息失败,错误代码 / Read SR register meta failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除SR寄存器 # [EN] Delete SR register ret = arm.register.delete_SR(5) if ret == StatusCodeEnum.OK: print("删除SR寄存器成功 / Delete SR register successful") else: print(f"删除SR寄存器失败,错误代码 / Delete SR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.4 PR 位姿寄存器操作 [​](#4-6-4) ### 4.6.4.1 读取 PR 寄存器值 [​](#4-6-4-1) | 方法名 | **register.read\_PR**( index : int, with\_meta : bool = False) -> tuple\[PoseRegister, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 PR 位姿寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 with\_meta : bool 是否返回寄存器元信息(name/comment) | | 返回值 | [PoseRegister](./../3-struct/#3-19): PR 寄存器位姿数据( with\_meta=True 时包含 name/comment) [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.4.2 写入 PR 寄存器值 [​](#4-6-4-2) | 方法名 | **register.write\_PR**( value : PoseRegister, with\_meta : bool = False) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------- | | 描述 | 写入 PR 位姿寄存器的值 | | 请求参数 | value : [PoseRegister](./../3-struct/#3-19) 要写入的 PR 寄存器位姿数据 with\_meta : bool 是否写入 name/comment | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.4.3 删除 PR 寄存器 [​](#4-6-4-3) | 方法名 | **register.delete\_PR**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 删除指定的 PR 位姿寄存器 | | 请求参数 | index : int 要删除的 PR 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-3) registers/PR.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: PR寄存器读写示例 / Example of reading and writing to the PR register """ from Agilebot import Arm, PoseRegister, PoseType, Posture, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加PR寄存器 # [EN] Add PR register # [ZH] 创建位姿 # [EN] Create pose pose_register = PoseRegister() posture = Posture() posture.arm_back_front = 1 pose_register.poseRegisterData.cartData.posture = posture pose_register.id = 5 pose_register.poseRegisterData.pt = PoseType.CART pose_register.poseRegisterData.cartData.position.x = 100 pose_register.poseRegisterData.cartData.position.y = 200 pose_register.poseRegisterData.cartData.position.z = 300 ret = arm.register.write_PR(pose_register) if ret == StatusCodeEnum.OK: print("写入PR寄存器成功 / Write PR register successful") else: print(f"写入PR寄存器失败,错误代码 / Write PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取PR寄存器 # [EN] Read PR register res, ret = arm.register.read_PR(5) if ret == StatusCodeEnum.OK: print("读取PR寄存器成功 / Read PR register successful") else: print(f"读取PR寄存器失败,错误代码 / Read PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"位姿寄存器ID / Pose register ID: {res.id}\n" f"位姿类型 / Pose type: {res.poseRegisterData.pt}\n" f"X / X: {res.poseRegisterData.cartData.position.x}\n" f"Y / Y: {res.poseRegisterData.cartData.position.y}\n" f"Z / Z: {res.poseRegisterData.cartData.position.z}\n" f"C / C: {res.poseRegisterData.cartData.position.c}\n" f"B / B: {res.poseRegisterData.cartData.position.b}\n" f"A / A: {res.poseRegisterData.cartData.position.a}\n" ) # [ZH] 写入PR寄存器元信息 # [EN] Write PR register meta info pose_register.name = "PR5" pose_register.comment = "example" ret = arm.register.write_PR(pose_register, with_meta=True) if ret == StatusCodeEnum.OK: print("写入PR寄存器成功 / Write PR register successful") else: print(f"写入PR寄存器失败,错误代码 / Write PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取PR寄存器元信息 # [EN] Read PR register meta info reg_meta, ret = arm.register.read_PR(5, with_meta=True) if ret == StatusCodeEnum.OK: print("读取PR寄存器元信息成功 / Read PR register meta successful") print(f"名称 / Name: {reg_meta.name}, 注释 / Comment: {reg_meta.comment}") else: print(f"读取PR寄存器元信息失败,错误代码 / Read PR register meta failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除PR寄存器 # [EN] Delete PR register ret = arm.register.delete_PR(5) if ret == StatusCodeEnum.OK: print("删除PR寄存器成功 / Delete PR register successful") else: print(f"删除PR寄存器失败,错误代码 / Delete PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.5 Modbus 寄存器(MH 保持寄存器、MI 输入寄存器) [​](#4-6-5) ### 4.6.5.1 读取 MH 寄存器值 [​](#4-6-5-1) | 方法名 | **register.read\_MH**( index : int) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 读取 MH 保持寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.5.2 写入 MH 寄存器值 [​](#4-6-5-2) | 方法名 | **register.write\_MH**( index : int, value : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 写入 MH 保持寄存器的值 | | 请求参数 | index : int 要写入的 MH 寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.5.3 读取 MI 寄存器值 [​](#4-6-5-3) | 方法名 | **register.read\_MI**( index : int) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 读取 MI 输入寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.5.4 写入 MI 寄存器值 [​](#4-6-5-4) | 方法名 | **register.write\_MI**( index : int, value : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 写入 MI 输入寄存器的值 | | 请求参数 | index : int 要写入的 MI 寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 示例代码 [​](#示例代码-4) registers/MH\_MI.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: MH寄存器及MI寄存器读写示例 / Example of reading and writing to the MH register and MI register """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取MH寄存器 # [EN] Read MH register res, ret = arm.register.read_MH(1) if ret == StatusCodeEnum.OK: print("读取MH寄存器成功 / Read MH register successful") else: print(f"读取MH寄存器失败,错误代码 / Read MH register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"MH寄存器 / MH register: {res}") # [ZH] 写入MH寄存器 # [EN] Write MH register ret = arm.register.write_MH(1, 16) if ret == StatusCodeEnum.OK: print("写入MH寄存器成功 / Write MH register successful") else: print(f"写入MH寄存器失败,错误代码 / Write MH register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取MI寄存器 # [EN] Read MI register res, ret = arm.register.read_MI(1) if ret == StatusCodeEnum.OK: print("读取MI寄存器成功 / Read MI register successful") else: print(f"读取MI寄存器失败,错误代码 / Read MI register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"MI寄存器 / MI register: {res}") # [ZH] 写入MI寄存器 # [EN] Write MI register ret = arm.register.write_MI(1, 18) if ret == StatusCodeEnum.OK: print("写入MI寄存器成功 / Write MI register successful") else: print(f"写入MI寄存器失败,错误代码 / Write MI register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.7-trajectory.html title: 4.7 轨迹控制 --- # 4.7 轨迹控制 [​](#4-7) ## 概述 [​](#概述) Trajectory 模块提供离线轨迹执行、轨迹 / 路径录制、转换与复现的完整流程接口,支持复杂轨迹的定制与复现。 ### 核心功能 [​](#核心功能) * 支持设置和执行离线轨迹文件 * 支持以安全速度将机器人移动到离线轨迹起始点 * 支持 CSV 到 trajectory 格式的文件转换 * 支持轨迹 / 路径的录制、播放、删除和管理 * 支持获取轨迹列表和起始位置 * 支持路径规划器参数的配置与查询 * 支持沿轨迹 / 路径运动 ### 使用场景 [​](#使用场景) * 实现复杂轨迹的精确复现 * 录制和播放机器人运动轨迹 * 转换外部轨迹数据为机器人可执行格式 * 定制路径规划参数以优化运动性能 * 批量管理和查询轨迹 / 路径文件 ## 4.7.1 设置待执行的离线轨迹文件 [​](#4-7-1) | 方法名 | **trajectory.set\_offline\_trajectory\_file**( path : str) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 设置待执行的离线轨迹文件 | | 请求参数 | path : str 离线轨迹文件程序名 (格式说明见下方备注) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | A.trajectory 轨迹文件格式为文本文件:\- 第 1 行:6 代表 6 个轴,0.001 代表两点间隔 1 ms,8093 代表轨迹点数。\- 第 2 行:6 个轴的起始位置。\- 第 3-8095 行:轨迹点数据,包含 6 轴的位置 / 速度 / 加速度 / 力矩前馈 /do 端口 /do 端口值。\- do\_port 取值范围 1\~24;do\_port 为 -1 表示该位置不触发 IO;do\_port 为 1 且 do\_state 为 1 表示 do1 端口触发 ON;do\_port 为 1 且 do\_state 为 0 表示 do1 端口触发 OFF。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.2 让机器人以安全速度移动到离线轨迹中的起始点 [​](#4-7-2) | 方法名 | **trajectory.prepare\_offline\_trajectory**() -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 让机器人以安全速度移动到离线轨迹中的起始点 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.3 让机器人开始执行离线轨迹文件 [​](#4-7-3) | 方法名 | **trajectory.execute\_offline\_trajectory**() -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 让机器人开始执行离线轨迹程序 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.4 轨迹文件转换功能 [​](#4-7-4) | 方法名 | **trajectory.transform\_csv\_to\_trajectory**( file\_name : str, separator : str = " ", io\_flag : str = "2") | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将轨迹 csv 文件转换成 trajectory 格式的轨迹文件并存放在控制柜的轨迹文件目录上 | | 请求参数 | file\_name : str CSV 轨迹文件名 (无需 .csv 后缀) separator : str 分隔符 (空格或逗号;空格生成 .trajectory ,逗号生成 .csv ) io\_flag : str IO 信息来源 (1: 默认值 do\_port = -1 、 do\_state = 0 ;2: 使用用户指定 IO) | | 返回值 | str:转换后轨迹文件路径 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.5 查询轨迹文件转换状态 [​](#4-7-5) | 方法名 | **trajectory.check\_transform\_status**( file\_name : str) -> tuple\[TransformStatusEnum, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------- | | 描述 | 查询轨迹文件转换的当前状态 | | 请求参数 | file\_name : str 轨迹文件路径 ( transform\_csv\_to\_trajectory 接口返回) | | 返回值 | [TransformStatusEnum](./../3-struct/#3-20): 转换状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) trajectory/offline\_trajectory.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 离线轨迹使用示例 / Example of offline trajectory usage """ import time from Agilebot import Arm, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置离线轨迹文件 # [EN] Set the offline trajectory file ret = arm.trajectory.set_offline_trajectory_file("test_torque.trajectory") if ret == StatusCodeEnum.OK: print("设置离线轨迹文件成功 / Set offline trajectory file successful") else: print(f"设置离线轨迹文件失败,错误代码 / Set offline trajectory file failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 准备进行离线轨迹运行 # [EN] Prepare for offline trajectory execution ret = arm.trajectory.prepare_offline_trajectory() if ret == StatusCodeEnum.OK: print("准备离线轨迹运行成功 / Prepare offline trajectory execution successful") else: print(f"准备离线轨迹运行失败,错误代码 / Prepare offline trajectory execution failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 等待控制器到位 # [EN] Wait for the controller to be ready while True: robot_status, ret = arm.get_robot_status() if ret == StatusCodeEnum.OK: print("获取机器人状态成功 / Get robot status successful") else: print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"robot_status arm: {robot_status}") servo_status, ret = arm.get_servo_status() if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"伺服状态 / Servo status: {servo_status}") if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE: break time.sleep(2) # [ZH] 执行离线轨迹 # [EN] Execute the offline trajectory ret = arm.trajectory.execute_offline_trajectory() if ret == StatusCodeEnum.OK: print("执行离线轨迹成功 / Execute offline trajectory successful") else: print(f"执行离线轨迹失败,错误代码 / Execute offline trajectory failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.7.6 开始记录轨迹 [​](#4-7-6) | 方法名 | **trajectory.trajectory\_record\_begin**( name : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------- | | 描述 | 让机器人开始记录轨迹 | | 请求参数 | name : 设置轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.7 结束记录轨迹 [​](#4-7-7) | 方法名 | **trajectory.trajectory\_record\_finish**( name : str) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------ | | 描述 | 让机器人结束记录轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.8 开始播放轨迹 [​](#4-7-8) | 方法名 | **trajectory.trajectory\_replay\_start**( name : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------- | | 描述 | 让机器人开始播放轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.9 结束播放轨迹 [​](#4-7-9) | 方法名 | **trajectory.trajectory\_replay\_stop**( name : str) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------- | | 描述 | 让机器人结束播放轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.10 删除轨迹 [​](#4-7-10) | 方法名 | **trajectory.trajectory\_record\_delete**( name : str) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------ | | 描述 | 删除机器人中指定轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.11 获取录制轨迹列表 [​](#4-7-11) | 方法名 | **trajectory.get\_trajectory\_record\_list**() -> tuple\[list\[str\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 获取录制的轨迹列表 | | 请求参数 | 无 | | 返回值 | list \[str\]: 轨迹列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.12 获取录制轨迹起始位置 [​](#4-7-12) | 方法名 | **trajectory.get\_trajectory\_record\_start\_pose**( name : str) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 获取录制轨迹的起始位置 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [MotionPose](./../3-struct/#3-12): 轨迹起始位置 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-1) trajectory/trajectory\_record.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 轨迹记录相关使用示例 / Example of real-time trajectory records usage """ import time from Agilebot import Arm, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum from Agilebot.IR.A.hardware_state import HardwareState, HWState # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 订阅轨迹记录状态 # [EN] Subscribe to the trajectory record status hw_state = HardwareState("10.27.1.254") hw_state.subscribe(topic_list=[HWState.TOPIC_TRAJECTORY_RECORDS_STATUS]) # [ZH] 开始记录轨迹 # [EN] Start recording trajectory ret = arm.trajectory.trajectory_record_begin("test") if ret == StatusCodeEnum.OK: print("开始轨迹记录成功 / Start trajectory record successful") else: print(f"开始轨迹记录失败,错误代码 / Start trajectory record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(10) res = hw_state.recv() print(f"轨迹记录状态 / Trajectory record status: {res}") # [ZH] 结束记录轨迹 # [EN] End recording trajectory ret = arm.trajectory.trajectory_record_finish("test") if ret == StatusCodeEnum.OK: print("结束轨迹记录成功 / End trajectory record successful") else: print(f"结束轨迹记录失败,错误代码 / End trajectory record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res = hw_state.recv() print(f"轨迹记录状态 / Trajectory record status: {res}") # [ZH] 获取轨迹列表 # [EN] Get trajectory list record_list, ret = arm.trajectory.get_trajectory_record_list() if ret == StatusCodeEnum.OK: print("获取轨迹记录列表成功 / Get trajectory record list successful") else: print(f"获取轨迹记录列表失败,错误代码 / Get trajectory record list failed, error code: {ret.errmsg}") arm.disconnect() exit(1) assert "test" in record_list # [ZH] 获取轨迹起始位姿 # [EN] Get trajectory start pose pose, ret = arm.trajectory.get_trajectory_record_start_pose("test") if ret == StatusCodeEnum.OK: print("获取轨迹起始位姿成功 / Get trajectory start pose successful") else: print(f"获取轨迹起始位姿失败,错误代码 / Get trajectory start pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 移动到起始位姿 # [EN] Move to the start pose ret = arm.motion.move_joint(pose) if ret == StatusCodeEnum.OK: print("关节运动成功 / Joint motion successful") else: print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 等待控制器到位 # [EN] Wait for the controller to be ready while True: robot_status, ret = arm.get_robot_status() if ret == StatusCodeEnum.OK: print("获取机器人状态成功 / Get robot status successful") else: print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"robot_status arm: {robot_status}") servo_status, ret = arm.get_servo_status() if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"伺服状态 / Servo status: {servo_status}") if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE: break time.sleep(2) # [ZH] 开始回放轨迹 # [EN] Start replay trajectory ret = arm.trajectory.trajectory_replay_start("test") if ret == StatusCodeEnum.OK: print("开始轨迹回放成功 / Start trajectory replay successful") else: print(f"开始轨迹回放失败,错误代码 / Start trajectory replay failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 停止回放轨迹 # [EN] Stop replay trajectory ret = arm.trajectory.trajectory_replay_stop("test") if ret == StatusCodeEnum.OK: print("停止轨迹回放成功 / Stop trajectory replay successful") else: print(f"停止轨迹回放失败,错误代码 / Stop trajectory replay failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除轨迹 # [EN] Delete trajectory ret = arm.trajectory.trajectory_record_delete("test") if ret == StatusCodeEnum.OK: print("删除轨迹记录成功 / Delete trajectory record successful") else: print(f"删除轨迹记录失败,错误代码 / Delete trajectory record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.7.13 开始记录轨迹 / 路径 [​](#4-7-13) | 方法名 | **trajectory.path\_record\_begin**( name : str, comment : str, param : float, angle : float = 1) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 开始轨迹表(_.traj_)或路径表(_.path_)的记录。 | | 请求参数 | name :轨迹 / 路径文件名 (必须以 .traj 或 .path 结尾); comment :轨迹 / 路径描述; param :记录参数 (路径表 _.path_: 移动距离阈值 mm;轨迹表 _.traj_: 记录间隔 ms); angle :旋转角度阈值 (仅路径表 _.path_ 生效) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.14 结束记录轨迹 / 路径 [​](#4-7-14) | 方法名 | **trajectory.path\_record\_finish**() -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 结束当前轨迹表 / 路径表的记录。 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.15 获取轨迹 / 路径起始姿态 [​](#4-7-15) | 方法名 | **trajectory.get\_path\_start\_pose**( name : str) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------- | | 描述 | 获取指定轨迹 / 路径文件的起始姿态。 | | 请求参数 | name :轨迹 / 路径文件名。 | | 返回值 | MotionPose 起始姿态,[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.16 获取轨迹 / 路径状态 [​](#4-7-16) | 方法名 | **trajectory.get\_path\_state**( path\_list : list\[str\]) -> tuple\[dict\[str, int\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 批量查询轨迹 / 路径文件当前状态。 | | 请求参数 | path\_list :待查询的轨迹 / 路径文件名列表。 | | 返回值 | dict\[str, int\] 文件名→状态码映射,[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.17 设置路径规划参数 [​](#4-7-17) | 方法名 | **trajectory.set\_path\_planner\_parameter**( transition\_time : float, scaling\_factor : float) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 设置路径规划器参数,影响运动平滑性与速度 / 加速度分配策略。 | | 请求参数 | transition\_time :过渡时长 (0\~1,数值越大加减速越柔和); scaling\_factor :路径参数 _s_ 重新分布权重 (0\~1;0: 匀速分配,1: 最大位移线性分配,0.5: 等加速度缩放,0.33: 等急动度缩放) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.18 获取路径规划参数 [​](#4-7-18) | 方法名 | **trajectory.get\_path\_planner\_parameter**() -> tuple\[float, float, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | 描述 | 读取当前路径规划器参数。 | | 请求参数 | 无 | | 返回值 | transition\_time :过渡时长,0\~1。 scaling\_factor :路径参数 _s_ 的重新分布权重,0\~1。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.19 沿轨迹 / 路径运动 [​](#4-7-19) | 方法名 | **trajectory.move\_path**( name : str, vel : float = 100, acc : float = 1) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端沿指定轨迹 / 路径文件运动。 | | 请求参数 | name :轨迹 / 路径文件名。 vel :末端速度 (0\~5000 mm/s)。 acc :加速度倍数 (0\~1.2)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ### 示例代码 [​](#示例代码-2) trajectory/path\_record.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 路径记录相关使用示例 / Example of usage related to path records """ import time from Agilebot import Arm, MoveMode, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum # [ZH] 初始化机械臂并连接到指定IP地址 # [EN] Initialize the robotic arm and connect to the specified IP address arm = Arm() ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 开始记录轨迹,指定文件名、轨迹名、记录模式和覆盖选项 # [EN] Start trajectory recording, specifying filename, trajectory name, recording mode and overwrite option ret = arm.trajectory.path_record_begin("test_path.path", "Path Test", 10, 1) if ret == StatusCodeEnum.OK: print("开始路径记录成功 / Start path record successful") else: print(f"开始路径记录失败,错误代码 / Start path record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 检查记录状态,传入轨迹文件名列表 # [EN] Check recording status, passing in trajectory filename list state, ret = arm.trajectory.get_path_state(["test_path.path"]) if ret == StatusCodeEnum.OK: print("获取路径状态成功 / Get path state successful") else: print(f"获取路径状态失败,错误代码 / Get path state failed, error code: {ret.errmsg}") arm.disconnect() exit(1) if state["test_path.path"] == 0: print("路径表记录中 / Path table recording in progress") # [ZH] 示教运动 # [EN] Teaching motion ret = arm.jogging.move(3, MoveMode.Continuous) if ret == StatusCodeEnum.OK: print("点动运动成功 / Jogging movement successful") else: print(f"点动运动失败,错误代码 / Jogging movement failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # 等待3秒,让机械臂持续运动 time.sleep(2) # 停止机械臂运动 arm.jogging.stop() time.sleep(2) ret = arm.jogging.move(-3, MoveMode.Continuous) if ret == StatusCodeEnum.OK: print("点动运动成功 / Jogging movement successful") else: print(f"点动运动失败,错误代码 / Jogging movement failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # 等待3秒,让机械臂持续运动 time.sleep(2) # 停止机械臂运动 arm.jogging.stop() time.sleep(2) # [ZH] 结束轨迹记录 # [EN] Finish trajectory recording ret = arm.trajectory.path_record_finish() if ret == StatusCodeEnum.OK: print("结束路径记录成功 / Finish path record successful") else: print(f"结束路径记录失败,错误代码 / Finish path record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 检查记录状态,传入轨迹文件名列表 # [EN] Check recording status, passing in trajectory filename list state, ret = arm.trajectory.get_path_state(["test_path.path"]) if ret == StatusCodeEnum.OK: print("获取路径状态成功 / Get path state successful") else: print(f"获取路径状态失败,错误代码 / Get path state failed, error code: {ret.errmsg}") arm.disconnect() exit(1) if state["test_path.path"] == 1: print("路径表记录完成 / Path table recording completed") # [ZH] 获取记录轨迹的起始位置姿态 # [EN] Get the starting position pose of the recorded trajectory pose, ret = arm.trajectory.get_path_start_pose("test_path.path") if ret == StatusCodeEnum.OK: print("获取路径起始位姿成功 / Get path start pose successful") else: print(f"获取路径起始位姿失败,错误代码 / Get path start pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 移动到起始位姿 # [EN] Move to the start pose ret = arm.motion.move_joint(pose) if ret == StatusCodeEnum.OK: print("关节运动成功 / Joint motion successful") else: print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 等待控制器到位 # [EN] Wait for the controller to be ready while True: robot_status, ret = arm.get_robot_status() # [ZH] 检查机器人状态获取是否成功 # [EN] Check if robot status acquisition is successful if ret == StatusCodeEnum.OK: print("获取机器人状态成功 / Get robot status successful") else: print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"robot_status arm: {robot_status}") servo_status, ret = arm.get_servo_status() # [ZH] 检查伺服状态获取是否成功 # [EN] Check if servo status acquisition is successful if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"servo status arm: {servo_status}") if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE: break time.sleep(2) # [ZH] 设置轨迹规划参数(速度比例和加速度比例) # [EN] Set trajectory planning parameters (velocity ratio and acceleration ratio) ret = arm.trajectory.set_path_planner_parameter(0.5, 0.3333333) if ret == StatusCodeEnum.OK: print("设置路径规划参数成功 / Set path planner parameter successful") else: print(f"设置路径规划参数失败,错误代码 / Set path planner parameter failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取轨迹规划参数以验证设置是否成功 # [EN] Get trajectory planning parameters to verify if the setting is successful param1, param2, ret = arm.trajectory.get_path_planner_parameter() if ret == StatusCodeEnum.OK: print("获取路径规划参数成功 / Get path planner parameter successful") else: print(f"获取路径规划参数失败,错误代码 / Get path planner parameter failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 移动到记录的轨迹,指定轨迹文件名、速度和模式 # [EN] Move to the recorded trajectory, specifying trajectory filename, speed and mode ret = arm.trajectory.move_path("test_path.path", 2000, 1) if ret == StatusCodeEnum.OK: print("路径运动成功 / Path motion successful") else: print(f"路径运动失败,错误代码 / Path motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(3) # [ZH] 断开与机械臂的连接 # [EN] Disconnect from the robotic arm arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- url: /zh/1-python/4-methods/4.8-alarm.html title: 4.8 报警信息 --- # 4.8 报警信息 [​](#4-8) ## 概述 [​](#概述) Alarm 模块提供机器人报警信息的读取、复位和查询功能,用于监控和处理机器人运行时可能出现的异常情况。 ### 核心功能 [​](#核心功能) * 支持报警复位 * 支持获取所有活动报警 * 支持获取最高优先级报警 * 支持指定报警输出语言 ### 使用场景 [​](#使用场景) * 监控机器人运行状态,及时发现异常 * 处理机器人运行过程中的错误和报警 * 记录和分析机器人报警历史 * 实现自动化报警处理流程 * 集成到机器人监控系统中 ## 4.8.1 复位报警 [​](#4-8-1) | 方法名 | **alarm.reset**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 复位当前错误 / 报警 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.8.2 获取所有活动报警 [​](#4-8-2) | 方法名 | **alarm.get\_all\_active\_alarms**( language : LanguageType) -> tuple\[list, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 获取所有当前活动的报警 | | 请求参数 | language : LanguageType 输出语言 ( LanguageType.English 或 LanguageType.Chinese ) | | 返回值 | list: 活动报警条目列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.8.3 获取最高优先级报警 [​](#4-8-3) | 方法名 | **alarm.get\_top\_alarm**() -> tuple\[ROBOT\_ALARM, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------- | | 描述 | 获取当前最高优先级的报警 | | 请求参数 | 无参数 | | 返回值 | ROBOT\_ALARM : 最高优先级报警 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) alarm.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 告警功能使用示例 / Example of using the alarm function """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有的活动的报警 # [EN] Get all active alarms alarms, ret = arm.alarm.get_all_active_alarms() if ret == StatusCodeEnum.OK: print("获取报警信息成功 / Get alarm information successfully") for alarm in alarms: print(alarm) else: print(f"获取报警信息失败,错误代码 / Failed to get alarm information, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有的活动的报警 # [EN] Get all active alarms alarm, ret = arm.alarm.get_top_alarm() if ret == StatusCodeEnum.OK: print("获取报警信息成功 / Get alarm information successfully") for alarm in alarm: print(alarm) else: print(f"获取报警信息失败,错误代码 / Failed to get alarm information, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 重置报警 # [EN] Reset alarms ret = arm.alarm.reset() if ret == StatusCodeEnum.OK: print("报警重置成功 / Alarm reset successfully") else: print(f"报警重置失败,错误代码 / Alarm reset failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.9-file_manager.html title: 4.9 文件管理 --- # 4.9 文件管理 [​](#4-9) ## 概述 [​](#概述) FileManager 用于在上位机和机器人控制器之间上传、下载、删除或搜索程序、轨迹及临时文件等资源,支持多种文件类型的管理和操作。 ### 核心功能 [​](#核心功能) * 支持本地文件上传到机器人控制器 * 支持机器人文件下载到本地目录 * 支持从机器人控制器删除文件 * 支持按文件名模式搜索文件 * 支持多种文件类型管理(USER\_PROGRAM、BLOCK\_PROGRAM、TRAJECTORY、ROBOT\_TMP) * 支持上传 / 下载时的覆盖控制 ### 使用场景 [​](#使用场景) * 部署程序到机器人控制器 * 备份机器人上的程序和轨迹文件 * 同步调试产线数据 * 批量管理和查询机器人文件 * 上传临时数据文件到机器人 * 下载机器人日志或输出文件到本地 ## 4.9.1 上传本地文件到机器人 [​](#4-9-1) | 方法名 | **file\_manager.upload**( file\_path : str, file\_type : str, overwriting : bool = False) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将本地文件上传到机器人控制器 | | 请求参数 | file\_path : str 本地文件绝对路径。 file\_type : str 文件类型 (USER\_PROGRAM: file\_path 为程序名路径,上传同目录 json / xml ;BLOCK\_PROGRAM: file\_path 为积木程序名路径,上传同目录 block / json / xml ;TRAJECTORY: file\_path 为完整轨迹文件路径;ROBOT\_TMP: file\_path 为完整临时文件路径)。 overwriting : bool 是否覆盖同名文件 (默认 False )。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | USER\_PROGRAM 、 BLOCK\_PROGRAM 上传时仅填写程序名(即程序文件名,不含后缀)。 | ## 4.9.2 下载机器人文件到本地 [​](#4-9-2) | 方法名 | **file\_manager.download**( file\_name : str, file\_path : str, file\_type : str, overwriting : bool=False) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将机器人上的文件下载到本地目录。 | | 请求参数 | file\_name : str 文件名。 file\_path : str 本地保存目录。 file\_type : str 文件类型 ( BLOCK\_PROGRAM 暂不支持下载)。 overwriting : bool 是否覆盖同名文件。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | USER\_PROGRAM 下载时仅填写程序名(即程序文件名,不含后缀),系统会下载对应 .json / .xml ; TRAJECTORY 请填写带 .trajectory 的完整文件名; ROBOT\_TMP 请填写带后缀的完整文件名(如 .csv )。 | ## 4.9.3 删除机器人上的文件 [​](#4-9-3) | 方法名 | **file\_manager.delete**( file\_name : str, file\_type : str) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------- | | 描述 | 从机器人控制器删除文件。 | | 请求参数 | file\_name : str 要删除的文件名。 file\_type : str 文件类型。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | USER\_PROGRAM / BLOCK\_PROGRAM 删除时仅填写程序名(即程序文件名,不含后缀); TRAJECTORY / ROBOT\_TMP 请填写带后缀的完整文件名。 | ## 4.9.4 按文件名模式搜索文件 [​](#4-9-4) | 方法名 | **file\_manager.search**( pattern : str, file\_list : list) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------- | | 描述 | 在控制器上按文件名模式搜索文件。 | | 请求参数 | pattern : str 文件名匹配模式 file\_list : list 输出列表,用于接收匹配到的文件名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) file\_manager/file\_manager.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 文件操作, 上传下载示例 / Example of file operation, upload and download """ from pathlib import Path from Agilebot import ROBOT_TMP, TRAJECTORY, USER_PROGRAM, FileManager, StatusCodeEnum current_path = Path(__file__) path = str(current_path) # [ZH] 连接文件管理服务 # [EN] Connect to the file management service file_manager = FileManager("10.27.1.254") # [ZH] 上传其他文件 # [EN] Upload other files tmp_file_path = path.replace("file_manager.py", "test.csv") ret = file_manager.upload(tmp_file_path, ROBOT_TMP, True) if ret == StatusCodeEnum.OK: print("文件上传成功 / File upload successful") else: print(f"文件上传失败,错误代码 / File upload failed, error code: {ret.errmsg}") exit(1) # [ZH] 上传程序 # [EN] Upload a program prog_file_path = path.replace("file_manager.py", "test_prog") ret = file_manager.upload(prog_file_path, USER_PROGRAM, True) if ret == StatusCodeEnum.OK: print("程序上传成功 / Program upload successful") else: print(f"程序上传失败,错误代码 / Program upload failed, error code: {ret.errmsg}") exit(1) # [ZH] 上传轨迹 # [EN] Upload a trajectory trajectory_file_path = path.replace("file_manager.py", "test_torque.trajectory") ret = file_manager.upload(trajectory_file_path, TRAJECTORY, True) if ret == StatusCodeEnum.OK: print("轨迹上传成功 / Trajectory upload successful") else: print(f"轨迹上传失败,错误代码 / Trajectory upload failed, error code: {ret.errmsg}") exit(1) # [ZH] 搜索文件 # [EN] Search for files file_list = list() ret = file_manager.search("test.csv", file_list) if ret == StatusCodeEnum.OK: print("文件搜索成功 / File search successful") else: print(f"文件搜索失败,错误代码 / File search failed, error code: {ret.errmsg}") exit(1) print("搜索文件:", file_list) # [ZH] 下载文件 # [EN] Download a file download_file_path = path.replace("file_manager.py", "download") ret = file_manager.download("test_torque", download_file_path, file_type=TRAJECTORY) if ret == StatusCodeEnum.OK: print("文件下载成功 / File download successful") else: print(f"文件下载失败,错误代码 / File download failed, error code: {ret.errmsg}") exit(1) # [ZH] 删除文件 # [EN] Delete a file ret = file_manager.delete("test_torque.trajectory", TRAJECTORY) if ret == StatusCodeEnum.OK: print("文件删除成功 / File delete successful") else: print(f"文件删除失败,错误代码 / File delete failed, error code: {ret.errmsg}") exit(1) ``` --- --- url: /zh/1-python/4-methods/4.10-coordinate_system.html title: 4.10 坐标系 --- # 4.10 坐标系 [​](#4-10) ## 概述 [​](#概述) CoordinateSystem 模块负责管理机器人用户坐标系(UF)与工具坐标系(TF),提供新增、删除、更新、查询和计算坐标系的统一接口。 ### 核心功能 [​](#核心功能) * 支持获取用户 / 工具坐标系摘要信息列表 * 支持添加、删除、更新和查询用户 / 工具坐标系 * 支持根据输入的多组位姿计算用户 / 工具坐标系 * 提供统一的坐标系管理接口,便于维护控制器中的坐标系列表 * 支持依据示教点快速求解新坐标系 ### 使用场景 [​](#使用场景) * 多工位调试时保持一致的空间参考 * 工具切换时管理不同工具的坐标系 * 批量管理和查询机器人坐标系 * 根据示教点自动计算新的坐标系 * 实现复杂任务中的坐标系切换 ## 4.10.1 获取用户 / 工具坐标系列表 [​](#4-10-1) | 方法名 | **coordinate\_system.UF/TF.get\_coordinate\_list**() -> tuple\[List\[Coordinate\], StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取用户 / 工具坐标系的摘要信息列表 | | 请求参数 | 无参数 | | 返回值 | UserCoordSummaryList:坐标系摘要信息列表 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.2 添加用户 / 工具坐标系 [​](#4-10-2) | 方法名 | **coordinate\_system.UF/TF.add**( coordinate : Coordinate) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------- | | 描述 | 向当前用户 / 工具坐标系集合中添加一个坐标系 | | 请求参数 | coordinate : [Coordinate](./../3-struct/#3-23) 要添加的坐标系信息 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.3 删除用户 / 工具坐标系 [​](#4-10-3) | 方法名 | **coordinate\_system.UF/TF.delete**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 从当前的用户 / 工具坐标系集合中删除一个坐标系 | | 请求参数 | index :int 坐标系编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.4 更新用户 / 工具坐标系 [​](#4-10-4) | 方法名 | **coordinate\_system.UF/TF.update**( coordinate : Coordinate) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------- | | 描述 | 在当前的用户 / 工具坐标系集合中更新一个坐标系的信息 | | 请求参数 | coordinate : [Coordinate](./../3-struct/#3-23) 新的坐标系内容 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.5 获取用户 / 工具坐标系 [​](#4-10-5) | 方法名 | **coordinate\_system.UF/TF.get**( index : int) -> tuple\[Coordinate, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 从当前的用户 / 工具坐标系集合中获取一个指定的坐标系 | | 请求参数 | index :int 坐标系编号 | | 返回值 | [Coordinate](./../3-struct/#3-23): 坐标系信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.6 计算用户 / 工具坐标系 [​](#4-10-6) | 方法名 | **coordinate\_system.UF/TF.calculate**(pose: List\[[Position](./../3-struct/#3-9)\]) -> tuple\[[Position](./../3-struct/#3-9), StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 根据输入的多组位姿,计算用户 / 工具坐标系,并返回计算得到的位姿结果 | | 请求参数 | pose :List\[[Position](./../3-struct/#3-9)\] 输入的位置信息列表 | | 返回值 | [Position](./../3-struct/#3-9):计算后的位置信息 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) coordinate\_system.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 坐标系系统使用示例 / Example of coordinate system usage """ from Agilebot import Arm, Coordinate, Position, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret != StatusCodeEnum.OK: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("机器人连接成功 / Robot connected successfully") # [ZH] 定义位姿数据用于计算工具坐标系 # [EN] Define pose data for calculating tool coordinate system pose_data = [ Position(341.6861424047297, -33.70972073115479, 430.1721970894897, 0.001, 6.745, -180.000), Position(365.4597874970455, 77.95089759481547, 441.39040857936857, -7.343, 12.620, 138.857), Position(410.64702354574865, 10.394172666192766, 468.26089261578807, 18.719, 29.151, 155.585), Position(483.2519847999948, 112.71925218513972, 448.39071038067624, 33.947, 69.714, 133.597), ] # [ZH] 根据位姿数据计算工具坐标系 # [EN] Calculate tool coordinate system based on pose data pose, ret = arm.coordinate_system.TF.calculate(pose_data) if ret != StatusCodeEnum.OK: print(f"计算工具坐标系失败,错误代码 / Calculate tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("计算工具坐标系成功 / Calculate tool coordinate system successfully") print(f"计算得到的位姿 / Calculated pose:X={pose.x}, Y={pose.y}, Z={pose.z}, A={pose.a}, B={pose.b}, C={pose.c}") # [ZH] 创建工具坐标系对象 # [EN] Create tool coordinate system object tf = Coordinate(5, "test_tf", "测试工具坐标系", pose) # [ZH] 删除可能存在的ID为5的坐标系(避免冲突) # [EN] Delete coordinate system with ID 5 if exists (avoid conflict) arm.coordinate_system.TF.delete(5) # [ZH] 添加工具坐标系名字 / Add tool coordinate system ret = arm.coordinate_system.TF.add(tf) if ret != StatusCodeEnum.OK: print(f"添加工具坐标系失败,错误代码 / Add tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("添加工具坐标系成功 / Add tool coordinate system successfully") # [ZH] 获取工具坐标系列表 # [EN] Get tool coordinate system list tf_list, ret = arm.coordinate_system.TF.get_coordinate_list() if ret != StatusCodeEnum.OK: print(f"获取工具坐标系列表失败,错误代码 / Get tool coordinate system list failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("获取工具坐标系列表成功 / Get tool coordinate system list successfully") print(f"工具坐标系列表 / Tool coordinate system list: {tf_list}") # [ZH] 获取指定的工具坐标系 # [EN] Get a specific tool coordinate system tf, ret = arm.coordinate_system.TF.get(5) if ret != StatusCodeEnum.OK: print(f"获取工具坐标系失败,错误代码 / Get tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("获取工具坐标系成功 / Get tool coordinate system successfully") print(f" TF ID: {tf.id}") print(f" TF Name: {tf.name}") print(f" TF Comment: {tf.comment}") print(f" X: {tf.data.x}, Y: {tf.data.y}, Z: {tf.data.z}") print(f" A: {tf.data.a}, B: {tf.data.b}, C: {tf.data.c}") # [ZH] 更新工具坐标系的名称 # [EN] Update tool coordinate system name tf.name = "updated_test_tf" ret = arm.coordinate_system.TF.update(tf) if ret != StatusCodeEnum.OK: print(f"更新工具坐标系失败,错误代码 / Update tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("更新工具坐标系成功 / Update tool coordinate system successfully") # [ZH] 删除工具坐标系 # [EN] Delete tool coordinate system ret = arm.coordinate_system.TF.delete(5) if ret != StatusCodeEnum.OK: print(f"删除工具坐标系失败,错误代码 / Delete tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("删除工具坐标系成功 / Delete tool coordinate system successfully") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.11-modbus.html title: 4.11 Modbus 功能 --- # 4.11 Modbus 功能 [​](#4-11) ## 概述 [​](#概述) Modbus 模块封装了机器人作为 Modbus 主站时的从站管理、寄存器读写以及串口参数配置等能力,方便与 PLC、IO 扩展模块等 Modbus 设备的联动。 ### 核心功能 [​](#核心功能) * 支持按通道和从站 ID 获取 Modbus 从站实例 * 支持读取和写入从机 Modbus 线圈寄存器 * 支持读取和写入从机 Modbus 保持寄存器 * 支持读取从机 Modbus 离散输入寄存器 * 支持读取从机 Modbus 输入寄存器 * 支持设置和查询串口通信参数 ### 使用场景 [​](#使用场景) * 与 PLC 设备进行数据交换 * 控制 IO 扩展模块 * 实现机器人与其他 Modbus 设备的联动 * 配置和管理 Modbus 串口通信参数 ### 注意事项 [​](#注意事项) Modbus 功能与机器人软件上的总线配置冲突,不能同时使用。 ## 4.11.1 获取 Modbus 从机实例 [​](#4-11-1) | 方法名 | **modbus.get\_slave**( channel : ModbusChannel, slave\_id : int, master\_id : int = 0) -> 'Modbus.Slave' | | ---------- | ------------------------------------------------------------------------------------------------------------ | | 描述 | 获取指定通道和从机 ID 的 Modbus 从机实例 | | 请求参数 | channel : [ModbusChannel](./../3-struct/#3-30) Modbus 通道 slave\_id : int 从机 ID master\_id : int 主机 ID (默认 0) | | 返回值 | Modbus.Slave: Modbus 从机实例 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.2 读取从机 Modbus 线圈寄存器 [​](#4-11-2) | 方法名 | **slave.read\_coils**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 线圈寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量 (最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.3 写入从机 Modbus 线圈寄存器 [​](#4-11-3) | 方法名 | **slave.write\_coils**( address : int, value : list\[int\]) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------- | | 描述 | 写入从机 Modbus 线圈寄存器 | | 请求参数 | address : int 寄存器地址 value : list \[int\] 寄存器值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.4 读取从机 Modbus 保持寄存器 [​](#4-11-4) | 方法名 | **slave.read\_holding\_regs**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 保持寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量 (最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.5 写入从机 Modbus 保持寄存器 [​](#4-11-5) | 方法名 | **slave.write\_holding\_regs**( address : int, value : list\[int\]) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 写入从机 Modbus 保持寄存器 | | 请求参数 | address : int 寄存器地址 value : list \[int\] 寄存器值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.6 读取从机 Modbus 离散输入寄存器 [​](#4-11-6) | 方法名 | **slave.read\_discrete\_inputs**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 离散输入寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量 (最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.7 读取从机 Modbus 输入寄存器 [​](#4-11-7) | 方法名 | **slave.read\_input\_regs**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 输入寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量 (最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 示例代码 [​](#示例代码) modbus.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: modbus使用示例 / Example of modbus usage """ from Agilebot import Arm, ModbusChannel, SerialParams, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the robot arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置modbus参数 # [EN] Set Modbus parameters params = SerialParams(channel=ModbusChannel.CONTROLLER_TCP_TO_485, ip="10.27.1.80", port=502) id, ret_code = arm.modbus.set_parameter(params) if ret_code == StatusCodeEnum.OK: print("设置Modbus参数成功 / Set Modbus parameters successfully") else: print(f"设置Modbus参数失败,错误代码 / Set Modbus parameters failed, error code: {ret_code.errmsg}") arm.disconnect() exit(1) # [ZH] 创建从站 # [EN] Create a slave slave = arm.modbus.get_slave(ModbusChannel.CONTROLLER_TCP_TO_485, 1, 1) # [ZH] 写入 # [EN] Write to registers value = [1, 2, 3, 4] ret = slave.write_coils(0, value) if ret == StatusCodeEnum.OK: print("写入线圈成功 / Write coils successfully") else: print(f"写入线圈失败,错误代码 / Write coils failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = slave.write_holding_regs(0, value) if ret == StatusCodeEnum.OK: print("写入保持寄存器成功 / Write holding registers successfully") else: print(f"写入保持寄存器失败,错误代码 / Write holding registers failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取 # [EN] Read registers res, ret = slave.read_coils(0, 4) if ret == StatusCodeEnum.OK: print("读取线圈成功 / Read coils successfully") print(f"读取的线圈值 / Read coil values:{res}") else: print(f"读取线圈失败,错误代码 / Read coils failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = slave.read_holding_regs(0, 4) if ret == StatusCodeEnum.OK: print("读取保持寄存器成功 / Read holding registers successfully") print(f"读取的寄存器值 / Read register values:{res}") else: print(f"读取保持寄存器失败,错误代码 / Read holding registers failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = slave.read_input_regs(0, 4) if ret == StatusCodeEnum.OK: print("读取输入寄存器成功 / Read input registers successfully") print(f"读取的输入寄存器值 / Read input register values:{res}") else: print(f"读取输入寄存器失败,错误代码 / Read input registers failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = slave.read_discrete_inputs(0, 4) if ret == StatusCodeEnum.OK: print("读取离散输入成功 / Read discrete inputs successfully") print(f"读取的离散输入值 / Read discrete input values:{res}") else: print(f"读取离散输入失败,错误代码 / Read discrete inputs failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 结束后断开机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.11.8 设置串口通讯参数 [​](#4-11-8) | 方法名 | **modbus.set\_parameter**( param : [SerialParams](./../3-struct/#3-30)) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 设置串口通讯参数 | | 请求参数 | param : [SerialParams](./../3-struct/#3-30) 串口通讯参数 | | 返回值 | int:通道 ID [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.9 获取串口通讯参数 [​](#4-11-9) | 方法名 | **modbus.get\_parameter**( channel : ModbusChannel, master\_id : int = 1) -> tuple\[[SerialParams](./../3-struct/#3-30), StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取串口通讯参数 | | 请求参数 | channel : [ModbusChannel](./../3-struct/#3-30) Modbus 通道 master\_id : int 主机 ID (默认 1) | | 返回值 | [SerialParams](./../3-struct/#3-30):串口通讯参数 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | --- --- url: /zh/1-python/4-methods/4.12-bas_script.html title: 4.12 BasScript 脚本程序类 --- # 4.12 BasScript 脚本程序类 [​](#4-12) ## 概述 [​](#概述) BasScript 用于在上位机以结构化方式构建机器人中的 BAS 指令序列,涵盖运动、逻辑、程序调用、通信、视觉和 Modbus 等多种指令类型。 ### 核心功能 [​](#核心功能) * 支持构建运动指令(MoveJoint、MoveLine、MoveCircle 等) * 支持构建逻辑指令(If、While、Switch、Goto 等) * 支持构建赋值、等待、暂停和中断指令 * 支持构建程序调用和管理指令 * 支持构建 Socket 通信指令 * 支持构建 Modbus 寄存器读写指令 * 支持构建视觉程序指令 * 支持设置额外参数(加速度、RTCP、帧偏移等) * 支持快速运动指令(JUMP 系列) ### 使用场景 [​](#使用场景) * 自动化生成复杂的机器人程序 * 编辑和修改机器人程序 * 复用常用程序模块和指令序列 * 实现上位机与机器人程序的无缝对接 * 构建定制化的机器人运动轨迹 * 集成视觉、通信和 Modbus 功能到机器人程序中 ## 类构造函数 [​](#类构造函数) | 方法名 | **BasScript**( name : str) -> BasScript | | ---------- | ---------------------------------------------- | | 描述 | 构建用于机器人中的 BAS 指令序列类 | | 请求参数 | name :脚本名称 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): v7.6.0.0+ | | 备注 | 本类下所有方法的兼容版本要求与本类一致 | ## 子类结构 [​](#子类结构) BasScript 类包含以下子类,用于组织不同类型的指令: 1. **ExtraParam**:额外参数类,用于构建复杂的机器人控制命令 2. **BasMotion**:运动指令子类,包含所有机器人运动相关的方法 3. **BasLogical**:逻辑指令子类,包含所有逻辑控制相关的方法 4. **BasStructure**:结构指令子类,包含所有结构控制相关的方法 5. **BasSocket**:Socket 通信子类,包含所有 Socket 通信相关的方法 6. **BasModbus**:Modbus 通信子类,包含所有 Modbus 通信相关的方法 7. **BasVision**:视觉指令子类,包含所有视觉相关的方法 ## 4.12.1 ExtraParam 额外参数类 [​](#4-12-1) | 方法名 | **ExtraParam**() -> ExtraParam | | ---- | ------------------------------ | | 描述 | 额外参数类,用于构建复杂的机器人控制命令 | | 请求参数 | 无 | | 返回值 | ExtraParam 对象 | ### 4.12.1.1 设置加速度 [​](#4-12-1-1) | 方法名 | **extra\_param.acceleration**( value : float) -> None | | ---- | ----------------------------------------------------- | | 描述 | 设置加速度,范围为 1\~120% | | 请求参数 | value : float 加速度值,单位:%(浮点数) | | 返回值 | 无 | ### 4.12.1.2 设置 RTCP 参数 [​](#4-12-1-2) | 方法名 | **extra\_param.rtcp**() -> None | | ---- | ------------------------------- | | 描述 | 设置 RTCP 参数,仅支持 MoveL 和 MoveC 指令 | | 请求参数 | 无 | | 返回值 | 无 | ### 4.12.1.3 设置帧偏移 [​](#4-12-1-3) | 方法名 | **extra\_param.offset**( index : int) -> None | | ---- | --------------------------------------------- | | 描述 | 设置帧偏移 | | 请求参数 | index : int 偏移索引(整数) | | 返回值 | 无 | ### 4.12.1.4 设置时间基准运行或赋值 [​](#4-12-1-4) | 方法名 | **extra\_param.tb**( second : int, type : str, name : str = None, index : int = None, status : str = None) -> None | | ---- | ------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置时间基准运行或赋值,范围为 0.01-30s,若输入小于 0.01 的数不会保存成功 | | 请求参数 | second : int 秒数,单位:sec(整数) type : str 执行类型(字符串) name : str 名称(用于运行,字符串) index : int 索引(用于赋值,整数) status : str 状态(用于赋值,字符串) | | 返回值 | 无 | ### 4.12.1.5 设置跳转 [​](#4-12-1-5) | 方法名 | **extra\_param.skip**( index : int) -> None | | ---- | ----------------------------------------------------------------- | | 描述 | 设置跳转,当满足 SKIP CONDITION 指令设置的跳转条件时,从含有 SKIP 指令的当前行直接跳转到目标指令行或目标程序 | | 请求参数 | index : int 目标标签的索引(整数) | | 返回值 | 无 | ### 4.12.1.6 设置出发距离和接近距离 [​](#4-12-1-6) | 方法名 | **extra\_param.approach**( departure\_dist : float, approaching\_dist : float) -> None | | ---- | -------------------------------------------------------------------------------------- | | 描述 | 设置门型运动的出发距离和接近距离,仅用于 JUMP 指令 | | 请求参数 | departure\_dist : float 出发距离,单位:mm(浮点数) approaching\_dist : float 接近距离,单位:mm(浮点数) | | 返回值 | 无 | ## 4.12.2 BasMotion 运动指令子类 [​](#4-12-2) ### 4.12.2.1 MoveJoint 运动到点指令 [​](#4-12-2-1) | 方法名 | **motion.move\_joint**( pose\_type : [MovePoseType](./../3-struct/#3-32-1), pose\_index : int, speed\_type : [SpeedType](./../3-struct/#3-32-3), speed\_value : float, smooth\_type : [SmoothType](./../3-struct/#3-32-2), smooth\_distance : float = 0.0, extra\_param : ExtraParam = None) -> StatusCodeEnum | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 关节运动指令,以指定的移动速度和移动方法使机器人向作业空间内的指定位置移动,对应机器人程序编写中的 MoveJoint 指令 | | 请求参数 | pose\_type : [MovePoseType](./../3-struct/#3-32-1) 位姿类型 pose\_index : int 位姿索引 speed\_type : [SpeedType](./../3-struct/#3-32-3) 速度类型 speed\_value : float 速度值,单位:% smooth\_type : [SmoothType](./../3-struct/#3-32-2) 平滑类型 smooth\_distance : float 平滑距离,单位:mm,取值范围:0\~1000 extra\_param : ExtraParam 附加参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.2.2 MoveLine 直线运动到点指令 [​](#4-12-2-2) | 方法名 | **motion.move\_line**( pose\_type : [MovePoseType](./../3-struct/#3-32-1), pose\_index : int, speed\_type : [SpeedType](./../3-struct/#3-32-3), speed\_value : float, smooth\_type : [SmoothType](./../3-struct/#3-32-2), smooth\_distance : float = 0.0, extra\_param : ExtraParam = None) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 直线运动指令,以指定的移动速度和移动方法使机器人向作业空间内的指定位置直线移动,对应机器人程序编写中的 MoveLine 指令 | | 请求参数 | pose\_type : [MovePoseType](./../3-struct/#3-32-1) 位姿类型 pose\_index : int 位姿索引 speed\_type : [SpeedType](./../3-struct/#3-32-3) 速度类型 speed\_value : float 速度值,单位:mm/s smooth\_type : [SmoothType](./../3-struct/#3-32-2) 平滑类型 smooth\_distance : float 平滑距离,单位:mm,取值范围:0\~1000 extra\_param : ExtraParam 附加参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.2.3 MoveCircle 弧线运动到点指令 [​](#4-12-2-3) | 方法名 | **motion.move\_circle**( pose\_type1 : [MovePoseType](./../3-struct/#3-32-1), pose\_index1 : int, pose\_type2 : [MovePoseType](./../3-struct/#3-32-1), pose\_index2 : int, speed\_type : [SpeedType](./../3-struct/#3-32-3), speed\_value : float, smooth\_type : [SmoothType](./../3-struct/#3-32-2), smooth\_distance : float = 0.0, extra\_param : ExtraParam = None) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 圆弧运动指令,以指定的移动速度和移动方法使机器人向作业空间内的指定位置圆弧移动,对应机器人程序编写中的 MoveCircle 指令 | | 请求参数 | pose\_type1 : [MovePoseType](./../3-struct/#3-32-1) 第一个位姿类型 pose\_index1 : int 第一个位姿索引 pose\_type2 : [MovePoseType](./../3-struct/#3-32-1) 第二个位姿类型 pose\_index2 : int 第二个位姿索引 speed\_type : [SpeedType](./../3-struct/#3-32-3) 速度类型 speed\_value : float 速度值,单位:mm/s smooth\_type : [SmoothType](./../3-struct/#3-32-2) 平滑类型 smooth\_distance : float 平滑距离,单位:mm,取值范围:0\~1000 extra\_param : ExtraParam 附加参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.2.4 JUMP 快速运动指令 [​](#4-12-2-4) | 方法名 | **motion.move\_jump**( pose\_type : [MovePoseType](./../3-struct/#3-32-1), pose\_index : int, speed\_value : float, speed\_ratio : float, lim\_Z\_type : [SpeedType](./../3-struct/#3-32-3), lim\_Z\_value : float, smooth\_type : [SmoothType](./../3-struct/#3-32-2), smooth\_distance : float = 0.0, extra\_param : ExtraParam = None) -> StatusCodeEnum | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 门型运动指令,指定机器人做门型运动(首先垂直上升、然后水平移动,最后垂直下降),对应机器人程序编写中的 JUMP 指令 | | 请求参数 | pose\_type : [MovePoseType](./../3-struct/#3-32-1) 目标位姿存储类型 pose\_index : int 目标位置的索引 speed\_value : float 移动速度的值,单位:mm/s speed\_ratio : float 移动速度的比率,单位:% lim\_Z\_type : [SpeedType](./../3-struct/#3-32-3) Z 轴限制的类型 lim\_Z\_value : float Z 轴限制的值 smooth\_type : [SmoothType](./../3-struct/#3-32-2) 平滑类型 smooth\_distance : float 平滑距离,单位:mm,取值范围:0\~1000 extra\_param : ExtraParam 额外参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.2.5 JUMP3 快速运动指令 [​](#4-12-2-5) | 方法名 | **motion.move\_jump3**( pose\_type : [MovePoseType](./../3-struct/#3-32-1), pose\_index : List\[int\], speed\_value : float, speed\_ratio : float, smooth\_type : [SmoothType](./../3-struct/#3-32-2), smooth\_distance : float = 0.0, extra\_param : ExtraParam = None) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 门型运动指令,指定机器人做门型运动,包含出发、接近和目标三个位置,对应机器人程序编写中的 JUMP3 指令 | | 请求参数 | pose\_type : [MovePoseType](./../3-struct/#3-32-1) 目标位姿存储类型 pose\_index : List \[int\] 3 个目标位置的索引列表(出发、接近、目标) speed\_value : float 移动速度的值,单位:mm/s speed\_ratio : float 移动速度的比率,单位:% smooth\_type : [SmoothType](./../3-struct/#3-32-2) 平滑类型 smooth\_distance : float 平滑距离,单位:mm,取值范围:0\~1000 extra\_param : ExtraParam 额外参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.2.6 JUMP3CP 快速运动指令 [​](#4-12-2-6) | 方法名 | **motion.move\_jump3cp**( pose\_type : [MovePoseType](./../3-struct/#3-32-1), pose\_index : List\[int\], speed\_value : float, smooth\_type : [SmoothType](./../3-struct/#3-32-2), smooth\_distance : float = 0.0, extra\_param : ExtraParam = None) -> StatusCodeEnum | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 门型运动指令,指定机器人做门型运动,包含出发、接近和目标三个位置,对应机器人程序编写中的 JUMP3CP 指令 | | 请求参数 | pose\_type : [MovePoseType](./../3-struct/#3-32-1) 目标位姿存储类型 pose\_index : List \[int\] 3 个目标位置的索引列表(出发、接近、目标) speed\_value : float 移动速度的值,单位:mm/s smooth\_type : [SmoothType](./../3-struct/#3-32-2) 平滑类型 smooth\_distance : float 平滑距离,单位:mm,取值范围:0\~1000 extra\_param : ExtraParam 额外参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.3 BasLogical 逻辑指令子类 [​](#4-12-3) ### 4.12.3.1 LogiIf 条件指令 [​](#4-12-3-1) | 方法名 | **logical.logi\_if**( param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\], index : int, param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\], operator : [BooleanOperator](./../3-struct/#3-32-8) \= [BooleanOperator](./../3-struct/#3-32-8).EQ) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 条件判断指令,根据指定条件执行不同的代码块,对应机器人程序编写中的 IF 逻辑语句 | | 请求参数 | param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\] 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\] 第二个参数(寄存器、IO 信号或其他类型) value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\] 参数 2 的索引或值 operator : [BooleanOperator](./../3-struct/#3-32-8) 逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.2 LogiElseIf 条件分支指令 [​](#4-12-3-2) | 方法名 | **logical.logi\_else\_if**( param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\], index : int, param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\], operator : [BooleanOperator](./../3-struct/#3-32-8) \= [BooleanOperator](./../3-struct/#3-32-8).EQ) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 条件分支指令,当 If 条件不满足时,判断 ElseIf 条件是否满足,对应机器人程序编写中的 ELIF 逻辑语句 | | 请求参数 | param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\] 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : Union\[[ValueType](./../3-struct/#3-32-14), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\] 第二个参数(寄存器、IO 信号或其他类型) value : Union\[int, float, [IOStatus](./../3-struct/#3-32-6)\] 参数 2 的索引或值 operator : [BooleanOperator](./../3-struct/#3-32-8) 逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.3 LogiElse 否则指令 [​](#4-12-3-3) | 方法名 | **logical.logi\_else**() -> StatusCodeEnum | | ---- | ---------------------------------------------------- | | 描述 | 否则指令,当所有 If 和 ElseIf 条件都不满足时执行,对应机器人程序编写中的 ELSE 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.4 LogiEndIf 结束条件指令 [​](#4-12-3-4) | 方法名 | **logical.logi\_end\_if**() -> StatusCodeEnum | | ---- | --------------------------------------------- | | 描述 | 结束条件指令,用于结束 If 条件语句块,对应机器人程序编写中的 ENDIF 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.5 LogiWhile 循环指令 [​](#4-12-3-5) | 方法名 | **logical.logi\_while**( param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\], index : int, param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\], operator : [BooleanOperator](./../3-struct/#3-32-8) \= [BooleanOperator](./../3-struct/#3-32-8).EQ) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 循环指令,当条件满足时重复执行循环体内的代码,对应机器人程序编写中的 WHILE 逻辑语句 | | 请求参数 | param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\] 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\] 第二个参数(寄存器、IO 信号或其他类型) value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\] 参数 2 的索引或值 operator : [BooleanOperator](./../3-struct/#3-32-8) 逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.6 LogiEndWhile 结束循环指令 [​](#4-12-3-6) | 方法名 | **logical.logi\_end\_while**() -> StatusCodeEnum | | ---- | ------------------------------------------------- | | 描述 | 结束循环指令,用于结束 While 循环语句块,对应机器人程序编写中的 ENDWHILE 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.7 LogiSwitch 多分支选择指令 [​](#4-12-3-7) | 方法名 | **logical.logi\_switch**( param : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\], index : int) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 多分支选择指令,根据表达式的值选择执行不同的分支,支持 BREAK 语句跳出分支,对应机器人程序编写中的 SWITCH 逻辑语句 | | 请求参数 | param : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\] 寄存器或 IO 信号 index : int 索引序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.8 LogiCase 分支指令 [​](#4-12-3-8) | 方法名 | **logical.logi\_case**( param : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, str\]) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 分支指令,用于定义 Switch 语句中的分支条件,对应机器人程序编写中的 CASE 逻辑语句 | | 请求参数 | param : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\] 寄存器、IO 信号或其他类型 value : Union \[int, float, str\] 索引序号或值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.9 LogiDefault 默认分支指令 [​](#4-12-3-9) | 方法名 | **logical.logi\_default**() -> StatusCodeEnum | | ---- | -------------------------------------------------- | | 描述 | 默认分支指令,当所有 Case 条件都不满足时执行,对应机器人程序编写中的 DEFAULT 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.10 LogiEndSwitch 结束多分支选择指令 [​](#4-12-3-10) | 方法名 | **logical.logi\_end\_switch**() -> StatusCodeEnum | | ---- | ---------------------------------------------------- | | 描述 | 结束多分支选择指令,用于结束 Switch 语句块,对应机器人程序编写中的 ENDSWITCH 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.11 LogiGoto 跳转指令 [​](#4-12-3-11) | 方法名 | **logical.logi\_goto**( index : int) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------- | | 描述 | 跳转指令,用于在同一程序内跳转程序到指定标签位置,并从指定标签位置开始继续向下执行程序;必须先插入标签指令 LABEL,再使用 GOTO 指令,对应机器人程序编写中的 GOTO 跳转语句 | | 请求参数 | index : int 目标标签的索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.12 LogiLabel 标签指令 [​](#4-12-3-12) | 方法名 | **logical.logi\_label**( index : int) -> StatusCodeEnum | | ---- | ----------------------------------------------------------- | | 描述 | 标签指令,用于定义程序中的跳转目标位置,GOTO 指令可跳转到该标签位置,对应机器人程序编写中的 LABEL 标签语句 | | 请求参数 | index : int 标签的索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.13 LogiSkipCondition 跳过条件指令 [​](#4-12-3-13) | 方法名 | **logical.logi\_skip\_condition**( param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\], index : int, param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\], operator : [BooleanOperator](./../3-struct/#3-32-8) \= [BooleanOperator](./../3-struct/#3-32-8).EQ) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 跳过条件指令,用于设置跳转条件,当满足条件时,从含有 SKIP 指令的当前行直接跳转到目标指令行或目标程序,对应机器人程序编写中的 SKIP CONDITION 跳转语句 | | 请求参数 | param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\] 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\] 第二个参数(寄存器、IO 信号或其他类型) value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6)\] 参数 2 的索引或值 operator : [BooleanOperator](./../3-struct/#3-32-8) 逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.14 LogiBreak 跳出循环指令 [​](#4-12-3-14) | 方法名 | **logical.logi\_break**() -> StatusCodeEnum | | ---- | ----------------------------------------------- | | 描述 | 跳出循环指令,用于跳出当前循环或 Switch 语句,对应机器人程序编写中的 BREAK 语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.3.15 LogiContinue 跳过循环指令 [​](#4-12-3-15) | 方法名 | **logical.logi\_continue**() -> StatusCodeEnum | | ---- | ---------------------------------------------------- | | 描述 | 跳过循环指令,用于跳过当前循环的剩余部分,进入下一次循环,对应机器人程序编写中的 CONTINUE 语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.4 BasStructure 结构指令子类 [​](#4-12-4) ### 4.12.4.1 Wait 等待条件指令 [​](#4-12-4-1) | 方法名 | **structure.wait**( param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\], index : int, param2 : Union\[[ValueType](./../3-struct/#3-32-14), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, [IOStatus](./../3-struct/#3-32-6)\], operator : [BooleanOperator](./../3-struct/#3-32-8) \= [BooleanOperator](./../3-struct/#3-32-8).EQ) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 等待条件指令,执行 WAIT 指令只有当条件满足时,程序才能继续向下执行,否则一直等待直到条件满足为止,对应机器人程序编写中的 WAIT COND 等待条件语句 | | 请求参数 | param1 : Union\[[RegisterType](./../3-struct/#3-32-4), [IOType](./../3-struct/#3-32-5)\] 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : Union\[[ValueType](./../3-struct/#3-32-14), [IOType](./../3-struct/#3-32-5), [OtherType](./../3-struct/#3-32-10)\] 第二个参数(寄存器、IO 信号或其他类型) value : Union\[int, float, [IOStatus](./../3-struct/#3-32-6)\] 参数 2 的索引或值 operator : [BooleanOperator](./../3-struct/#3-32-8) 逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.2 WaitTime 等待时间指令 [​](#4-12-4-2) | 方法名 | **structure.wait\_time**( param : [ValueType](./../3-struct/#3-32-14), value : Union\[int, float\]) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------- | | 描述 | 等待时间指令,执行 WAIT TIME 指令,机器人等待指定的时间后继续执行后续指令,对应机器人程序编写中的 WAIT TIME 等待时间语句 | | 请求参数 | param : [ValueType](./../3-struct/#3-32-14) 参数类型(R 寄存器或数值) value : Union \[int, float\] 时间值,单位:sec | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.3 Pause 暂停指令 [​](#4-12-4-3) | 方法名 | **structure.pause**() -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------ | | 描述 | 暂停指令,当执行到 Pause 指令后,暂停程序的执行,机器人立即规划减速轨迹并进行运动停止,程序状态进入暂停状态。如要继续执行,需要重新按启动键,对应机器人程序编写中的 PAUSE 暂停语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.4 Abort 中断指令 [​](#4-12-4-4) | 方法名 | **structure.abort**() -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------------- | | 描述 | 强制结束指令:结束程序执行,机器人伺服立刻刹车,并上抱闸,伺服母线断电。执行完强制结束指令后,程序进入终止状态,且光标停止在当前行,对应机器人程序编写中的 ABORT 终止语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.5 Call 同步调用程序指令 [​](#4-12-4-5) | 方法名 | **structure.call**( name : str) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------- | | 描述 | 同步调用程序指令,调用指定的程序并等待其执行完成后,再继续执行当前程序,支持调用预设 BAS 程序,对应机器人程序编写中的 CALL 同步调用程序 | | 请求参数 | name : str 程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.6 Run 异步调用程序指令 [​](#4-12-4-6) | 方法名 | **structure.run**( name : str) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------- | | 描述 | 异步调用程序指令,调用指定的程序并立即返回,继续执行当前程序,支持调用预设 BAS 程序,对应机器人程序编写中的 RUN 异步调用程序 | | 请求参数 | name : str 程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.7 Load 加载程序指令 [​](#4-12-4-7) | 方法名 | **structure.load**( name : str) -> StatusCodeEnum | | ---- | ------------------------------------------------- | | 描述 | 加载程序指令,将指定的程序加载到内存中,对应机器人程序编写中的 LOAD 载入程序 | | 请求参数 | name : str 程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.8 Unload 卸载程序指令 [​](#4-12-4-8) | 方法名 | **structure.unload**( name : str) -> StatusCodeEnum | | ---- | --------------------------------------------------- | | 描述 | 卸载程序指令,将指定的程序从内存中卸载,对应机器人程序编写中的 UNLOAD 卸载程序 | | 请求参数 | name : str 程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.4.9 Exec 执行程序指令 [​](#4-12-4-9) | 方法名 | **structure.exec**( name : str) -> StatusCodeEnum | | ---- | ------------------------------------------------- | | 描述 | 执行程序指令,执行指定的程序,对应机器人程序编写中的 EXEC 执行程序 | | 请求参数 | name : str 程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.5 BasSocket Socket 通信子类 [​](#4-12-5) ### 4.12.5.1 SocketOpen 打开 socket 连接指令 [​](#4-12-5-1) | 方法名 | **socket.socket\_open**( index : int) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------- | | 描述 | 使用 Socket Open 指令创建一个 Server 并等待 Client 连接,对应机器人程序编写中的 SOCKET OPEN 打开 socket 连接 | | 请求参数 | index : int SK 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.5.2 SocketClose 关闭 socket 连接指令 [​](#4-12-5-2) | 方法名 | **socket.socket\_close**( index : int) -> StatusCodeEnum | | ---- | -------------------------------------------------------- | | 描述 | 关闭指定的 socket 连接,对应机器人程序编写中的 SOCKET CLOSE 关闭 socket 连接 | | 请求参数 | index : int SK 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.5.3 SocketConnect 连接 socket 指令 [​](#4-12-5-3) | 方法名 | **socket.socket\_connect**( index : int) -> StatusCodeEnum | | ---- | -------------------------------------------------------------------------- | | 描述 | 使用 Socket Connect 指令连接到指定的 socket 服务器,对应机器人程序编写中的 SOCKET CONNECT 连接 socket | | 请求参数 | index : int SK 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.5.4 SocketSend 发送 socket 数据指令 [​](#4-12-5-4) | 方法名 | **socket.socket\_send**( index : int, msg\_type : [StrType](./../3-struct/#3-32-13), value : Union\[int, str\]) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 使用 Socket Send 指令向指定的 socket 连接发送数据,对应机器人程序编写中的 SOCKET SEND 发送数据 | | 请求参数 | index : int SK 寄存器序号 msg\_type : [StrType](./../3-struct/#3-32-13) 消息类型 value : Union \[int, str\] 消息内容或序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.5.5 SocketRecv 接收 socket 数据指令 [​](#4-12-5-5) | 方法名 | **socket.socket\_recv**( index : int, msg\_lenth : int, msg\_type : [StrType](./../3-struct/#3-32-13), value : Union\[int, str\]) -> StatusCodeEnum | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 使用 Socket Recv 指令从指定的 socket 连接读取字符,可以指定最大长度,对应机器人程序编写中的 SOCKET RECV 接收数据 | | 请求参数 | index : int SK 寄存器序号 msg\_lenth : int 消息最大长度 msg\_type : [StrType](./../3-struct/#3-32-13) 消息类型 value : Union \[int, str\] 消息内容或序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.6 BasModbus Modbus 通信子类 [​](#4-12-6) ### 4.12.6.1 ModbusReadMH 读取 Modbus 保持寄存器指令 [​](#4-12-6-1) | 方法名 | **modbus.modbus\_read\_MH**( index : int, id : int, address : int, length : int, r\_index : int) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 Modbus 保持寄存器指令,对应机器人程序编写中的 READ\_MH 读取 Modbus 保持寄存器 | | 请求参数 | index : int 通道序号 id : int Modbus ID address : int 寄存器起始地址 length : int 寄存器长度,即要读取的寄存器数量 r\_index : int 写入结果的 R 寄存器起始序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.6.2 ModbusReadMI 读取 Modbus 输入寄存器指令 [​](#4-12-6-2) | 方法名 | **modbus.modbus\_read\_MI**( index : int, id : int, address : int, length : int, r\_index : int) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 Modbus 输入寄存器指令,对应机器人程序编写中的 READ\_MI 读取 Modbus 输入寄存器 | | 请求参数 | index : int 通道序号 id : int Modbus ID address : int 寄存器起始地址 length : int 寄存器长度,即要读取的寄存器数量 r\_index : int 写入结果的 R 寄存器起始序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.6.3 ModbusWriteMH 写入 Modbus 保持寄存器指令 [​](#4-12-6-3) | 方法名 | **modbus.modbus\_write\_MH**( index : int, id : int, address : int, length : int, value\_type : [ValueType](./../3-struct/#3-32-14), value : int) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入 Modbus 保持寄存器指令,对应机器人程序编写中的 WRITE\_MH 写入 Modbus 保持寄存器 | | 请求参数 | index : int 通道序号 id : int Modbus ID address : int 寄存器起始地址 length : int 寄存器长度,即要写入的寄存器数量 value\_type : [ValueType](./../3-struct/#3-32-14) 值类型 value : int 值或 R 寄存器起始索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.7 BasVision 视觉指令子类 [​](#4-12-7) ### 4.12.7.1 VisionFind 寻找视觉程序指令 [​](#4-12-7-1) | 方法名 | **vision.vision\_find**( name : str) -> StatusCodeEnum | | ---- | ------------------------------------------------------ | | 描述 | 执行视觉寻找程序,对应机器人程序编写中的 VISION FIND 寻找视觉程序 | | 请求参数 | name : str 视觉程序名称 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.7.2 VisionGetOffset 获取视觉程序偏移量指令 [​](#4-12-7-2) | 方法名 | **vision.vision\_get\_offset**( name : str, index : int, label\_index : int) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------------------------- | | 描述 | 获取视觉程序执行后的偏移量,对应机器人程序编写中的 VISION GET OFFSET 获取视觉程序偏移量 | | 请求参数 | name : str 视觉程序名称 index : int 视觉寄存器索引 label\_index : int 标签索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.7.3 VisionGetQuantity 获取视觉程序结果指令 [​](#4-12-7-3) | 方法名 | **vision.vision\_get\_quantity**( name : str, index : int) -> StatusCodeEnum | | ---- | ---------------------------------------------------------------------------- | | 描述 | 获取视觉程序执行后的结果数量,对应机器人程序编写中的 VISION GET QUANTITY 获取视觉程序结果 | | 请求参数 | name : str 视觉程序名称 index : int 结果存储的 R 寄存器索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.8 直接方法 [​](#4-12-8) ### 4.12.8.1 SetParam 设置参数指令 [​](#4-12-8-1) | 方法名 | **bas\_script.set\_param**( type : [ParamType](./../3-struct/#3-32-15), value\_type : [ValueType](./../3-struct/#3-32-14), value : Union\[int, float\]) -> StatusCodeEnum | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置参数指令,用于设置机器人的各种参数,对应机器人程序编写中的 SET PARAM 设置参数 | | 请求参数 | type : [ParamType](./../3-struct/#3-32-15) 参数类型 value\_type : [ValueType](./../3-struct/#3-32-14) 值类型 value : Union \[int, float\] 值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ### 4.12.8.2 AssignValue 赋值指令 [​](#4-12-8-2) | 方法名 | **bas\_script.assign\_value**( param1 : [AssignType](./../3-struct/#3-32-9), index : int, param2 : Union\[[AssignType](./../3-struct/#3-32-9), [OtherType](./../3-struct/#3-32-10)\], value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6), [CurrentPose](./../3-struct/#3-32-11)\], opt\_index : int = 0, opt\_value \= 0) -> StatusCodeEnum | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 赋值指令,用于给寄存器、IO 信号等赋值,对应机器人程序编写中的 ASSIGN 赋值语句 | | 请求参数 | param1 : [AssignType](./../3-struct/#3-32-9) 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : Union\[[AssignType](./../3-struct/#3-32-9), [OtherType](./../3-struct/#3-32-10)\] 第二个参数(寄存器、IO 信号或其他类型) value : Union\[int, float, str, [IOStatus](./../3-struct/#3-32-6), [CurrentPose](./../3-struct/#3-32-11)\] 参数 2 的索引或值 opt\_index : int 参数 1 为 PR\_ELEMENT 时的额外索引 opt\_value : int 参数 2 为 PR\_ELEMENT 时的额外索引或 value 为[ IOStatus](./../3-struct/#3-32-6).PULSE 时的脉冲值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | --- url: /zh/1-python/4-methods/4.13-jogging.html title: 4.13 机器人示教运动 --- # 4.13 机器人示教运动 [​](#4-13) ## 概述 [​](#概述) Jogging 模块提供机器人在示教模式下的点动控制接口,支持单轴步进、连续点动、多轴联动及紧急停止等操作。 ### 核心功能 [​](#核心功能) * 支持机器人单轴步进示教运动 * 支持机器人连续点动示教运动 * 支持机器人多轴连续示教运动 * 支持紧急停止机器人连续运动 * 支持设置步进长度和旋转步进角度 * 支持在不同坐标系下进行点动控制 ### 使用场景 [​](#使用场景) * 机器人调试和示教过程 * 位置微调场景 * 上位机远程手动调姿 * 机器人安装和校准 * 复杂轨迹的精确调整 ## 4.13.1 单轴步进示教运动 [​](#4-13-1) | 方法名 | **jogging.step\_move**( aj\_num : int, step\_length : float = 0, step\_angle : float = 0) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 根据设定的步进量进行单轴步进示教运动 | | 请求参数 | aj\_num : int 轴编号 (1\~6 对应当前坐标系各轴;笛卡尔坐标系下 x/y/z/rx/ry/rz 对应 1\~6;数值正负表示运动方向)。 step\_length : float 单次直线步进长度 (单位 mm;不传则不修改当前步进量)。 step\_angle : float 单次旋转步进角度 (单位 °;不传则不修改当前旋转步进量)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 jogging/step\_move.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 示教运动功能-步进关节点动运动使用示例 / Teaching motion function - Joint step motion usage example """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 仅支持手动模式下进行jogging # [EN] Only manual mode is supported for jogging # [ZH] 点动关节坐标系下的关节1 # [EN] Jog joint 1 under the joint coordinate system ret = arm.jogging.step_move(1, 2, 2) if ret == StatusCodeEnum.OK: print("点动运动开始成功 / Jogging movement started successfully") else: print(f"点动运动开始失败,错误代码 / Jogging movement start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.13.2 单轴连续点动示教运动 [​](#4-13-2) | 方法名 | **jogging.continuous\_move**( aj\_num : int) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------- | | 描述 | 控制机器人进行单轴连续点动示教运动 | | 请求参数 | aj\_num : int 轴编号 (1\~6 对应当前坐标系各轴;笛卡尔坐标系下 x/y/z/rx/ry/rz 对应 1\~6;数值正负表示运动方向)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 jogging/continuous\_move.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 示教运动功能-单关节点动运动使用示例 / Example of Teaching motion function - Single-joint motion usage """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 仅支持手动模式下进行jogging # [EN] Only manual mode is supported for jogging # [ZH] 点动关节坐标系下的关节1 # [EN] Jog joint 1 under the joint coordinate system ret = arm.jogging.continuous_move(1) if ret == StatusCodeEnum.OK: print("点动运动开始成功 / Jogging movement started successfully") else: print(f"点动运动开始失败,错误代码 / Jogging movement start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 运动3s # [EN] Move for 3 seconds time.sleep(3) # [ZH] 停止 # [EN] Stop arm.jogging.stop() # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.13.3 多轴连续示教运动 [​](#4-13-3) | 方法名 | **jogging.multi\_move**( aj\_num : List\[int\]) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------ | | 描述 | 控制机器人进行多轴连续示教运动 | | 请求参数 | aj\_num : List \[int\] 轴编号列表 (1\~6 对应当前坐标系各轴;笛卡尔坐标系下 x/y/z/rx/ry/rz 对应 1\~6;数值正负表示各轴运动方向)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 jogging/multi\_move.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 示教运动功能-多关节点动运动使用示例 / / Teaching motion function - Multi-joint motion usage example """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 仅支持手动模式下进行jogging # [EN] Only manual mode is supported for jogging # [ZH] 点动关节坐标系下的关节1,2,3 # [EN] Jog joint 1,2,3 under the joint coordinate system ret = arm.jogging.multi_move([1, 2, 3]) if ret == StatusCodeEnum.OK: print("点动运动开始成功 / Jogging movement started successfully") else: print(f"点动运动开始失败,错误代码 / Jogging movement start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 运动3s # [EN] Move for 3 seconds time.sleep(3) # [ZH] 停止 # [EN] Stop arm.jogging.stop() # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.13.4 停止机器人连续运动 [​](#4-13-4) | 方法名 | **jogging.stop**() | | ---------- | ---------------------------------------------- | | 描述 | 终止机器人示教点动(JOG)运动 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/1-python/4-methods/4.14-subpub.html title: 4.14 机器人订阅发布接口 --- # 4.14 机器人订阅发布接口 [​](#4-14) ## 概述 [​](#概述) SubPub 模块提供机器人控制器 WebSocket 订阅 / 发布通道的管理能力,负责建立连接、订阅机器人状态 / 寄存器 / IO 等主题,并通过回调或阻塞接口接收实时数据。 ### 核心功能 [​](#核心功能) * 支持连接和断开 WebSocket 服务器 * 支持订阅机器人状态数据 * 支持订阅寄存器数据 * 支持订阅 IO 信号数据 * 支持通过回调函数接收消息 * 支持阻塞式接收下一条消息 * 支持设置订阅频率 * 支持处理接收消息的错误 ### 使用场景 [​](#使用场景) * 上位机实时监听机器人运行状态 * 实现机器人数据可视化 * 与外部系统实现数据联动 * 实时监控寄存器和 IO 状态 * 构建机器人监控和控制系统 * 实现机器人状态的实时报警和通知 ## 4.14.1 连接到 WebSocket 服务器 [​](#4-14-1) | 方法名 | **sub\_pub.connect**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 连接到机器人控制器的 WebSocket 服务器 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):连接状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.2 断开 WebSocket 连接 [​](#4-14-2) | 方法名 | **sub\_pub.disconnect**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 断开与机器人控制器 WebSocket 服务器的连接 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):断开状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.3 添加机器人状态订阅 [​](#4-14-3) | 方法名 | **sub\_pub.subscribe\_status**( topics : List\[[RobotTopicType](./../3-struct/#3-31-1)\], frequency : int = 200) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加机器人状态数据订阅 | | 请求参数 | topics : List\[[RobotTopicType](./../3-struct/#3-31-1)\] 机器人主题类型列表 frequency : int 订阅频率 (单位 Hz,默认 200) | | 返回值 | StatusCodeEnum:订阅状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.4 添加寄存器订阅 [​](#4-14-4) | 方法名 | **sub\_pub.subscribe\_register**( reg\_type : [RegTopicType](./../3-struct/#3-31-2), reg\_ids : List\[int\], frequency : int = 200) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加寄存器数据订阅 | | 请求参数 | reg\_type : [RegTopicType](./../3-struct/#3-31-2) 寄存器类型 reg\_ids : List \[int\] 寄存器 ID 列表 frequency : int 订阅频率 (单位 Hz,默认 200) | | 返回值 | StatusCodeEnum:订阅状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.5 添加 IO 订阅 [​](#4-14-5) | 方法名 | **sub\_pub.subscribe\_io**( io\_list : List\[tuple\[[IOTopicType](./../3-struct/#3-31-3), int\]\], frequency : int = 200) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 订阅 IO 信号数据,包括数字输入 / 输出等 | | 请求参数 | io\_list : List\[tuple\[[IOTopicType](./../3-struct/#3-31-3), int\]\] IO 列表 (每个元素为 (IO 类型, IO ID) ) frequency : int 订阅频率 (单位 Hz,默认 200) | | 返回值 | StatusCodeEnum:订阅状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.6 开始接收消息 [​](#4-14-6) | 方法名 | **sub\_pub.start\_receiving**( on\_message\_received : Callable\[\[Dict\[str, Any\]\], None\]) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | 描述 | 开始接收订阅消息,并通过回调函数处理接收到的数据 | | 请求参数 | on\_message\_received : Callable \[\[Dict \[str, Any\]\], None\] 消息接收回调函数 | | 返回值 | StatusCodeEnum:接收状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.7 处理接收消息错误 [​](#4-14-7) | 方法名 | **sub\_pub.handle\_receive\_error**() -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 处理接收订阅消息的错误,当接收消息回调函数抛出异常时跳出循环 | | 请求参数 | 无 | | 返回值 | StatusCodeEnum:接收状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.8 接收下一条消息 [​](#4-14-8) | 方法名 | **sub\_pub.receive**() -> tuple\[Dict\[str, Any\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 接收下一条消息并返回 | | 请求参数 | 无 | | 返回值 | tuple \[Dict \[str, Any\], StatusCodeEnum\]:接收到的消息字典和状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | 示例代码 sub\_pub.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: SubPub使用示例 / SubPub usage example """ import asyncio import logging from Agilebot import Arm, IOTopicType, RegTopicType, RobotTopicType, StatusCodeEnum # 配置日志 / Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def message_handler(message): """ 消息处理函数 / Message handler function :param message: 接收到的消息字典 / Received message dictionary """ logger.info(f"收到消息 / Received message: {message}") async def main(): """ 主函数,演示SubPub的使用 / Main function demonstrating SubPub usage """ # 创建Arm实例 / Create Arm instance arm = Arm() # 连接到控制器 / Connect to controller ret = arm.connect("10.27.1.254") if ret != StatusCodeEnum.OK: logger.error(f"连接失败 / Connection failed: {ret}") return logger.info("Arm连接成功 / Arm connected successfully") try: # 连接WebSocket / Connect WebSocket ret = await arm.sub_pub.connect() if ret != StatusCodeEnum.OK: logger.error(f"WebSocket连接失败 / WebSocket connection failed: {ret}") return logger.info("WebSocket连接成功 / WebSocket connected successfully") # 订阅机器人状态 / Subscribe to robot status topic_types = [ RobotTopicType.JOINT_POSITION, RobotTopicType.CARTESIAN_POSITION, RobotTopicType.ROBOT_STATUS, RobotTopicType.CTRL_STATUS, RobotTopicType.SERVO_STATUS, RobotTopicType.INTERPRETER_STATUS, RobotTopicType.TRAJECTORY_RECORD, RobotTopicType.USER_OP_MODE, RobotTopicType.USER_FRAME, RobotTopicType.TOOL_FRAME, RobotTopicType.VELOCITY_RATIO, RobotTopicType.TRAJECTORY_RECORD, ] ret = await arm.sub_pub.subscribe_status(topic_types, frequency=200) if ret != StatusCodeEnum.OK: logger.error(f"订阅机器人状态失败 / Failed to subscribe to robot status: {ret}") return logger.info("机器人状态订阅成功 / Robot status subscription successful") # 订阅寄存器 / Subscribe to registers ret = await arm.sub_pub.subscribe_register(RegTopicType.R, [1, 2, 3], frequency=200) if ret != StatusCodeEnum.OK: logger.error(f"订阅寄存器失败 / Failed to subscribe to registers: {ret}") return logger.info("寄存器订阅成功 / Register subscription successful") # 订阅IO信号 / Subscribe to IO signals io_list = [(IOTopicType.DI, 1), (IOTopicType.DO, 1)] ret = await arm.sub_pub.subscribe_io(io_list, frequency=200) if ret != StatusCodeEnum.OK: logger.error(f"订阅IO失败 / Failed to subscribe to IO: {ret}") return logger.info("IO订阅成功 / IO subscription successful") # 单次接收消息示例 / Single message receive example logger.info("尝试单次接收消息 / Attempting single message receive") try: # 设置超时 / Set timeout message, ret = await asyncio.wait_for(arm.sub_pub.receive(), timeout=5.0) if ret == StatusCodeEnum.OK: logger.info(f"单次接收消息成功 / Single message receive successful: {message}") else: logger.error(f"单次接收消息失败 / Single message receive failed: {ret}") except asyncio.TimeoutError: logger.warning("接收消息超时 / Message receive timeout") # 启动消息接收 / Start message receiving ret = await arm.sub_pub.start_receiving(message_handler) if ret != StatusCodeEnum.OK: logger.error(f"启动消息接收失败 / Failed to start message receiving: {ret}") return logger.info("开始接收消息 / Started receiving messages") # 运行一段时间 / Run for a while logger.info("运行10秒钟... / Running for 10 seconds...") await asyncio.sleep(10) except Exception as e: logger.error(f"运行过程中发生错误 / Error occurred during execution: {str(e)}") finally: # 断开连接 / Disconnect await arm.sub_pub.disconnect() arm.disconnect() logger.info("连接已断开 / Connection disconnected") if __name__ == "__main__": # 运行异步主函数 / Run async main function asyncio.run(main()) ``` --- url: /zh/1-python/4-methods/4.15-extension.html title: 4.15 插件管理 --- # 4.15 插件管理 [​](#4-15) ## 概述 [​](#概述) Extension 模块用于管理机器人控制器上的第三方插件,提供获取控制器 IP、查询 / 查看插件列表、切换启用状态以及调用插件服务等能力。 ### 核心功能 [​](#核心功能) * 支持获取机器人 IP 地址 * 支持获取插件列表 * 支持获取单个插件详情 * 支持切换插件启用 / 禁用状态 * 支持删除插件 * 支持调用插件服务命令 * 支持安装插件包 * 支持安装 wheel 包 * 支持统一管理插件生命周期 ### 使用场景 [​](#使用场景) * 在上位机侧管理机器人控制器上的第三方插件 * 扩展机器人功能,调用插件提供的服务 * 监控和控制插件的启用状态 * 在插件或示教器环境中连接机器人控制器 * 实现机器人与第三方系统的集成 ## 4.15.1 获取机器人 IP 地址 [​](#4-15-1) | 方法名 | **extension.get\_robot\_ip**() -> str | | ---------- | ---------------------------------------------- | | 描述 | 根据 SDK 运行环境返回相应的机器人 IP 地址 | | 请求参数 | 无 | | 返回值 | str:IP 地址(可能返回 None) | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | **获取 IP 的逻辑说明:** 该方法会根据 SDK 运行的环境自动判断并返回相应的 IP 地址: 1. **工业示教器环境** :返回控制器的 IP 地址 2. **协作 AP 板环境** : * 如果使用 DHCP 模式:返回路由器的 IP 地址(默认网关) * 如果使用静态 IP 模式:返回配置的静态 IP 地址 3. **云端环境** 返回云端的内部 IP 地址 4. **其他环境**:返回 `None` :::tip 提示 * 该方法主要用于插件环境中,需要连接到机器人控制器的场景 ::: 示例代码 extension/connect\_operation.py ```py """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 插件系统连接机器人示例 本示例展示如何在插件系统中连接机器人。插件系统会自动识别运行环境: - 在插件环境中运行时:自动获取机器人IP地址,无需手动配置 - 在本地开发环境中运行时:使用下方的 local_robot_ip 和 local_ap_ip 配置 Example of extension connection: This example demonstrates how to connect to the robot in the extension system. The extension system automatically identifies the running environment: - In extension environment: Automatically obtains the robot IP address - In local development environment: Uses the local_robot_ip and local_ap_ip configuration below """ from Agilebot import Arm, Extension, StatusCodeEnum extension = Extension() # ========== 本地开发配置 / Local Development Configuration ========== # 以下配置仅在本地开发环境中生效,插件环境会自动获取IP # The following configuration only takes effect in local development environment local_robot_ip = "10.27.1.254" # 机器人控制器IP / Robot controller IP (modify to 192.168.110.2 for industrial robot) local_ap_ip = "10.27.1.254" # 示教器或AP IP(工业机器人改为 192.168.110.102 或 None)/ Teach pendant IP or AP IP (modify to 192.168.110.102 or None for industrial robot) # ========== 自动识别运行环境 / Automatically Identify Running Environment ========== robot_ip = extension.get_robot_ip() if robot_ip is None: # 本地开发环境:使用上方配置的IP / Local development: use configured IP above print("本地开发环境 / Local development environment") robot_ip = local_robot_ip ap_ip = local_ap_ip else: # 插件环境:自动获取机器人IP / Extension environment: auto-obtain robot IP print(f"插件环境,自动获取到机器人IP / Extension environment, auto-obtained robot IP: {robot_ip}") ap_ip = "127.0.0.1" print(f"robot_ip: {robot_ip}") print(f"ap_ip: {ap_ip}") arm = Arm() ret = arm.connect(arm_controller_ip=robot_ip, teach_panel_ip=ap_ip) if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ``` ## 4.15.2 获取插件列表 [​](#4-15-2) | 方法名 | **extension.get\_list**() → tuple\[list\[ExtensionInfo\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------- | | 描述 | 获取机器人上已安装的全部插件信息 | | 请求参数 | 无 | | 返回值 | list\[ExtensionInfo\] :插件信息列表。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.3 获取插件详情 [​](#4-15-3) | 方法名 | **extension.get**( name : str) → tuple\[ExtensionInfo, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------- | | 描述 | 根据插件名称查询单个插件详情 | | 请求参数 | name :插件名称。 | | 返回值 | ExtensionInfo :插件详细信息。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.4 切换插件启用状态 [​](#4-15-4) | 方法名 | **extension.toggle**( name : str) → StatusCodeEnum | | ---------- | -------------------------------------------------- | | 描述 | 切换指定插件的启用 / 禁用状态。 | | 请求参数 | name :插件名称。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.5 调用简单服务插件命令 [​](#4-15-5) | 方法名 | **extension.call\_service**( name : str, command : str, params : dict = None) → tuple\[Any, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------ | | 描述 | 调用指定插件的简单服务命令并返回执行结果 | | 请求参数 | name :插件名称。 command :插件命令名称。 params :命令参数 (可选,默认为 None)。 | | 返回值 | Any :插件命令执行结果。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | 示例代码 extension/extension\_operation.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 插件使用示例 / Example of extension usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connection successful") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = arm.extension.get("MathService") if ret == StatusCodeEnum.OK: print("获取插件信息成功 / Get extension information successfully") print(f"插件信息 / Extension information: {res}") else: print(f"获取插件信息失败,错误代码 / Get extension information failed, error code: {ret.errmsg}") ret = arm.extension.toggle("MathService") if ret == StatusCodeEnum.OK: print("切换插件状态成功 / Toggle extension status successfully") else: print(f"切换插件状态失败,错误代码 / Toggle extension status failed, error code: {ret.errmsg}") ret = arm.extension.delete("MathService") if ret == StatusCodeEnum.OK: print("删除插件成功 / Delete extension successfully") else: print(f"删除插件失败,错误代码 / Delete extension failed, error code: {ret.errmsg}") res, ret = arm.extension.call_service("MathService", "add", dict([["a", 1], ["b", 2]])) if ret == StatusCodeEnum.OK: print("调用插件服务成功 / Call extension service successfully") print(f"调用插件服务结果 / Call extension service result: {res}") else: print(f"调用插件服务失败,错误代码 / Call extension service failed, error code: {ret.errmsg}") ``` ## 4.15.6 删除插件 [​](#4-15-6) | 方法名 | **extension.delete**( name : str) → StatusCodeEnum | | ---------- | -------------------------------------------------- | | 描述 | 删除指定插件 | | 请求参数 | name :插件名称。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.7 安装插件包 [​](#4-15-7) | 方法名 | **extension.install\_extension**( path : str) → tuple\[ExtensionInfo, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 上传并安装插件包,返回插件基础信息 | | 请求参数 | path :插件包文件路径。 | | 返回值 | ExtensionInfo :安装后的插件信息。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.8 安装 wheel 包 [​](#4-15-8) | 方法名 | **extension.install\_wheel**( path : str) → tuple\[bool, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------- | | 描述 | 上传并安装 Python wheel 包 | | 请求参数 | path :wheel 包文件路径。 | | 返回值 | bool :安装结果。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | 示例代码 extension/install\_operation.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 插件安装示例 / Example of extension installation """ from pathlib import Path from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot local_robot_ip = "10.27.1.254" # 机器人控制器IP / Robot controller IP local_ap_ip = "10.27.1.254" # 示教器或AP IP / Teach pendant IP or AP IP ret = arm.connect(arm_controller_ip=local_robot_ip, teach_panel_ip=local_ap_ip) if ret != StatusCodeEnum.OK: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) current_path = Path(__file__).resolve() example_dir = current_path.parent / "files" extension_package_path = example_dir / "HelloAgilebot.gbtapp" wheel_package_path = example_dir / "six-1.17.0-py2.py3-none-any.whl" # [ZH] 安装插件包 # [EN] Install the extension package if extension_package_path.is_file(): ext_info, install_ret = arm.extension.install_extension(str(extension_package_path)) if install_ret == StatusCodeEnum.OK: print("插件安装成功 / Install extension successfully") print(f"插件信息 / Extension information: {ext_info}") else: print(f"插件安装失败,错误代码 / Install extension failed, error code: {install_ret.errmsg}") arm.disconnect() exit(1) else: print(f"插件包文件不存在 / Extension package not found: {extension_package_path}") arm.disconnect() exit(1) # [ZH] 安装 wheel 包 # [EN] Install the wheel package if wheel_package_path.is_file(): wheel_ok, install_ret = arm.extension.install_wheel(str(wheel_package_path)) if install_ret == StatusCodeEnum.OK and wheel_ok: print("wheel 安装成功 / Wheel package installed successfully") else: print(f"wheel 安装失败,错误代码 / Wheel installation failed, error code: {install_ret.errmsg}") arm.disconnect() exit(1) else: print(f"wheel 包文件不存在 / Wheel package not found: {wheel_package_path}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() ``` --- --- url: /zh/1-python/4-methods/4.16-nlu_control.html title: 4.16 自然语言控制 --- # 4.16 自然语言控制 [​](#4-16) ## 概述 [​](#概述) NLUControl 模块提供了通过自然语言指令控制机器人的功能,支持将日常语言转换为可执行代码并在安全检查后执行。 ### 核心功能 [​](#核心功能) * 支持通过自然语言指令控制机器人 * 支持将自然语言翻译为可执行代码 * 提供代码审批机制,确保安全执行 * 支持多步骤指令(顺序执行、条件判断等) * 提供代码审查和打印功能 * 自动捕获和处理代码执行异常 ### 使用场景 [​](#使用场景) * 通过自然语言快速控制机器人执行简单任务 * 实现复杂多步骤任务的自然语言描述和执行 * 在开发和调试过程中快速验证机器人功能 * 降低机器人编程门槛,支持非专业人员操作 * 实现机器人与人类的自然语言交互 ## 类构造函数 [​](#类构造函数) | 方法名 | **NLUControl**( controller\_ip : str) | | ---------- | ---------------------------------------------- | | 描述 | 自然语言控制类,通过自然语言控制机器人运动。通常通过 arm.nlu 访问,无需手动实例化。 | | 请求参数 | controller\_ip : str 控制柜 IP 地址 | | 返回值 | 无返回值 | | 备注 | 该类会在 Arm 类实例化时自动创建,用户直接通过 arm.nlu 访问即可。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.16.1 执行自然语言指令 [​](#4-16-1) | 方法名 | **execute**( natural\_language : str) -> tuple\[NLUGeneratedCode, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 通过自然语言指令控制机器人,系统会将自然语言翻译为可执行代码并返回。 | | 请求参数 | natural\_language : str 自然语言指令 (例如 "机器人移动到零点,并获取当前位置";支持多步骤指令,如顺序执行、条件判断等)。 | | 返回值 | NLUGeneratedCode: 生成的代码对象,包含可执行代码和审批状态[StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | \- 返回的 NLUGeneratedCode 对象包含 needs\_approval 属性,指示是否需要用户审批\- 如果 needs\_approval=True , 必须先调用 approve() 方法批准后才能执行\- 可以通过 result.code 查看生成的代码内容 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## NLUGeneratedCode 类 [​](#nlugeneratedcode-类) ### 说明 [​](#说明) NLUGeneratedCode 类用于封装、管理和安全执行由 NLU 服务生成的 Python 代码片段。该类提供了代码审批和执行的安全机制,确保需要审批的代码必须经过明确批准才能执行。 ### 属性 [​](#属性) | 属性名 | 类型 | 描述 | | --------------- | ---- | --------------------- | | needs\_approval | bool | 是否需要审批才能执行,根据代码危险等级确定 | | code | str | 生成的可执行 Python 代码字符串 | ### 4.16.2 批准代码执行 [​](#4-16-2) | 方法名 | **approve**() | | ---------- | -------------------------------------------------------------------- | | 描述 | 批准代码执行。调用此方法后,代码将被标记为已审批,可以通过 execute\_code() 方法执行。 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | \- 仅当 needs\_approval=True 时需要调用此方法\- 未调用 approve() 直接执行需要审批的代码会返回错误 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ### 4.16.3 执行生成的代码 [​](#4-16-3) | 方法名 | **execute\_code**() -> tuple\[Any, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------- | | 描述 | 执行 NLU 生成的代码。如果代码需要审批且尚未批准,则返回错误。 | | 请求参数 | 无参数 | | 返回值 | Any: 代码执行结果,类型取决于生成的代码[StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | \- 如果 needs\_approval=True 但未调用 approve() , 会返回 NLU\_APPROVAL\_REQUIRED 错误\- 代码执行过程中的任何异常都会被捕获并返回相应的错误状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ### 4.16.4 打印生成的代码 [​](#4-16-4) | 方法名 | **print\_code**() | | ---------- | ---------------------------------------------- | | 描述 | 打印生成的代码,便于用户审查。输出格式包含语法高亮。 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | 建议在需要审批时先调用此方法查看代码内容,再决定是否批准执行 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 使用示例 [​](#使用示例) ### 示例 1: 基础查询操作 [​](#示例1-基础查询操作) nlu\_control/get\_controller\_version.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 自然语言基础控制与安全评级示例 / NLU Basic Control with Safety Rating Example """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 示例:使用自然语言获取控制器版本信息 # [EN] Example: Use natural language to get controller version information result, ret = arm.nlu.execute("获取控制器版本信息") if ret == StatusCodeEnum.OK: print("自然语言指令执行成功 / Natural language command executed successfully") danger_level = getattr(result, "danger_level", "unknown") warnings = getattr(result, "warnings", []) result.print_code() print(f"安全评级 / Danger level: {danger_level}") if warnings: print("安全提示 / Safety warnings:") for idx, warning in enumerate(warnings, 1): print(f" {idx}. {warning}") if result.needs_approval: print("\n" + "=" * 50) print("警告:需要用户确认 / Warning: User Approval Required") print("=" * 50) print("\n请确认是否执行此代码 / Please confirm if you want to execute this code:") user_input = input("\n(yes/no): ").strip().lower() if user_input not in ["yes", "y"]: print("用户拒绝执行代码 / User rejected code execution") arm.disconnect() exit(1) else: result.approve() exec_result, ret = result.execute_code() if ret == StatusCodeEnum.OK: print(f"执行结果 / Execution result: {exec_result}") else: print(f"代码执行失败 / Code execution failed: {ret.errmsg}") else: print(f"自然语言指令执行失败 / Natural language command failed: {ret.errmsg}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("\n机器人断开连接成功 / Robot disconnected successfully") ``` ### 示例 2: 顺序执行多个任务 [​](#示例2-顺序执行多个任务) nlu\_control/serial\_execution.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 自然语言顺序执行与安全评级示例 / NLU Sequential Execution with Safety Rating Example """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 示例:使用自然语言让机器人按顺序执行任务 # [EN] Example: Use natural language to instruct the robot to execute tasks sequentially result, ret = arm.nlu.execute( """ 按顺序执行: 1. 清除报警; 2. 控制机械臂所有关节运动至零点位置; 3. 启动程序 'Put_into_box',等待下发完成,并等待其执行结束; 4. 获取当前位姿。 """ ) if ret == StatusCodeEnum.OK: print("自然语言指令执行成功 / Natural language command executed successfully") danger_level = getattr(result, "danger_level", "unknown") warnings = getattr(result, "warnings", []) result.print_code() print(f"安全评级 / Danger level: {danger_level}") if warnings: print("安全提示 / Safety warnings:") for idx, warning in enumerate(warnings, 1): print(f" {idx}. {warning}") if result.needs_approval: print("\n" + "=" * 50) print("警告:需要用户确认 / Warning: User Approval Required") print("=" * 50) print("\n请确认是否执行此代码 / Please confirm if you want to execute this code:") user_input = input("\n(yes/no): ").strip().lower() if user_input not in ["yes", "y"]: print("用户拒绝执行代码 / User rejected code execution") arm.disconnect() exit(1) else: result.approve() exec_result, ret = result.execute_code() if ret == StatusCodeEnum.OK: print(f"执行结果 / Execution result: {exec_result}") else: print(f"代码执行失败 / Code execution failed: {ret.errmsg}") else: print(f"自然语言指令执行失败 / Natural language command failed: {ret.errmsg}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("\n机器人断开连接成功 / Robot disconnected successfully") ``` --- url: /zh/1-python/Agilebot_Robot_Python_SDK_ChangeLog.html title: 捷勃特机器人 Python SDK 更新说明 --- # 捷勃特机器人 Python SDK 更新说明 [​](#捷勃特机器人-python-sdk-更新说明) ## 2.0.1.0 更新(2026/1/26) [​](#2010更新2026126) 1. 更改底层通信方式 2. 添加本地 proxy 服务支持 3. `Jogging` 类下添加 `step_move` 和 `continuous_move` 接口 4. 添加插件相关接口 5. 添加获取最严重报警 `get_top_alarm` 接口 6. `BasScript` 类下添加 `JUMP` 相关指令 7. 添加轨迹复现相关接口 8. 优化坐标系信息类 9. 修改负载信息类 10. 获取所有报警 `get_all_active_alarms` 接口支持语言设置 11. `get_version` 接口改为 `get_controller_version` 接口 12. `is_connect` 接口改为 `is_connected` 接口 13. 添加获取机械臂的操作模式 `get_op_mode` 接口 14. 添加订阅类 `SubPub` ,用于订阅机器人状态、寄存器信息和 IO 信息 15. 坐标系类 `CoordinateSystem` 添加计算 `TF` / `UF` 的接口 16. 坐标系类 `CoordinateSystem` 下添加 `TF` 和 `UF` 两个子类 17. 插件管理类添加插件相关接口 18. 轨迹类 `Trajectory` 添加轨迹复现相关接口 19. 优化 python 依赖项,支持 python 版本 3.8 及以上 20. 修复 `BasScript` 类下 `load` 、 `unload` 、 `exec` 相关指令的错误 ## 1.7.1.3 更新(2025/7/3) [​](#1713更新202573) 1. 修复 `get_all_active_alarms` 接口可能发生错误的问题 2. 修复 `move_circle` 内部参数设置错误 3. 修改示例程序 4. 添加插件管理类,提供 `extension.get_robot_ip` 接口 5. 添加轨迹复现相关接口 ## 1.7.0.0 更新(2025/5/30) [​](#1700更新2025530) 1. 寄存器改动 1. 寄存器全部放在 `Registers` 类下,其他 `Registers` 后续废除 2. 接口名改为 `read_R` 、 `write_R` 、 `delete_R` 类似 3. 删除 `add` 方法,使用 `write_XX` 即可 4. 读取和写入寄存器 RPC 接口改为新的仅读取值的 RPC,提升速度 5. `read_R` 、 `read_MR` 、 `read_SR` 直接返回对应的值和执行结果 2. `arm` 类下接口改动 1. `get_arm_model_info` 、 `get_ctrl_status` 、 `get_robot_status` 、 `get_servo_status` 、 `get_soft_mode` 、 `get_version` 接口改为返回 ' 结果 + 执行状态' 2. `servo_on` 、 `servo_off` 、 `servo_reset` 接口移到 `arm` 下, `execution` 下后续废除 3. `motion` 类改动 1. payload 相关操作接口移到 `motion.payload` 下 2. 新增负载测定相关接口 3. 新增 `get_OVC` 、 `set_OVC` 、 `get_OAC` 、 `set_OAC` 、 `get_TF` 、 `set_TF` 、 `get_UF` 、 `set_UF` 、 `get_TCS` 、 `set_TCS` 接口 4. `convert_cart_to_joint_simple` 接口新增 uf\_index 和 tf\_index 设置 5. 新增 `move_joint` 、 `move_line` 、 `move_circle` 接口 6. 新增 `convert_joint_to_cart` 、 `convert_cart_to_joint` 接口 7. 新增 `enter_position_control` 、 `exit_position_control` 、 `set_udp_feedback_params` 接口 4. `digital_signals` 类改为 `signals` 类,简化名称 5. `execution` 类添加 `execute_bas_script` 接口用于执行脚本 6. `jogging.move` 接口添加步进值修改 `move(*self*, *aj_num*: *int*, *move_mode*: MoveMode = None, *step_length*: *float* = 0)` 7. 新增 `bas_script` 类用于生成脚本 8. 新增 `modbus` 类用于直接控制 modbus 设备 --- url: /zh/2-csharp/0-prologue/0.1-version.html title: 版本记录 --- # 版本记录 [​](#版本记录) | 文档版本 | SDK 版本号 | 版本时间 | | ---- | -------- | ---------- | | V3.3 | 2.1.0.\* | 2026.04.13 | [更新说明](./../Agilebot%5FRobot%5FCSharp%5FSDK%5FChangeLog.html) --- url: /zh/2-csharp/0-prologue/0.2-compatibility.html title: 机器人版本兼容性 --- # 机器人版本兼容性 [​](#机器人版本兼容性) SDK 支持捷勃特 Scara,Puma 及协作机器人系列。须对已安装机器人软件的设备使用。部分功能因版本不同,返回结果有所差异。 SDK 连接到机械臂时会对机械臂运动控制软件的版本进行检查,如果低于版本最低要求将无法连接,低于推荐版本要求将提示版本过低,请及时更新兼容的机器人软件版本 SDK 某些接口只支持对应的版本控制器,请注意查看具体接口兼容性 | SDK 版本 | 兼容的机器人软件版本 | 支持状态 | | ------- | ------------------------------- | ---- | | 0.1.1.X | Copper v7.5.X.X、Bronze v7.5.X.X | 不再支持 | | 0.1.2.X | Copper v7.5.X.X、Bronze v7.5.X.X | 不再支持 | | 0.2.0.X | Copper v7.5.X.X、Bronze v7.5.X.X | 不再支持 | | 1.0.0.X | Copper v7.6.X.X、Bronze v7.5.X.X | 支持中 | | 2.0.X.X | Copper v7.7.X.X、Bronze v7.7.X.X | 支持中 | | 2.1.X.X | Copper v7.7.I.X | 支持中 | --- url: /zh/2-csharp/1-intro/1.1-envronment.html title: 1.1 环境要求 --- # 1.1 环境要求 [​](#1-1) 系统: * Windows 10 及以上 * x86\_64 架构 * .NET 版本 * 6.0 以上 * .NET Framework 版本 * 4.7 以上 --- url: /zh/2-csharp/1-intro/1.2-install.html title: 1.2 安装 --- # 1.2 安装 [​](#1-2) 本节介绍开发环境准备、SDK 获取与常见运行注意事项,确保在最短时间内完成 Agilebot SDK 的本地调试。 ## IDE 安装与配置 [​](#ide-安装与配置) 1. 推荐使用 Visual Studio 作为 C# 开发环境,可在 [下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux](https://visualstudio.microsoft.com/zh-hans/downloads/) 获取最新版本。 2. 安装完成后启动 Visual Studio,并根据提示完成初始配置(例如登录、安装必要的工作负载)。 ## SDK 获取与项目创建 [​](#sdk-获取与项目创建) 1. 在 Visual Studio 中新建 **C# 控制台应用**,目标框架选择 `.NET 6.0 及以上` 或 `NET Framework 4.7 及以上` 。 ![示例图片](/docs/sdk/images/1.jpg) ![示例图片](/docs/sdk/images/2.jpg) 2. 进入项目属性,将目标操作系统设置为 **Windows**,目标版本选择 **7.0 或更高**,确保能够使用最新的 WinApp SDK 功能。 ![示例图片](/docs/sdk/images/8.jpg) ![示例图片](/docs/sdk/images/9.jpg) 3. 打开 `工具 > NuGet 包管理器 > 程序包管理器设置` ,在右上角的程序包源中添加 SDK 包所在目录。 ![示例图片](/docs/sdk/images/3.jpg) ![示例图片](/docs/sdk/images/4.jpg) ![示例图片](/docs/sdk/images/5.jpg) ![示例图片](/docs/sdk/images/6.jpg) 4. 返回 NuGet 程序包管理器,将程序包源切换为刚添加的目录,搜索并安装 `Agilebot.SDK` 包。 ![示例图片](/docs/sdk/images/7.jpg) ## 代理服务与常见问题 [​](#代理服务与常见问题) * 安装 SDK 后,项目会自动新增 `Tools` 文件夹,包含本地控制器代理服务所需的 `controller_proxy_service_windows_amd64.exe` 。若该文件未自动复制,可手动将其放入项目根目录与生成输出目录。 * 如程序异常退出导致代理服务残留,可在 Windows 任务管理器中终止 `controller_proxy_service_windows_amd64` 进程。 * 代理服务运行时,请勿将代理服务所在目录移动到其他位置。 ## 联网要求与调试 [​](#联网要求与调试) 1. 开始编写并运行示例代码前,确保上位机已接入机器人网络,或与机器人位于同一局域网。 2. 调试过程中请保持网络连接稳定,避免代理服务因断网而退出。 ![示例图片](/docs/sdk/images/10.jpg) ![示例图片](/docs/sdk/images/11.jpg) --- url: /zh/2-csharp/1-intro/1.3-example.html title: 1.3 示例程序使用方法 --- # 1.3 示例程序使用方法 [​](#1-3) 本章示范如何使用 SDK 附带的 `C#_example` 项目,通过切换不同的启动项来快速体验主要功能类。 ![示例图片](/docs/sdk/images/12.jpg) ## 运行步骤 [​](#运行步骤) 1. 打开 `C#_example` 并运行,程序会自动弹出终端窗口。 2. 按提示输入机器人 IP 地址。 3. 选择代理服务部署位置(机器人内部或本地)。 4. 点击 **“开始运行”** 即可加载对应示例。 ![示例图片](/docs/sdk/images/13.jpg) ## 代理类型说明 [​](#代理类型说明) * **机器人内部代理**:使用机器人控制柜自带的代理服务,代理运行在机器人控制柜上,适合机器人软件版本不低于 v7.7.0.0 的场景。 * **本地控制器代理**:使用 SDK 自带的代理服务,代理运行在上位机,占用资源极少,适用于所有版本,机器人软件版本低于 v7.7.0.0 时只能使用本地控制器代理。 * 在 **Airbot** 上仅支持机器人内部代理(本地代理无法与 AirBot 通信),请选择对应选项以确保连接成功。 --- url: /zh/2-csharp/2-glossary/ title: 2 名词解释 --- # 2 名词解释 [​](#2) | 名词 | 描述 | | ------ | ---------------------------------------------------------------- | | 示教器 | 连接在机器人上的手持设备,用于对机器人进行示教和控制 | | SDK | 软件开发工具包,用于对机器人进行编程和控制 | | 机器人网络 | 机器人与外部计算机之间的网络连接 | | 控制器 | 机器人的控制单元,负责执行运动指令、处理传感器数据和管理机器人状态 | | 机械臂 | 机器人的主要运动部分,由多个关节和连杆组成 | | 伺服系统 | 控制机器人关节运动的电机驱动系统,提供精确的位置和速度控制 | | 示教 | 通过手动操作机器人或示教器来记录机器人运动轨迹和动作的过程 | | 关节 | 机器人机械臂中连接各个连杆的可动部件,每个关节对应一个自由度 | | 笛卡尔坐标 | 以 X、Y、Z 三个相互垂直的轴为基准的三维坐标系统,用于描述机器人在空间中的位置和姿态 | | 位姿 | 机器人在空间中的位置和姿态的组合,包括位置坐标和旋转角度 | | 轨迹 | 机器人末端执行器在空间中移动的路径,通常由一系列位姿点组成 | | 负载 | 机器人末端执行器所承载的重量和物体,影响机器人的运动性能和精度 | | 坐标系 | 用于描述机器人位置和姿态的参考系统,包括基坐标系、工具坐标系、用户坐标系等 | | OVC | Overall Velocity Control,全局速度控制,用于设置机器人整体运动速度的倍率 | | OAC | Overall Acceleration Control,全局加速度控制,用于设置机器人整体加速度的倍率 | | TF | Tool Frame,工具坐标系,以机器人末端工具为原点的坐标系 | | UF | User Frame,用户坐标系,用户自定义的坐标系,便于编程和定位 | | TCS | Teach Coordinate System,示教坐标系,用于示教时的坐标参考系统 | | DH 参数 | Denavit-Hartenberg 参数,用于描述机器人连杆几何关系的标准参数 | | PR 寄存器 | Pose Register,位姿寄存器,用于存储机器人位姿信息的寄存器 | | MR 寄存器 | Motion Register,运动寄存器,用于存储运动相关参数的寄存器 | | SR 寄存器 | String Register,字符串寄存器,用于存储字符串信息的寄存器 | | R 寄存器 | Real Register,实数寄存器,用于存储数值信息的寄存器 | | MH 寄存器 | Modbus Holding Register,Modbus 保持寄存器,用于 Modbus 通信的保持寄存器 | | MI 寄存器 | Modbus Input Register,Modbus 输入寄存器,用于 Modbus 通信的输入寄存器 | | DI | Digital Input,数字信号输入,用于接收外部数字信号 | | DO | Digital Output,数字信号输出,用于控制外部设备或执行器 | | BAS | Basic Script,基础脚本语言,用于编写机器人控制程序的高级编程语言 | | Scara | Selective Compliance Assembly Robot Arm,选择性柔顺装配机器人手臂,一种四轴工业机器人类型 | | 协作机器人 | 能够与人类安全协作的机器人,通常具有力感知和碰撞检测功能 | | 工业机器人 | 用于工业自动化生产的机器人,通常具有高精度、高速度和高负载能力 | | Copper | 捷勃特协作机器人产品线的代号 | | Bronze | 捷勃特工业机器人产品线的代号 | --- url: /zh/2-csharp/3-struct/ title: 3 数据结构 --- # 3 数据结构 [​](#3) ## 3.1 StatusCode [​](#3-1) ### 说明 [​](#说明) 接口返回状态码 ### 导入 [​](#导入) ```c# using Agilebot.IR; ``` ### 字段 [​](#字段) | **名称** | **枚举值** | **描述** | | ---------------------------- | ------- | ----------------------- | | OK | 0 | 执行成功 | | INCOMPATIBLE\_VERSION | \-1 | 版本不兼容 | | TIMEOUT | \-3 | 连接超时 | | INTERFACE\_NOT\_IMPLEMENTED | \-4 | 接口未实现 | | INDEX\_OUT\_OF\_RANGE | \-5 | 索引越界 | | UNSUPPORTED\_FILETYPE | \-6 | 不支持的文件类型 | | UNSUPPORTED\_PARAMETER | \-7 | 不支持的机器人参数 | | UNSUPPORTED\_SIGNALTYPE | \-8 | 不支持的 IO 信号类型 | | PROGRAM\_NOT\_FOUND | \-9 | 找不到程序 | | PROGRAM\_POSE\_NOT\_FOUND | \-10 | 找不到程序位姿信息 | | WRITE\_PROGRAM\_FAILED | \-11 | 更新程序位姿信息失败 | | GET\_ALARM\_CODE\_FAILED | \-12 | 访问报警服务获取报警码失败 | | WRONG\_POSITION\_INFO | \-13 | 控制器返回错误的点位信息 | | UNSUPPORTED\_TRA\_TYPE | \-14 | 不支持的运动类型 | | FILE\_NOT\_FOUND | \-15 | 文件或文件夹未找到 | | FILE\_ALREADY\_EXIST | \-16 | 文件已存在 | | INVALID\_PARAMETER | \-27 | 参数有误 | | GET\_ALARM\_DESC\_FAILED | \-17 | 根据报警码获取报警信息失败 | | RESET\_ALARM\_ERRORS\_FAILED | \-18 | 重置报警信息失败 | | GET\_ALL\_ALARMS\_FAILED | \-19 | 获取所有报警信息失败 | | WRONG\_DATA\_FORMAT | \-20 | 接收的数据格式有误 | | CONNECT\_FAILED | \-21 | 初始化连接失败,请检查 ip 地址或控制柜服务 | | POSE\_INDEX\_DUPLICATED | \-23 | 位姿序号重复 | | CONTROLLER\_ERROR | \-254 | 控制器错误,请联系开发人员 | | OTHER\_REASON | \-255 | 其他原因 | ## 3.2 RobotState [​](#3-2) ### 说明 [​](#说明-1) 机器人运行状态 ### 导入 [​](#导入-1) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-1) | **名称** | **枚举值** | **描述** | | ------------------------- | ------- | --------------- | | WRONG\_DATA | \-1 | 未知状态 | | ROBOT\_IDLE | 0 | 机器人空闲 | | ROBOT\_RUNNING | 1 | 机器人运行中 | | ROBOT\_TEACHING | 2 | 机器人示教中 | | ROBOT\_IDLE\_TO\_RUNNING | 101 | 机器人中间状态 空闲转换为运行 | | ROBOT\_IDLE\_TO\_TEACHING | 102 | 机器人中间状态 空闲转换为示教 | | ROBOT\_RUNNING\_TO\_IDLE | 103 | 机器人中间状态 运行转换为空闲 | | ROBOT\_TEACHING\_TO\_IDLE | 104 | 机器人中间状态 示教转换为空闲 | ## 3.3 CtrlState [​](#3-3) ### 说明 [​](#说明-2) 控制器运行状态 ### 导入 [​](#导入-2) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-2) | 名称 | 枚举值 | 描述 | | --------------------------- | --- | --------------- | | WRONG\_DATA | \-1 | 未知的控制器状态 | | CTRL\_INIT | 0 | 控制器初始化 | | CTRL\_ENGAGED | 1 | 控制器使能 | | CTRL\_ESTOP | 2 | 控制器急停 | | CTRL\_TERMINATED | 3 | 控制器中止 | | CTRL\_ANY\_TO\_ESTOP | 101 | 控制器中间状态 其他转换为急停 | | CTRL\_ESTOP\_TO\_ENGAGED | 102 | 控制器中间状态 急停到使能 | | CTRL\_ESTOP\_TO\_TERMINATED | 103 | 控制器中间状态 急停到中止 | ## 3.4 ServoState [​](#3-4) ### 说明 [​](#说明-3) 伺服控制器状态 ### 导入 [​](#导入-3) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-3) | 名称 | 枚举值 | 描述 | | ------------------ | --- | ---------- | | WRONG\_DATA | \-1 | 未知的伺服控制器状态 | | SERVO\_IDLE | 1 | 伺服控制器空闲 | | SERVO\_RUNNING | 2 | 伺服控制器运行中 | | SERVO\_DISABLE | 3 | 伺服控制器关闭 | | SERVO\_WAIT\_READY | 4 | 伺服控制器等待就绪 | | SERVO\_WAIT\_DOWN | 5 | 伺服控制器等待关闭 | | SERVO\_INIT | 10 | 伺服控制器初始化 | ## 3.5 TransformStatusEnum [​](#3-5) ### 说明 [​](#说明-4) 离线轨迹文件转换状态的枚举 ### 导入 [​](#导入-4) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-4) | 名称 | 枚举值 | 描述 | | --------------------- | --- | --------- | | TRANSFORM\_START | 0 | 转换任务开始 | | TRANSFORM\_RUNNING | 1 | 转换任务执行中 | | TRANSFORM\_SUCCESS | 2 | 转换任务已完成 | | TRANSFORM\_FAILED | 3 | 转换任务失败 | | TRANSFORM\_NOT\_FOUND | 4 | 转换任务没找到 | | TRANSFORM\_UNKNOWN | \-1 | 未知的转换任务状态 | 以下是为 `PayloadInfo` 、 `MassCenter` 和 `InertiaMoment` 类生成的详细说明文档: --- ## 3.6 PayloadInfo [​](#3-6) ### 说明 [​](#说明-5) `PayloadInfo` 类用于存储机器人的负载信息,包括负载编号、重量、质心和惯性矩等参数。这些信息对于机器人在负载条件下的运动学和动力学分析至关重要,尤其是在进行路径规划和力矩计算时。 ### 导入 [​](#导入-5) ```c# using Agilebot.IR.Motion; ``` ### 属性 [​](#属性) | 属性 | 类型 | 描述 | | ------------- | ----------------------- | ------------------ | | Id | uint | 负载编号,用于唯一标识不同的负载配置 | | Comment | string | 注释,用于描述负载的额外信息 | | Weight | double | 负载的重量(单位:千克) | | MassCenter | [MassCenter](#3-6-1) | 负载的质心位置(X、Y、Z 坐标) | | InertiaMoment | [InertiaMoment](#3-6-2) | 负载的惯性矩(LX、LY、LZ) | ### 示例 [​](#示例) ```c# PayloadInfo payload = new PayloadInfo { Id = 1, Comment = "Sample Payload", Weight = 5.0, MassCenter = new MassCenter { X = 10.0, Y = 20.0, Z = 30.0 }, InertiaMoment = new InertiaMoment { LX = 0.1, LY = 0.2, LZ = 0.3 } }; ``` ### 3.6.1 MassCenter [​](#3-6-1) #### 说明 [​](#说明-6) `MassCenter` 类用于表示负载的质心位置,包含 X、Y 和 Z 三个坐标轴的值。质心位置是负载在空间中的几何中心,对于机器人运动控制和力矩计算非常重要。 #### 导入 [​](#导入-6) ```c# using Agilebot.IR.Motion; ``` #### 属性 [​](#属性-1) | 属性 | 类型 | 描述 | | -- | ------ | --------------- | | X | double | 质心的 X 坐标(单位:毫米) | | Y | double | 质心的 Y 坐标(单位:毫米) | | Z | double | 质心的 Z 坐标(单位:毫米) | ### 3.6.2 InertiaMoment [​](#3-6-2) #### 说明 [​](#说明-7) `InertiaMoment` 类用于表示负载的惯性矩,包含 LX、LY 和 LZ 三个方向的值。惯性矩是负载在旋转运动中抵抗变化的能力,对于机器人动力学分析和控制非常重要。 #### 导入 [​](#导入-7) ```c# using Agilebot.IR.Motion; ``` #### 属性 [​](#属性-2) | 属性 | 类型 | 描述 | | -- | ------ | --------------------- | | LX | double | 惯性矩的 X 分量(单位:千克・毫米 ²) | | LY | double | 惯性矩的 Y 分量(单位:千克・毫米 ²) | | LZ | double | 惯性矩的 Z 分量(单位:千克・毫米 ²) | ## 3.7 TransformState [​](#3-7) ### 说明 [​](#说明-8) 离线轨迹文件转换状态的枚举 ### 导入 [​](#导入-8) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-5) | 枚举值 | 值 | 描述 | | --------------------- | --- | --------- | | TRANSFORM\_START | 0 | 转换任务开始 | | TRANSFORM\_RUNNING | 1 | 转换任务执行中 | | TRANSFORM\_SUCCESS | 2 | 转换任务已完成 | | TRANSFORM\_FAILED | 3 | 转换任务失败 | | TRANSFORM\_NOT\_FOUND | 4 | 转换任务未找到 | | TRANSFORM\_UNKNOWN | \-1 | 数据错误,未知状态 | ## 3.8 TCSType [​](#3-8) ### 说明 [​](#说明-9) TCS 坐标系类型 ### 导入 [​](#导入-9) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-6) | 名称 | 枚举值 | 描述 | | ----------- | --- | ---------- | | WRONG\_TYPE | \-1 | 错误类型 | | JOINT | 0 | 关节空间 | | BASE | 1 | 基坐标系 | | WORLD | 2 | 世界坐标系 | | USER | 3 | 用户坐标系 | | TOOL | 4 | 工具坐标系 | | RTCP\_USER | 5 | RTCP 用户坐标系 | | RTCP\_TOOL | 6 | RTCP 工具坐标系 | ## 3.9 MotionPose [​](#3-9) ### 说明 [​](#说明-10) 描述机器人点位的结构 坐标数据中,XYZ 方向距离数据单位为毫米 (mm),角度数据单位为 度 (°),部分版本角度信息为弧度,详见功能列表返回结果说明。 ### 导入 [​](#导入-10) ```c# using Agilebot.IR.Motion; ``` ### 属性 [​](#属性-3) | 属性 | 类型 | 描述 | | -------- | --------------------- | ---------------- | | CartData | [BaseCartData](#3-10) | 笛卡尔数据 | | Joint | [Joint](#3-11) | 关节数据 | | Pt | [PoseType](#3-12) | 点位类型,默认为 Unknown | ### 示例 [​](#示例-1) ```c# MotionPose motionPose = new MotionPose(); motionPose.Pt = PoseType.Cart; motionPose.CartData.Position = new Position{ X = 300, Y = 300, Z = 300, A = 0, B = 0, C = 0 }; motionPose.CartData.Posture = new Posture{ WristFlip = 1, ArmUpDown = 1, ArmBackFront = 1, ArmLeftRight = 1, TurnCircle = new List(9){0,0,0,0,0,0,0,0,0} }; MotionPose motionPose2 = new MotionPose(); motionPose2.Pt = PoseType.Joint; motionPose2.Joint = new Joint{ J1 = 0, J2 = 0, J3 = 60, J4 = 60, J5 = 0, J6 = 0 }; ``` ## 3.10 BaseCartData [​](#3-10) ### 说明 [​](#说明-11) 描述机器人在笛卡尔坐标系中的空间位置和姿态信息。其中,空间坐标使用毫米(mm)为单位,姿态信息包括腕部、臂部的姿态以及各个轴的回转数。 ### 导入 [​](#导入-11) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-4) | 属性 | 类型 | 描述 | | -------- | ------------------- | -------------------------- | | Position | [Position](#3-10-1) | 机器人的空间坐标(X, Y, Z, A, B, C) | | Posture | [Posture](#3-10-2) | 机器人的姿态信息(腕部、臂部姿态及轴的回转数) | ### 示例 [​](#示例-2) ```c# BaseCartData cartData = new BaseCartData(); cartData.Position.X = 100.0; cartData.Position.Y = 200.0; cartData.Position.Z = 300.0; cartData.Posture.ArmUpDown = 1; cartData.Posture.ArmBackFront = -1; Console.WriteLine(cartData.ToString()); ``` --- ### 3.10.1 Position [​](#3-10-1) #### 说明 [​](#说明-12) 描述机器人操作点的笛卡尔坐标系空间位置及旋转角度坐标。坐标数据中,X、Y、Z 方向的距离单位为毫米(mm),A、B、C 方向的角度单位为度(°)。 #### 导入 [​](#导入-12) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-5) | 属性 | 类型 | 描述 | | -- | ------ | --------------------- | | X | double | 笛卡尔坐标系 X 方向的距离(单位:毫米) | | Y | double | 笛卡尔坐标系 Y 方向的距离(单位:毫米) | | Z | double | 笛卡尔坐标系 Z 方向的距离(单位:毫米) | | A | double | 笛卡尔坐标系 A 方向的角度(单位:度) | | B | double | 笛卡尔坐标系 B 方向的角度(单位:度) | | C | double | 笛卡尔坐标系 C 方向的角度(单位:度) | #### 示例 [​](#示例-3) ```c# Position position = new Position(); position.X = 100.0; position.Y = 200.0; position.Z = 300.0; position.A = 45.0; position.B = 30.0; position.C = 60.0; Console.WriteLine(position.ToString()); ``` --- ### 3.10.2 Posture [​](#3-10-2) #### 说明 [​](#说明-13) 描述机器人的姿态信息,包括腕部、臂部的姿态以及各个轴的回转数。姿态信息用于定义机器人在空间中的具体姿态。 #### 导入 [​](#导入-13) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-6) | 属性 | 类型 | 描述 | | ------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | WristFlip | int | 腕部翻转姿态,取值范围为 - 1、1。在 6 轴机器人 J5 关节配置中,值 = 1 表示腕向下翻转,值 =-1 表示腕向上翻转 | | ArmUpDown | int | 臂部上下姿态,取值范围为 - 1、1。在 6 轴机器人 J3 关节配置中,值 = 1 表示手臂在上(前向条件下,3 轴在 4 轴到 2 轴连线上方,3 轴关节角 <0),值 =-1 表示手臂在下(前向条件下,3 轴在 4 轴到 2 轴连线下方,3 轴关节角> 0) | | ArmBackFront | int | 臂部前后姿态,取值范围为 - 1、1。在 6 轴机器人 J1 关节配置中,值 = 1 表示手臂在前(协作面向前方,2 轴在 1 轴左侧的状态下),值 =-1 表示手臂在后(协作面向前方,2 轴在 1 轴右侧的状态下) | | ArmLeftRight | int | 臂部左右姿态,取值范围为 - 1、1。在 4 轴 Scara 机器人 J2 关节配置中,值 = 1 表示 Scara 手臂在右,值 =-1 表示 Scara 手臂在左 | | TurnCircle | List | 各个轴的回转数,取值范围为 - 1、1。各轴处在 0° 姿势下,回转数为 0。执行直线、圆弧动作时,目标点回转数自动选定,可能与示教位置资料不同。各轴回转数 >=180 对应值 = 1 或更大,-179.99\~179.99 对应值 = 0,<=-180 对应值 =-1 或更小 | #### 示例 [​](#示例-4) ```c# Posture posture = new Posture(); posture.TurnCircle = new List(9){0,0,0,0,0,0,0,0,0} posture.WristFlip = 1; posture.ArmUpDown = 1; posture.ArmBackFront = -1; posture.ArmLeftRight = 1; Console.WriteLine(posture.ToString()); ``` 以下是为 `Joint` 类生成的说明文档: --- ## 3.11 Joint [​](#3-11) ### 说明 [​](#说明-14) 描述机器人各个关节的角度数据。每个关节的角度值用于定义机器人在关节空间中的具体位置。角度单位通常为度(°),但具体单位需根据实际机器人系统确认。 ### 导入 [​](#导入-14) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-7) | 属性 | 类型 | 描述 | | -- | ------ | ---------- | | J1 | double | 机器人一轴的关节角度 | | J2 | double | 机器人二轴的关节角度 | | J3 | double | 机器人三轴的关节角度 | | J4 | double | 机器人四轴的关节角度 | | J5 | double | 机器人五轴的关节角度 | | J6 | double | 机器人六轴的关节角度 | | J7 | double | 机器人七轴的关节角度 | | J8 | double | 机器人八轴的关节角度 | | J9 | double | 机器人九轴的关节角度 | ### 示例 [​](#示例-5) ```c# Joint joint = new Joint(); joint.J1 = 45.0; joint.J2 = 30.0; joint.J3 = 60.0; joint.J4 = 90.0; joint.J5 = 120.0; joint.J6 = 135.0; joint.J7 = 150.0; joint.J8 = 180.0; joint.J9 = 225.0; Console.WriteLine(joint.ToString()); ``` ### 注意事项 [​](#注意事项) * 关节角度的单位通常为度(°),但某些机器人系统可能使用弧度(rad)。请根据具体机器人系统的文档确认单位。 * 关节角度的取值范围通常由机器人硬件限制,超出范围可能导致错误或损坏设备。 以下是为 `PoseType` 枚举生成的说明文档: --- ## 3.12 PoseType [​](#3-12) ### 说明 [​](#说明-15) 定义了机器人位姿数据的类型,用于区分数据是关节角度、笛卡尔空间坐标还是未知类型。该枚举用于标识机器人位姿数据的格式,以便在程序中正确处理不同类型的数据。 ### 导入 [​](#导入-15) ```c# using Agilebot.IR.Types; ``` ### 枚举值 [​](#枚举值) | 枚举值 | 描述 | | ------- | ---------------------- | | Unknown | 未知类型,表示位姿数据类型未定义 | | Joint | 关节角度数据类型,表示数据为关节角度 | | Cart | 笛卡尔空间坐标数据类型,表示数据为笛卡尔坐标 | 以下是为 `DHparam` 类生成的说明文档: --- ## 3.13 DHparam [​](#3-13) ### 说明 [​](#说明-16) `DHparam` 类用于描述机器人连杆的参数,基于 [Denavit-Hartenberg 参数](https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg%5Fparameters)(D-H 参数)。这些参数用于定义机器人关节之间的几何关系,是机器人运动学和动力学分析的基础。 ### 导入 [​](#导入-16) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-8) | 属性 | 类型 | 描述 | | ------ | ------ | ----------------------------- | | id | uint | 杆件的唯一标识符,用于区分不同的连杆 | | a | double | 杆件长度,表示相邻关节的轴向距离(单位:毫米) | | alpha | double | 杆件扭角,表示相邻关节轴之间的夹角(单位:度或弧度) | | d | double | 关节距离,表示沿当前关节轴到下一个关节的距离(单位:毫米) | | offset | double | 关节转角偏移量,表示关节的初始角度偏移(单位:度或弧度) | ### 构造函数 [​](#构造函数) ```c# public DHparam(uint id, double d, double a, double alpha, double offset) ``` ### 注意事项 [​](#注意事项-1) * **单位一致性**: `a` 和 `d` 的单位应保持一致(通常为毫米),而 `alpha` 和 `offset` 的单位也应保持一致(通常为度或弧度)。 * **角度单位**:在某些机器人系统中,角度单位可能为弧度而非度。请根据实际需求确认并统一单位。 * **D-H 参数的定义**:D-H 参数的定义依赖于具体的机器人模型和坐标系约定。在使用 `DHparam` 类时,确保参数的定义与机器人的实际几何结构一致。 以下是为 `CartStatus` 、 `JointStatus` 和 `DragStatus` 类生成的详细说明文档: --- ## 3.14 CartStatus [​](#3-14) ### 说明 [​](#说明-17) `CartStatus` 类用于表示笛卡尔坐标系中各轴的状态。每个轴的状态用布尔值表示, `true` 表示轴可用, `false` 表示轴不可用。此状态类通常用于机器人运动控制中,以判断某个轴是否可以正常工作。 ### 导入 [​](#导入-17) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-9) | 属性 | 类型 | 描述 | | -- | ---- | -------------------- | | X | bool | X 方向状态,默认为 true (可用) | | Y | bool | Y 方向状态,默认为 true (可用) | | Z | bool | Z 方向状态,默认为 true (可用) | | A | bool | A 方向状态,默认为 true (可用) | | B | bool | B 方向状态,默认为 true (可用) | | C | bool | C 方向状态,默认为 true (可用) | --- ## 3.15 JointStatus [​](#3-15) ### 说明 [​](#说明-18) `JointStatus` 类用于表示机械臂各关节的状态。每个关节的状态用布尔值表示, `true` 表示关节可用, `false` 表示关节不可用。此状态类通常用于机器人运动控制中,以判断某个关节是否可以正常工作。 ### 导入 [​](#导入-18) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-10) | 属性 | 类型 | 描述 | | -- | ---- | --------------------- | | J1 | bool | 关节 1 状态,默认为 true (可用) | | J2 | bool | 关节 2 状态,默认为 true (可用) | | J3 | bool | 关节 3 状态,默认为 true (可用) | | J4 | bool | 关节 4 状态,默认为 true (可用) | | J5 | bool | 关节 5 状态,默认为 true (可用) | | J6 | bool | 关节 6 状态,默认为 true (可用) | | J7 | bool | 关节 7 状态,默认为 true (可用) | | J8 | bool | 关节 8 状态,默认为 true (可用) | | J9 | bool | 关节 9 状态,默认为 true (可用) | --- ## 3.16 DragStatus [​](#3-16) ### 说明 [​](#说明-19) `DragStatus` 类用于表示机械臂的拖动状态,包含笛卡尔坐标系状态和关节状态。此外,还包含一个标志位 `IsContinuousDrag` ,用于表示是否处于连续拖动模式。此状态类通常用于机器人拖动控制中,以判断当前的拖动模式和各轴 / 关节的状态。 ### 导入 [​](#导入-19) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-11) | 属性 | 类型 | 描述 | | ---------------- | -------------------- | -------------------- | | CartStatus | [CartStatus](#3-14) | 笛卡尔坐标系状态 | | JointStatus | [JointStatus](#3-15) | 关节状态 | | IsContinuousDrag | bool | 是否处于连续拖动模式,默认为 false | ### 构造函数 [​](#构造函数-1) ```c# public DragStatus() ``` * 初始化 `CartStatus` 和 `JointStatus` ,并设置 `IsContinuousDrag` 为 `false` 。 ### 示例 [​](#示例-6) ```c# DragStatus dragStatus = new DragStatus(); dragStatus.CartStatus.X = false; // X轴不可用 dragStatus.JointStatus.J3 = false; // 关节3不可用 dragStatus.IsContinuousDrag = true; // 设置为连续拖动模式 Console.WriteLine($"X轴状态: {dragStatus.CartStatus.X}, 关节3状态: {dragStatus.JointStatus.J3}, 是否连续拖动: {dragStatus.IsContinuousDrag}"); ``` ## 3.17 ProgramPose [​](#3-17) ### 说明 [​](#说明-20) `ProgramPose` 类用于表示程序中的一个位姿(姿态),可以是关节坐标或笛卡尔坐标。该类包含位姿的唯一标识符、数据(关节或笛卡尔坐标信息)、名称和注释。通过此类,可以方便地管理和操作机器人程序中的位姿信息。 ### 导入 [​](#导入-20) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-12) | 属性 | 类型 | 描述 | | -------- | -------------------------- | ------------------ | | Id | int | 位姿的唯一标识符 | | PoseData | [ProgramPoseData](#3-17-1) | 位姿的数据,包括关节或笛卡尔坐标信息 | | Name | string | 位姿的名称 | | Comment | string | 位姿的注释 | ### 构造函数 [​](#构造函数-2) ```c# public ProgramPose() ``` * 初始化 `Id` 、 `PoseData` 、 `Name` 和 `Comment` 。 ### 示例 [​](#示例-7) ```c# ProgramPose programPose = new ProgramPose(); programPose.Id = 1; // 设置位姿的唯一标识符 programPose.PoseData = new ProgramPoseData(); // 创建位姿数据 programPose.Name = "Pose1"; // 设置位姿名称 programPose.Comment = "这是一个示例位姿"; // 设置位姿注释 Console.WriteLine($"位姿ID: {programPose.Id}, 名称: {programPose.Name}, 注释: {programPose.Comment}"); ``` ### 3.17.1 ProgramPoseData [​](#3-17-1) #### 说明 [​](#说明-21) `ProgramPoseData` 类用于表示程序中的位姿数据,包含笛卡尔空间坐标和姿态信息、关节角度信息以及位姿类型。通过此类,可以方便地存储和管理位姿的具体数据。 #### 导入 [​](#导入-21) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-13) | 属性 | 类型 | 描述 | | -------- | -------------------------- | ---------------- | | CartData | [ProgramCartData](#3-17-2) | 笛卡尔数据 | | Joint | [Joint](#3-11) | 关节数据 | | Pt | [PoseType](#3-12) | 点位类型,默认为 Unknown | ### 3.17.2 ProgramCartData [​](#3-17-2) #### 说明 [​](#说明-22) `ProgramCartData` 类用于表示程序的笛卡尔坐标系数据。它通过引用 `BaseCartData` 类来包含空间坐标和姿态信息,并通过 `Uf` 和 `Tf` 的值来确定采用的坐标系类型。 `Uf` 表示用户坐标系(User Frame), `Tf` 表示工具坐标系(Tool Frame)。如果 `Uf` 和 `Tf` 的值为 `-1` ,则表示使用系统的默认坐标系。此类在机器人编程中用于定义和管理笛卡尔空间中的位姿信息。 #### 导入 [​](#导入-22) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-14) | 属性 | 类型 | 描述 | | -------- | --------------------- | --------------------------------- | | BaseCart | [BaseCartData](#3-10) | 机器人的笛卡尔点位和姿态信息 | | Uf | int | 用户坐标系(User Frame), \-1 表示使用系统的坐标系 | | Tf | int | 工具坐标系(Tool Frame), \-1 表示使用系统的坐标系 | ## 3.18 FileType [​](#3-18) ### 说明 [​](#说明-23) `FileType` 枚举用于定义文件上传时允许的文件类型。它通过不同的枚举值来区分机器人程序文件的来源和格式。此枚举在机器人编程环境中用于文件管理、上传和程序解析等场景,帮助系统正确识别和处理不同类型的程序文件。 ### 导入 [​](#导入-23) ```c# using Agilebot.IR.Types; ``` ### 枚举值 [​](#枚举值-1) | 枚举值 | 描述 | | ----------------- | ----------------------------------------------- | | UserProgram | 用户通过点选生成的程序文件,每个程序包含 .xml 和 .json 两个文件。 | | BlockProgram | 用户通过积木块生成的程序文件,每个程序包含 .block 、 .xml 和 .json 文件。 | | TrajectoryProgram | 离线轨迹程序文件,通常用于离线编程生成的路径规划文件。 | ## 3.19 SignalType [​](#3-19) ### 说明 [​](#说明-24) `SignalType` 枚举用于定义机器人系统中支持的信号类型。它通过不同的枚举值来区分各种数字信号和模拟信号的用途和来源。此枚举在机器人控制系统中用于信号配置、信号处理和逻辑判断等场景,帮助系统准确识别和管理不同类型的信号。 ### 导入 [​](#导入-24) ```c# using Agilebot.IR.Types; ``` ### 枚举值 [​](#枚举值-2) | 枚举值 | 描述 | | --- | ------------------------------------------ | | DI | 数字信号输入(Digital Input),用于接收外部数字信号。 | | DO | 数字信号输出(Digital Output),用于控制外部设备或执行器。 | | RI | 机器人手臂数字信号输入(Robot Input),用于接收机器人手腕部分的数字信号。 | | RO | 机器人手臂数字信号输出(Robot Output),用于控制机器人手腕部分的执行器。 | | UI | 用户数字信号输入(User Input),用于接收用户自定义的数字信号。 | | UO | 用户数字信号输出(User Output),用于输出用户自定义的数字信号。 | | TDI | 工具数字信号输入(Tool Digital Input),用于接收工具端的数字信号。 | | TDO | 工具数字信号输出(Tool Digital Output),用于控制工具端的执行器。 | | GI | 组输入(Group Input),用于接收一组数字信号的组合输入。 | | GO | 组输出(Group Output),用于输出一组数字信号的组合输出。 | | AI | 模拟输入(Analog Input),用于接收连续变化的模拟信号。 | | AO | 模拟输出(Analog Output),用于输出连续变化的模拟信号。 | | TAI | 手腕模拟输入(Tool Analog Input),用于接收工具端的模拟信号。 | ## 3.20 PoseRegister [​](#3-20) ### 说明 [​](#说明-25) `PoseRegister` 类用于表示 PR 寄存器中的位姿(姿态),可以是关节坐标或笛卡尔坐标。该类包含位姿的唯一标识符、数据(关节或笛卡尔坐标信息)、名称和注释。通过此类,可以方便地管理和操作机器人程序中的位姿信息。 ### 导入 [​](#导入-25) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-15) | 属性 | 类型 | 描述 | | -------- | --------------------------- | ------------------ | | Id | int | 位姿的唯一标识符 | | PoseData | [PoseRegisterData](#3-20-1) | 位姿的数据,包括关节或笛卡尔坐标信息 | | Name | string | 位姿的名称 | | Comment | string | 位姿的注释 | ### 构造函数 [​](#构造函数-3) ```c# public PoseRegister() ``` * 初始化 `Id` 、 `PoseData` 、 `Name` 和 `Comment` 。 ### 示例 [​](#示例-8) ```c# PoseRegister pose = new PoseRegister(); pose.Id = 1; // 设置位姿的唯一标识符 pose.PoseData = new PoseRegisterData(); // 创建位姿数据 pose.Name = "Pose1"; // 设置位姿名称 pose.Comment = "这是一个示例位姿"; // 设置位姿注释 Console.WriteLine($"位姿ID: {pose.Id}, 名称: {pose.Name}, 注释: {pose.Comment}"); ``` ### 3.20.1 PoseRegisterData [​](#3-20-1) #### 说明 [​](#说明-26) `PoseRegisterData` 类用于表示 PR 寄存器中的位姿数据,包含笛卡尔空间坐标和姿态信息、关节角度信息以及位姿类型。通过此类,可以方便地存储和管理位姿的具体数据。 #### 导入 [​](#导入-26) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-16) | 属性 | 类型 | 描述 | | -------- | --------------------- | ---------------- | | CartData | [BaseCartData](#3-10) | 笛卡尔数据 | | Joint | [Joint](#3-11) | 关节数据 | | Pt | [PoseType](#3-12) | 点位类型,默认为 Unknown | ## 3.22 Coordinate [​](#3-22) ### 说明 [​](#说明-27) `Coordinate` 类用于表示机器人系统中的一个坐标系。它包含了坐标系的基本信息,如唯一标识符(ID)、名称、备注、运动组编号以及具体的位姿数据。此类在机器人编程和控制系统中用于定义和管理坐标系的具体位置和姿态信息,便于在程序中进行运动规划和路径控制。 ### 导入 [​](#导入-27) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-17) | 属性 | 类型 | 描述 | | ------- | -------- | -------------------------- | | Id | int | 坐标系的唯一标识符。 | | Name | string | 坐标系的名称,用于标识和描述坐标系。 | | Comment | string | 坐标系的备注信息,用于进一步说明坐标系的用途或特点。 | | GroupId | int | 坐标系所属的运动组编号,用于分类管理坐标系。 | | Data | Position | 坐标系的具体位姿数据,包含位置和姿态信息。 | ### 示例 [​](#示例-9) ```c# // 创建一个 Coordinate 实例 Coordinate coordinate = new Coordinate { Id = 1, // 设置唯一标识符 Name = "UserCoordinate1", // 设置名称 Comment = "这是一个用户自定义坐标系", // 设置备注 GroupId = 1, // 设置运动组编号 Data = new Position { X = 100, Y = 200, Z = 300, A = 45, B = 30, C = 60 } // 设置位姿数据 }; ``` ### 3.22.1 CoordinateType [​](#3-22-1) #### 说明 [​](#说明-28) `CoordinateType` 枚举用于定义坐标系的类型。它通过不同的枚举值来区分用户坐标系和工具坐标系。此枚举在机器人编程和控制系统中用于明确指定坐标系的用途,帮助系统正确处理坐标系相关的操作。 #### 导入 [​](#导入-28) ```c# using Agilebot.IR.Types; ``` #### 枚举值 [​](#枚举值-3) | 枚举值 | 描述 | | -------------- | ------------------------- | | UserCoordinate | 用户坐标系,用于定义用户自定义的坐标系。 | | ToolCoordinate | 工具坐标系,用于定义工具(如末端执行器)的坐标系。 | ### 3.22.2 CoordSummary [​](#3-22-2) #### 说明 [​](#说明-29) `CoordSummary` 类用于表示坐标系的概要信息。它包含坐标系的类型、唯一标识符、名称、注释和组 ID 等信息。此类在机器人编程环境中用于管理和存储坐标系的元数据,便于在程序中快速访问和操作坐标系。 #### 导入 [​](#导入-29) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-18) | 属性 | 类型 | 描述 | | ------- | -------------- | --------------------- | | Type | CoordinateType | 坐标系类型,可以是用户坐标系或工具坐标系。 | | Id | int | 坐标系的唯一标识符。 | | Name | string | 坐标系的名称。 | | Comment | string | 坐标系的注释,用于描述坐标系的用途或特点。 | | GroupId | int | 坐标系所属的组 ID,用于分类管理坐标系。 | ### 示例 [​](#示例-10) ```c# // 创建一个 CoordSummary 实例 CoordSummary coordSummary = new CoordSummary { Type = CoordinateType.UserCoordinate, // 设置为用户坐标系 Id = 1, // 设置唯一标识符 Name = "UserCoord1", // 设置名称 Comment = "这是一个用户自定义坐标系", // 设置注释 GroupId = 0 // 设置组ID }; ``` ## 3.23 RobotTopicType [​](#3-23) ### 说明 [​](#说明-30) `RobotTopicType` 枚举用于 `SubPub.SubscribeStatus` 指定机器人状态订阅主题。 ### 导入 [​](#导入-30) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-19) | 名称 | 描述 | | ---------------------------- | -------------- | | TopicCurrentJoint | 发布机械臂关节状态反馈 | | TopicCurrentCartesian | 发布 TCP 当前笛卡尔坐标 | | TopicUF | 发布当前用户坐标系信息 | | TopicTF | 发布当前工具坐标系信息 | | TopicVelocity | 发布全局速度比率 | | TopicRunningStatus | 发布控制器运行状态 | | TopicInterpreterStatus | 发布解释器状态 | | TopicRobotStatus | 发布机器人状态 | | TopicCtrlStatus | 发布控制器状态 | | TopicServoStatus | 发布伺服控制器状态 | | TopicTrajectoryRecordsStatus | 轨迹复现记录状态 | | UserOpMode | 用户操作模式 | ## 3.24 RegTopicType [​](#3-24) ### 说明 [​](#说明-31) `RegTopicType` 枚举用于 `SubPub.SubscribeRegister` 指定寄存器订阅类型。 ### 导入 [​](#导入-31) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-20) | 名称 | 描述 | | -- | -------- | | R | R 寄存器主题 | | MR | MR 寄存器主题 | | SR | SR 寄存器主题 | | PR | PR 寄存器主题 | ## 3.25 IOTopicType [​](#3-25) ### 说明 [​](#说明-32) `IOTopicType` 枚举用于 `SubPub.SubscribeIO` 指定 IO 订阅类型。 ### 导入 [​](#导入-32) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-21) | 名称 | 描述 | | --- | --------- | | DI | 数字量输入主题 | | DO | 数字量输出主题 | | GI | 组数字量输入主题 | | GO | 组数字量输出主题 | | RI | 机器人输入主题 | | RO | 机器人输出主题 | | UI | 用户输入主题 | | UO | 用户输出主题 | | TDI | 工具数字量输入主题 | | TDO | 工具数字量输出主题 | | TAI | 工具模拟量输入主题 | | AI | 模拟量输入主题 | | AO | 模拟量输出主题 | --- url: /zh/2-csharp/4-methods/4.1-arm.html title: 4.1 机器人基础操作 --- # 4.1 机器人基础操作 [​](#4-1) ## 概述 [​](#概述) Arm 类封装了绝大多数与捷勃特机器人相关的高频接口,负责完成连接管理、状态查询、控制指令发送等核心能力。典型使用流程: 1. 实例化 `Arm(controllerIP, teachPanelIP, localProxy)` 构造函数 2. 调用 `ConnectSync()` 建立与控制器 / 示教器的通信 3. 根据业务调用运动、状态、I/O 等接口 4. 最后调用 `DisconnectSync()` 释放资源 实例化后无需手动加载配置,类会在内部完成: * SDK 版本检查 * 控制器类型识别 * 代理服务的自动选择 * 在日志中提示所使用的通信链路 ### 注意事项 [​](#注意事项) * 当机器人软件版本低于 7.7.0 时,请确保 `Arm` 类实例化时 `localProxy=true` ,且 PC 具备本地通信能力。 * 与工业机器人配合时,若需要保持 PC 模式: * 连接后需要确保已获得示教器控制权限(具体方式请参考机器人操作手册) * 操作完成后及时释放权限 * 避免示教器控制权限被长时间占用 ## 类构造函数 [​](#类构造函数) | 方法名 | **Arm**( string controllerIP , string teachPanelIP \= null, bool localProxy \= true ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 捷勃特机器人类构造函数,包含所有可用的机器人控制接口。需要先初始化并连接机器人后才能使用其他功能 | | 请求参数 | controllerIP : string 机器人控制器 IP 地址 teachPanelIP : string 可选,示教器侧 IP;不提供时回退到 controllerIP localProxy : bool 是否使用本地控制器代理服务,默认为 true。当为 true 时将在本地启动控制器代理服务;当为 false 时则需要机器人控制器中已安装代理服务(需要机器人软件版本 7.7 及以上) | | 返回值 | [StatusCode](./../3-struct/#3-1): 构造函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.1 连接机器人 [​](#4-1-1) | 方法名 | **ConnectSync**() | | ---------- | ------------------------------------------------------------------ | | 描述 | 建立与捷勃特机器人的网络连接。必须先调用 Arm 构造函数初始化机器人实例。该方法会根据构造函数中指定的代理模式启动相应的代理服务。 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 连接操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.2 判断与机械臂的连接是否有效 [​](#4-1-2) | 方法名 | **IsConnected**() | | ---------- | ------------------------------------------------------------- | | 描述 | 检查与机器人的网络连接状态是否有效。返回 true 表示连接有效,可以正常通信;返回 false 表示连接已断开或未建立。 | | 请求参数 | 无参数 | | 返回值 | bool: 连接状态,true 表示连接有效,false 表示连接失效或未连接 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.3 与机器人断开连接 [​](#4-1-3) | 方法名 | **DisconnectSync**() | | ---------- | ----------------------------------------------------- | | 描述 | 断开与捷勃特机器人的网络连接,释放相关资源。断开后需要重新调用 ConnectSync() 才能再次通信。 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 断开连接操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/Connect.cs ```cs using Agilebot.IR; public class Connect { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接到捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 检查连接状态 // [EN] Check the connection status var state = controller.IsConnected(); Console.WriteLine("Connected: " + state); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.4 获取当前机器人型号 [​](#4-1-4) | 方法名 | **GetArmModelInfo**() | | ---------- | ------------------------------------------------------------------------ | | 描述 | 获取当前连接的捷勃特机器人型号信息。返回机器人型号字符串(例如 “GBT-C5A”)和操作执行状态。 | | 请求参数 | 无参数 | | 返回值 | string: 机器人型号字符串,例如 "GBT-C5A" [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetArmModelInfo.cs ```cs using Agilebot.IR; public class GetArmModelInfo { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接到捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取机器人型号信息 // [EN] Get the robot model information (string info, code) = controller.GetArmModelInfo(); if (code != StatusCode.OK) { Console.WriteLine("Get Robot Model Failed: " + code.GetDescription()); } else { Console.WriteLine("Model: " + info); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.5 获取机器人运行状态 [​](#4-1-5) | 方法名 | **GetRobotState**() | | ---------- | --------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人的当前运行状态。返回机器人运行状态枚举值和操作执行状态。 | | 请求参数 | 无参数 | | 返回值 | [RobotState](./../3-struct/#3-2): 机器人运行状态枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetRobotState.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetRobotState { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取机器人运行状态 // [EN] Get the robot running state (RobotState state, code) = controller.GetRobotState(); if (code != StatusCode.OK) { Console.WriteLine("Get RobotState Failed: " + code.GetDescription()); } else { Console.WriteLine("RobotState: " + state); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.6 获取当前控制器运行状态 [​](#4-1-6) | 方法名 | **GetCtrlState**() | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人控制器的当前运行状态。返回控制器运行状态枚举值和操作执行状态。 | | 请求参数 | 无参数 | | 返回值 | [CtrlState](./../3-struct/#3-3): 控制器运行状态枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetCtrlState.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetCtrlState { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取控制器运行状态 // [EN] Get the controller running state (CtrlState state, code) = controller.GetCtrlState(); if (code != StatusCode.OK) { Console.WriteLine("Get CtrlState Failed: " + code.GetDescription()); } else { Console.WriteLine("CtrlState: " + state); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.7 获取当前伺服状态 [​](#4-1-7) | 方法名 | **GetServoState**() | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人伺服系统的当前状态。返回伺服系统状态枚举值和操作执行状态。 | | 请求参数 | 无参数 | | 返回值 | [ServoState](./../3-struct/#3-4): 伺服系统状态枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetServoState.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetServoState { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取伺服运行状态 // [EN] Get the servo operating state (ServoState state, code) = controller.GetServoState(); if (code != StatusCode.OK) { Console.WriteLine("Get ServoState Failed: " + code.GetDescription()); } else { Console.WriteLine("ServoState: " + state); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.8 获取机器人控制器版本 [​](#4-1-8) | 方法名 | **GetVersion**() | | ---------- | ------------------------------------------------------------- | | 描述 | 获取捷勃特机器人控制器的软件版本信息。返回控制器软件版本字符串和操作执行状态。 | | 请求参数 | 无参数 | | 返回值 | string: 控制器软件版本字符串 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetVersion.cs ```cs using Agilebot.IR; public class GetVersion { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取机器人控制器版本 // [EN] Get the robot controller version string version; (version, code) = controller.GetVersion(); if (code != StatusCode.OK) { Console.WriteLine("Get version Failed: " + code.GetDescription()); } else { Console.WriteLine("Version: " + version); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.9 设置机器人的 LED 指示灯 [​](#4-1-9) | 方法名 | **SwitchLedLight**( bool mode ) | | ---------- | ----------------------------------------------- | | 描述 | 控制捷勃特机器人 LED 指示灯的开关状态。 true 开启指示灯, false 关闭指示灯。 | | 请求参数 | mode : bool LED 指示灯控制模式,true 表示开启,false 表示关闭 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容性 | 仅支持协作机器人,需要控制器版本 1.3.6 及以上,工业机器人不支持 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.1.3+ 工业 (Bronze): 不支持 | 示例代码 Arm/SwitchLedLight.cs ```cs using Agilebot.IR; public class SwitchLedLight { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 关闭灯光 // [EN] Turn off the LED light code = controller.SwitchLedLight(false); if (code != StatusCode.OK) { Console.WriteLine("Switch Led Failed: " + code.GetDescription()); } else { Console.WriteLine("Switch Led Light Off."); } Thread.Sleep(2000); // [ZH] 打开灯光 // [EN] Turn on the LED light code = controller.SwitchLedLight(true); if (code != StatusCode.OK) { Console.WriteLine("Switch Led Failed: " + code.GetDescription()); } else { Console.WriteLine("Switch Led Light On."); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Disconnect from the robot StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.10 机器人伺服启动 [​](#4-1-10) | 方法名 | **ServoOn**() | | ---------- | ---------------------------------------------- | | 描述 | 启动捷勃特机器人的伺服系统,使机器人进入可控制状态。伺服启动后,机器人可以接受运动指令。 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 伺服启动操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.11 机器人伺服关闭 [​](#4-1-11) | 方法名 | **ServoOff**() | | ---------- | ---------------------------------------------- | | 描述 | 关闭捷勃特机器人的伺服系统,使机器人进入安全停止状态。伺服关闭后,机器人将无法运动。 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 伺服关闭操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.12 让机器人伺服重置 [​](#4-1-12) | 方法名 | **ServoReset**() | | ---------- | ----------------------------------------------- | | 描述 | 重置捷勃特机器人的伺服系统,清除错误状态并准备重新启动。通常在伺服故障后调用此方法以恢复系统。 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 伺服重置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/ServoOperation.cs ```cs using Agilebot.IR; public class ServoOperation { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 机械臂伺服重置 // [EN] Reset the robot arm servo code = controller.ServoReset(); if (code != StatusCode.OK) { Console.WriteLine("Servo Reset Failed: " + code.GetDescription()); } else { Console.WriteLine("Servo Reset Success."); } Thread.Sleep(3000); // [ZH] 机械臂伺服关闭 // [EN] Turn off the robot arm servo code = controller.ServoOff(); if (code != StatusCode.OK) { Console.WriteLine("Servo Off Failed: " + code.GetDescription()); } else { Console.WriteLine("Servo Off Success."); } Thread.Sleep(3000); // [ZH] 机械臂伺服打开 // [EN] Turn on the robot arm servo code = controller.ServoOn(); if (code != StatusCode.OK) { Console.WriteLine("Servo On Failed: " + code.GetDescription()); } else { Console.WriteLine("Servo On Success."); } Thread.Sleep(3000); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.13 机器人紧急停止 [​](#4-1-13) | 方法名 | **Estop**() | | ---------- | ----------------------------------------------------- | | 描述 | 执行捷勃特机器人的紧急停止,立即停止所有运动并进入安全状态。紧急停止后,需要重新启动伺服系统才能恢复运动。 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 紧急停止操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/Estop.cs ```cs using Agilebot.IR; public class Estop { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接到捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 触发机器人急停 // [EN] Trigger the robot emergency stop code = controller.Estop(); if (code != StatusCode.OK) { Console.WriteLine("Emergency Stop Failed: " + code.GetDescription()); } else { Console.WriteLine("Emergency Stop Success"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.2-motion.html title: 4.2 机器人运动控制和状态 --- # 4.2 机器人运动控制和状态 [​](#4-2) ## 概述 [​](#概述) Motion 类是捷勃特机器人运动控制的核心对象,负责封装以下核心功能: * 速度 / 加速度参数管理 * 坐标系管理 * 点位转换 * 轨迹运动控制 * 拖动示教 * 实时控制 * 负载管理 ### 常见使用流程 [​](#常见使用流程) 在 `Arm` 完成连接后,通过 `arm.Motion` 获取 Motion 实例,无需单独初始化。 ## 4.2.1 获取机器人参数 [​](#4-2-1) ### 4.2.1.1 获取 OVC 全局速度比率 [​](#4-2-1-1) | 方法名 | **Motion.GetOVC**() | | ---------- | ------------------------------------------------------------------ | | 描述 | 获取当前机器人的 OVC(Overall Velocity Control)全局速度比率,比率范围为 0\~1 | | 请求参数 | 无 | | 返回值 | double: 速度比率,结果范围为 0\~1 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.2 获取 OAC 全局加速度比率 [​](#4-2-1-2) | 方法名 | **Motion.GetOAC**() | | ---------- | --------------------------------------------------------------------- | | 描述 | 获取当前机器人的 OAC(Overall Acceleration Control)全局加速度比率,比率范围为 0\~1.2 | | 请求参数 | 无 | | 返回值 | double: 加速度比率,结果范围为 0\~1.2 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.3 获取当前使用的 TF 工具坐标系编号 [​](#4-2-1-3) | 方法名 | **Motion.GetTF**() | | ---------- | ------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TF(Tool Frame)工具坐标系编号,序号范围为 0\~10 | | 请求参数 | 无 | | 返回值 | int: 工具坐标系编号 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.4 获取当前使用的 UF 用户坐标系编号 [​](#4-2-1-4) | 方法名 | **Motion.GetUF**() | | ---------- | ------------------------------------------------------- | | 描述 | 获取当前机器人使用的 UF(User Frame)用户坐标系编号,序号范围为 0\~10 | | 请求参数 | 无 | | 返回值 | int: 用户坐标系编号 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.5 获取当前使用的 TCS 示教坐标系 [​](#4-2-1-5) | 方法名 | **Motion.GetTCS**() | | ---------- | --------------------------------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TCS(Teach Coordinate System)示教坐标系,具体参见[ TCSType](./../3-struct/#3-8) | | 请求参数 | 无 | | 返回值 | [TCSType](./../3-struct/#3-8): 示教坐标系类型 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/GetMotionParameters.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetMotionParameters { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取 OVC 全局速度比率 // [EN] Get OVC global speed ratio double ovc; (ovc, code) = controller.Motion.GetOVC(); if (code == StatusCode.OK) { Console.WriteLine($"OVC = {ovc}"); } else { Console.WriteLine($"获取OVC失败: {code.GetDescription()}"); } // [ZH] 获取 OAC 全局加速度比率 // [EN] Get OAC global acceleration ratio double oac; (oac, code) = controller.Motion.GetOAC(); if (code == StatusCode.OK) { Console.WriteLine($"OAC = {oac}"); } else { Console.WriteLine($"获取OAC失败: {code.GetDescription()}"); } // [ZH] 获取当前使用的 TF // [EN] Get current TF (Tool Frame) int tf; (tf, code) = controller.Motion.GetTF(); if (code == StatusCode.OK) { Console.WriteLine($"TF = {tf}"); } else { Console.WriteLine($"获取TF失败: {code.GetDescription()}"); } // [ZH] 获取当前使用的 UF // [EN] Get current UF (User Frame) int uf; (uf, code) = controller.Motion.GetUF(); if (code == StatusCode.OK) { Console.WriteLine($"UF = {uf}"); } else { Console.WriteLine($"获取UF失败: {code.GetDescription()}"); } // [ZH] 获取当前使用的 TCS 示教坐标系 // [EN] Get current TCS teaching coordinate system TCSType tcs; (tcs, code) = controller.Motion.GetTCS(); if (code == StatusCode.OK) { Console.WriteLine($"TCSType = {tcs}"); } else { Console.WriteLine($"获取TCS失败: {code.GetDescription()}"); } // [ZH] 获取机器人软限位 // [EN] Get robot soft limits List> softLimit; (softLimit, code) = controller.Motion.GetUserSoftLimit(); if (code == StatusCode.OK) { Console.WriteLine("软限位信息:"); for (int i = 0; i < softLimit.Count; i++) { Console.WriteLine($"轴{i + 1}: 下限={softLimit[i][0]}, 上限={softLimit[i][1]}"); } } else { Console.WriteLine($"获取软限位失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.2 设置机器人参数 [​](#4-2-2) ### 4.2.2.1 设置 OVC 全局速度比率 [​](#4-2-2-1) | 方法名 | **Motion.SetOVC**( double value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置机器人的 OVC 全局速度比率 | | 请求参数 | value : double 速度比率,范围为 0\~1 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.2 设置 OAC 全局加速度比率 [​](#4-2-2-2) | 方法名 | **Motion.SetOAC**( double value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置机器人的 OAC 全局加速度比率 | | 请求参数 | value : double 加速度比率,范围为 0.01\~1.2 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.3 设置当前使用的 TF 工具坐标系 [​](#4-2-2-3) | 方法名 | **Motion.SetTF**( int value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置机器人当前使用的 TF 工具坐标系 | | 请求参数 | value : int 工具坐标系编号,范围为 0\~10 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.4 设置当前使用的 UF 用户坐标系 [​](#4-2-2-4) | 方法名 | **Motion.SetUF**( int value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置机器人当前使用的 UF 用户坐标系 | | 请求参数 | value : int 用户坐标系编号,范围为 0\~10 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.5 设置当前使用的 TCS 示教坐标系 [​](#4-2-2-5) | 方法名 | **Motion.SetTCS**( TCSType value ) | | ---------- | ------------------------------------------------------- | | 描述 | 设置机器人当前使用的 TCS 示教坐标系,具体参见[ TCSType](./../3-struct/#3-8) | | 请求参数 | value : [TCSType](./../3-struct/#3-8) TCS 示教坐标系类型 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/SetMotionParameters.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class SetMotionParameters { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置 OVC 全局速度比率 // [EN] Set OVC global speed ratio code = controller.Motion.SetOVC(0.5); if (code == StatusCode.OK) { Console.WriteLine("设置OVC成功"); } else { Console.WriteLine($"设置OVC失败: {code.GetDescription()}"); } // [ZH] 设置 OAC 全局加速度比率 // [EN] Set OAC global acceleration ratio code = controller.Motion.SetOAC(0.8); if (code == StatusCode.OK) { Console.WriteLine("设置OAC成功"); } else { Console.WriteLine($"设置OAC失败: {code.GetDescription()}"); } // [ZH] 设置当前使用的 TF 用户坐标系编号 // [EN] Set current TF (Tool Frame) user coordinate system number code = controller.Motion.SetTF(2); if (code == StatusCode.OK) { Console.WriteLine("设置TF成功"); } else { Console.WriteLine($"设置TF失败: {code.GetDescription()}"); } // [ZH] 设置当前使用的 UF 工具坐标系编号 // [EN] Set current UF (User Frame) tool coordinate system number code = controller.Motion.SetUF(1); if (code == StatusCode.OK) { Console.WriteLine("设置UF成功"); } else { Console.WriteLine($"设置UF失败: {code.GetDescription()}"); } // [ZH] 设置当前使用的 TCS 示教坐标系 // [EN] Set current TCS teaching coordinate system code = controller.Motion.SetTCS(TCSType.TOOL); if (code == StatusCode.OK) { Console.WriteLine("设置TCS成功"); } else { Console.WriteLine($"设置TCS失败: {code.GetDescription()}"); } // [ZH] 设置UDP位置控制的相关参数 // [EN] Set UDP position control related parameters code = controller.Motion.SetPositionTrajectoryParams(10, 20, 10, 10); if (code == StatusCode.OK) { Console.WriteLine("设置位置控制参数成功"); } else { Console.WriteLine($"设置位置控制参数失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.3 将笛卡尔点位转换成关节值点位 [​](#4-2-3) | 方法名 | **Motion.ConvertCartToJoint**( MotionPose pose , int ufIndex \= 0, int tfIndex \= 0 ) | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将位姿数据从笛卡尔点位转换成关节值点位表达 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 机器人的笛卡尔位姿 (PoseType.CART;未指定 posture 时 SDK 自动求解可行姿态) ufIndex : int 用户坐标系索引,默认为 0 tfIndex : int 工具坐标系索引,默认为 0 | | 返回值 | [MotionPose](./../3-struct/#3-9): 转换后的机器人位姿数据 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/ConvertCartToJoint.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class ConvertCartToJoint { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 创建笛卡尔位姿 // [EN] Create Cartesian pose MotionPose motionPose = new MotionPose(); motionPose.Pt = PoseType.Cart; motionPose.CartData.Position = new Position { X = 300, Y = 300, Z = 300, A = 0, B = 0, C = 0, }; motionPose.CartData.Posture = new Posture { WristFlip = 1, ArmUpDown = 1, ArmBackFront = 1, ArmLeftRight = 1, TurnCircle = new List(9) { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; // [ZH] 将笛卡尔点位转换成关节值点位 // [EN] Convert Cartesian pose to joint pose MotionPose convertPose; (convertPose, code) = controller.Motion.ConvertCartToJoint(motionPose); if (code == StatusCode.OK) { Console.WriteLine("笛卡尔转关节成功:"); Console.WriteLine( $"关节值: J1={convertPose.Joint.J1}, J2={convertPose.Joint.J2}, J3={convertPose.Joint.J3}, J4={convertPose.Joint.J4}, J5={convertPose.Joint.J5}, J6={convertPose.Joint.J6}" ); } else { Console.WriteLine($"笛卡尔转关节失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.4 将关节值点位转换成笛卡尔点位 [​](#4-2-4) | 方法名 | **Motion.ConvertJointToCart**( MotionPose pose , int ufIndex \= 0, int tfIndex \= 0 ) | | ---------- | -------------------------------------------------------------------------------------------------------- | | 描述 | 将关节值点位转换成笛卡尔点位表达 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 机器人的关节位姿 ufIndex : int 用户坐标系索引,默认为 0 tfIndex : int 工具坐标系索引,默认为 0 | | 返回值 | [MotionPose](./../3-struct/#3-9): 转换后的机器人位姿数据 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/ConvertJointToCart.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class ConvertJointToCart { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 创建关节位姿 // [EN] Create joint pose MotionPose motionPose = new MotionPose(); motionPose.Pt = PoseType.Joint; motionPose.Joint = new Joint { J1 = 0, J2 = 0, J3 = 60, J4 = 60, J5 = 0, J6 = 0, }; // [ZH] 将关节值点位转换成笛卡尔点位 // [EN] Convert joint pose to Cartesian pose MotionPose convertPose; (convertPose, code) = controller.Motion.ConvertJointToCart(motionPose); if (code == StatusCode.OK) { Console.WriteLine("关节转笛卡尔成功:"); Console.WriteLine( $"位置: X={convertPose.CartData.Position.X}, Y={convertPose.CartData.Position.Y}, Z={convertPose.CartData.Position.Z}" ); Console.WriteLine( $"姿态: A={convertPose.CartData.Position.A}, B={convertPose.CartData.Position.B}, C={convertPose.CartData.Position.C}" ); } else { Console.WriteLine($"关节转笛卡尔失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.5 关节运动 [​](#4-2-5) | 方法名 | **Motion.MoveJoint**( MotionPose pose , double vel \= 1, double acc \= 1 ) | | ---------- | -------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人末端沿关节空间最快路径移动到指定位置 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 笛卡尔空间或关节坐标系点位 vel : double 速度比率,范围为 0\~1 acc : double 加速度比率,范围为 0\~1.2 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/MoveJoint.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class MoveJoint { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 创建关节位姿 // [EN] Create joint pose MotionPose motionPose = new MotionPose(); motionPose.Pt = PoseType.Joint; motionPose.Joint = new Joint { J1 = 10, J2 = 30, J3 = 30, J4 = 0, J5 = 0, J6 = 0, }; // [ZH] 让机器人末端移动到指定的位置 // [EN] Move robot end to specified position code = controller.Motion.MoveJoint(motionPose, 0.5, 0.8); if (code == StatusCode.OK) { Console.WriteLine("关节运动请求成功"); } else { Console.WriteLine($"关节运动失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.6 直线运动 [​](#4-2-6) | 方法名 | **Motion.MoveLine**(MotionPose pose , double vel \= 100, double acc \= 1) | | ---------- | ---------------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人末端沿直线移动到指定位置,运动轨迹为两点之间的直线 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 笛卡尔空间或关节坐标系点位 vel : double 末端速度,范围为 0\~5000 mm/s acc : double 加速度比率,范围为 0\~1.2 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/MoveLine.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class MoveLine { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 创建关节位姿 // [EN] Create joint pose MotionPose motionPose = new MotionPose(); motionPose.Pt = PoseType.Joint; motionPose.Joint = new Joint { J1 = 20, J2 = 40, J3 = 40, J4 = 5, J5 = 5, J6 = 5, }; // [ZH] 让机器人末端沿直线移动到指定的位置 // [EN] Move robot end in straight line to specified position code = controller.Motion.MoveLine(motionPose, 100, 1.0); if (code == StatusCode.OK) { Console.WriteLine("直线运动请求成功"); } else { Console.WriteLine($"直线运动失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.7 圆弧运动 [​](#4-2-7) | 方法名 | **Motion.MoveCircle**(MotionPose pose1 , MotionPose pose2 , double vel = 100, double acc = 1) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人末端沿圆弧轨迹移动到指定位置,通过途经点和终点确定圆弧 | | 请求参数 | pose1 : [MotionPose](./../3-struct/#3-9) 途经点位姿 pose2 : [MotionPose](./../3-struct/#3-9) 终点位姿 vel : double 末端速度,范围为 0\~5000 mm/s acc : double 加速度比率,范围为 0\~1.2 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/MoveCircle.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class MoveCircle { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 创建第一个位姿(途径点) // [EN] Create first pose (waypoint) MotionPose motionPose1 = new MotionPose(); motionPose1.Pt = PoseType.Joint; motionPose1.Joint = new Joint { J1 = 0, J2 = 0, J3 = 60, J4 = 60, J5 = 0, J6 = 0, }; // [ZH] 创建第二个位姿(终点) // [EN] Create second pose (endpoint) MotionPose motionPose2 = new MotionPose(); motionPose2.Pt = PoseType.Joint; motionPose2.Joint = new Joint { J1 = 0, J2 = 30, J3 = 70, J4 = 40, J5 = 0, J6 = 0, }; // [ZH] 让机器人末端沿弧线移动到指定的位置 // [EN] Move robot end in arc to specified position code = controller.Motion.MoveCircle(motionPose1, motionPose2, 100, 1.0); if (code == StatusCode.OK) { Console.WriteLine("弧线运动请求成功"); } else { Console.WriteLine($"弧线运动失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.8 获取当前位姿 [​](#4-2-8) | 方法名 | **Motion.GetCurrentPose**(PoseType pt , int ufIndex \= 0, int tfIndex \= 0) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取机器人当前位姿,支持笛卡尔空间或关节坐标系下的位姿信息 | | 请求参数 | pt : [PoseType](./../3-struct/#3-12) 位姿类型 ufIndex : int 用户坐标系索引 (仅 PoseType.CART 生效;默认 0) tfIndex : int 工具坐标系索引 (仅 PoseType.CART 生效;默认 0) | | 返回值 | [MotionPose](./../3-struct/#3-9): 机器人位姿数据 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/GetCurrentPose.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class GetCurrentPose { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人的当前位姿(笛卡尔坐标) // [EN] Get robot current pose (Cartesian coordinates) MotionPose cartPose; (cartPose, code) = controller.Motion.GetCurrentPose(PoseType.Cart, 0, 0); if (code == StatusCode.OK) { Console.WriteLine("当前笛卡尔位姿:"); Console.WriteLine( $"位置: X={cartPose.CartData.Position.X}, Y={cartPose.CartData.Position.Y}, Z={cartPose.CartData.Position.Z}" ); Console.WriteLine( $"姿态: A={cartPose.CartData.Position.A}, B={cartPose.CartData.Position.B}, C={cartPose.CartData.Position.C}" ); } else { Console.WriteLine($"获取笛卡尔位姿失败: {code.GetDescription()}"); } // [ZH] 获取机器人的当前位姿(关节坐标) // [EN] Get robot current pose (joint coordinates) MotionPose jointPose; (jointPose, code) = controller.Motion.GetCurrentPose(PoseType.Joint, 0, 0); if (code == StatusCode.OK) { Console.WriteLine("当前关节位姿:"); Console.WriteLine( $"关节值: J1={jointPose.Joint.J1}, J2={jointPose.Joint.J2}, J3={jointPose.Joint.J3}, J4={jointPose.Joint.J4}, J5={jointPose.Joint.J5}, J6={jointPose.Joint.J6}" ); } else { Console.WriteLine($"获取关节位姿失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.9 获取 DH 参数 [​](#4-2-9) | 方法名 | **Motion.GetDHParam**() | | ---------- | ----------------------------------------------------------------------------------------- | | 描述 | 获取机器人的 DH 参数 | | 请求参数 | 无 | | 返回值 | List<[DHparam](./../3-struct/#3-13)\>: DH 参数列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 Motion/GetDHParam.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetDHParam { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人的DH参数 // [EN] Get robot DH parameters List dhParamsList; (dhParamsList, code) = controller.Motion.GetDHParam(1); if (code == StatusCode.OK) { Console.WriteLine("获取DH参数成功:"); for (int i = 0; i < dhParamsList.Count; i++) { var dh = dhParamsList[i]; Console.WriteLine($"轴{i + 1}: Alpha={dh.alpha}, A={dh.a}, D={dh.d}, Offset={dh.offset}"); } } else { Console.WriteLine($"获取DH参数失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.10 设置 DH 参数 [​](#4-2-10) | 方法名 | **Motion.SetDHParam**(List<[DHparam](./../3-struct/#3-13)\> dHparams ) | | ---------- | ---------------------------------------------------------------------- | | 描述 | 设置机器人的 DH 参数 | | 请求参数 | dHparams : List<[DHparam](./../3-struct/#3-13)\> DH 参数列表 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 Motion/SetDHParam.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class SetDHParam { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 先获取当前的DH参数 // [EN] First get current DH parameters List dhParamsList; (dhParamsList, code) = controller.Motion.GetDHParam(1); if (code != StatusCode.OK) { Console.WriteLine($"获取DH参数失败: {code.GetDescription()}"); return code; } Console.WriteLine("获取DH参数成功,准备设置相同的参数..."); // [ZH] 设置DH参数(这里设置为相同的参数作为示例) // [EN] Set DH parameters (set same parameters as example) code = controller.Motion.SetDHParam(dhParamsList); if (code == StatusCode.OK) { Console.WriteLine("设置DH参数成功"); } else { Console.WriteLine($"设置DH参数失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.11 获取轴锁定状态 [​](#4-2-11) | 方法名 | **Motion.GetDragSet**() | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人轴锁定状态,轴锁定仅针对示教运动 | | 请求参数 | 无 | | 返回值 | [DragStatus](./../3-struct/#3-16): 轴锁定状态,True 表示该轴为可移动状态,False 表示被锁定 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | ## 4.2.12 设定机器人轴锁定状态 [​](#4-2-12) | 方法名 | **Motion.SetDragSet**(DragStatus dragStatus ) | | ---------- | ------------------------------------------------------------------- | | 描述 | 设定当前机器人轴锁定状态,轴锁定只针对示教运动 | | 请求参数 | dragStatus : [DragStatus](./../3-struct/#3-16) 各轴锁定状态(默认全部 True:解锁) | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | ## 4.2.13 设定当前机器人是否启动拖动 [​](#4-2-13) | 方法名 | **Motion.EnableDrag**(bool dragState ) | | ---------- | -------------------------------------------------- | | 描述 | 设定当前机器人是否启动拖动示教功能 | | 请求参数 | dragState : bool 机器人拖动开关(true 进入拖动状态,false 退出拖动状态) | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 Motion/DragControl.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class DragControl { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取当前机器人的轴锁定状态 // [EN] Get current robot axis lock status DragStatus dragStatus; (dragStatus, code) = controller.Motion.GetDragSet(); if (code == StatusCode.OK) { Console.WriteLine("获取轴锁定状态成功:"); Console.WriteLine( $"X轴: {dragStatus.CartStatus.X}, Y轴: {dragStatus.CartStatus.Y}, Z轴: {dragStatus.CartStatus.Z}" ); Console.WriteLine($"连续拖动: {dragStatus.IsContinuousDrag}"); } else { Console.WriteLine($"获取轴锁定状态失败: {code.GetDescription()}"); } // [ZH] 修改当前机器人的轴锁定状态 // [EN] Modify current robot axis lock status if (code == StatusCode.OK) { dragStatus.CartStatus.X = false; dragStatus.IsContinuousDrag = true; code = controller.Motion.SetDragSet(dragStatus); if (code == StatusCode.OK) { Console.WriteLine("设置轴锁定状态成功"); } else { Console.WriteLine($"设置轴锁定状态失败: {code.GetDescription()}"); } } // [ZH] 启动拖动(注意:实际使用中需要谨慎) // [EN] Enable drag (Note: use with caution in practice) if (code == StatusCode.OK) { Console.WriteLine("注意:启动拖动功能,请确保安全!"); code = controller.Motion.EnableDrag(true); if (code == StatusCode.OK) { Console.WriteLine("启动拖动成功"); // [ZH] 等待一段时间后停止拖动 // [EN] Wait for a while then stop drag Console.WriteLine("等待3秒后停止拖动..."); Thread.Sleep(3000); code = controller.Motion.EnableDrag(false); if (code == StatusCode.OK) { Console.WriteLine("停止拖动成功"); } else { Console.WriteLine($"停止拖动失败: {code.GetDescription()}"); } } else { Console.WriteLine($"启动拖动失败: {code.GetDescription()}"); } } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ## 4.2.14 进入实时位置控制模式 [​](#4-2-14) | 方法名 | **Motion.EnterPositionControl**() | | ---------- | -------------------------------------------- | | 描述 | 进入实时位置控制模式,允许对机器人进行精确的位置控制 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 模式切换操作执行结果 | | 备注 | 在进入实时控制模式后,必须通过 UDP 发送控制指令 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.15 退出实时位置控制模式 [​](#4-2-15) | 方法名 | **Motion.ExitPositionControl**() | | ---------- | -------------------------------------------- | | 描述 | 退出实时位置控制模式,恢复默认的机器人控制状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 模式切换操作执行结果 | | 备注 | 退出后,机器人将不再接受实时控制指令 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.16 获取 UDP 反馈配置 [​](#4-2-16) | 方法名 | **Motion.GetUDPFeedbackConfig**( int id ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 UDP 机器人状态配置文件 rtf\_info.json | | 请求参数 | id : int 配置 ID,从 1 开始 | | 返回值 | [UDPFeedbackConfig](./../3-struct/#3-1): 指定 ID 的 UDP 机器人状态配置 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 备注 | 配置约束:1\. 当存在多个配置时,只能有一个配置的 sub\_flag 为 true,其他应为 false。2\. 当 use\_multicast 为 true 时,client\_ip 仅支持一个 239._._.\* 格式的组播地址。3\. 当 use\_multicast 为 false 时,client\_ip 支持多个局域网单播地址。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.17 设置 UDP 反馈配置 [​](#4-2-17) | 方法名 | **Motion.SetUDPFeedbackConfig**( UDPFeedbackConfig config ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入 UDP 机器人状态配置文件 rtf\_info.json | | 请求参数 | config : [UDPFeedbackConfig](./../3-struct/#3-1) UDP 机器人状态配置,配置中的 ID 从 1 开始 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 备注 | 配置约束:1\. 当存在多个配置时,只能有一个配置的 sub\_flag 为 true,其他应为 false。2\. 当 use\_multicast 为 true 时,client\_ip 仅支持一个 239._._.\* 格式的组播地址。3\. 当 use\_multicast 为 false 时,client\_ip 支持多个局域网单播地址。此接口仅写入配置文件,不会立即生效。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.18 启用 UDP 反馈 [​](#4-2-18) | 方法名 | **Motion.EnableUDPFeedback**( int id ) | | ---------- | --------------------------------------------------------- | | 描述 | 启用指定 ID 的 UDP 机器人状态配置,并同步 rtf\_info.json 使其立即生效 | | 请求参数 | id : int 配置 ID,从 1 开始 | | 返回值 | [StatusCode](./../3-struct/#3-1): 启用操作执行结果 | | 备注 | 执行后,只有指定 ID 的 sub\_flag 为 true,其他所有配置的 sub\_flag 为 false。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.19 禁用 UDP 反馈 [​](#4-2-19) | 方法名 | **Motion.DisableUDPFeedback**( int id ) | | ---------- | ----------------------------------------------- | | 描述 | 禁用指定 ID 的 UDP 机器人状态配置,并同步 rtf\_info.json 使其立即生效 | | 请求参数 | id : int 配置 ID,从 1 开始 | | 返回值 | [StatusCode](./../3-struct/#3-1): 禁用操作执行结果 | | 备注 | 执行后,所有配置的 sub\_flag 都为 false。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.20 设置订阅参数 [​](#4-2-20) | 方法名 | **Motion.SetUDPFeedbackParams**( bool flag , string ip , int interval , int feedbackType , List DOList \= null ) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 配置机器人向指定 IP 地址推送数据的 UDP 反馈参数 | | 请求参数 | flag : bool 是否开启 UDP 数据推送 ip : string 接收端 IP 地址 interval : int 发送间隔(单位:毫秒) feedbackType : int 反馈数据格式(0:XML 格式) DOList : List DO 信号列表(最多 10 个,可选) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置操作执行结果 | | 备注 | 参数设置仅在 UDP 数据推送功能启用时有效 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | 示例代码 Motion/PositionControl.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class PositionControl { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置UDP反馈参数 // [EN] Set UDP feedback parameters code = controller.Motion.SetUDPFeedbackParams(true, "192.168.1.1", 10, 0); if (code == StatusCode.OK) { Console.WriteLine("设置UDP反馈参数成功"); } else { Console.WriteLine($"设置UDP反馈参数失败: {code.GetDescription()}"); } // [ZH] 进入实时位置控制模式 // [EN] Enter real-time position control mode code = controller.Motion.EnterPositionControl(); if (code == StatusCode.OK) { Console.WriteLine("进入实时位置控制模式成功"); // [ZH] 在此可以插入发送UDP数据控制机器人的代码 // [EN] Insert UDP data control code here Console.WriteLine("注意:在实时位置控制模式下,需要通过UDP发送控制指令"); Console.WriteLine("等待2秒..."); Thread.Sleep(2000); // [ZH] 退出实时位置控制模式 // [EN] Exit real-time position control mode code = controller.Motion.ExitPositionControl(); if (code == StatusCode.OK) { Console.WriteLine("退出实时位置控制模式成功"); } else { Console.WriteLine($"退出实时位置控制模式失败: {code.GetDescription()}"); } } else { Console.WriteLine($"进入实时位置控制模式失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ### 推送数据说明 [​](#推送数据说明) | 名称 | 字段 | 描述 | | ------------------------- | ---------------------------------------------------------------------------- | ------------------ | | **RIst: 笛卡尔位置** | X | 工具坐标系下 X 方向值,单位为毫米 | | Y | 工具坐标系下 Y 方向值,单位为毫米 | | | Z | 工具坐标系下 Z 方向值,单位为毫米 | | | A | 工具坐标系下绕 X 方向旋转,单位为度 | | | B | 工具坐标系下绕 Y 方向旋转,单位为度 | | | C | 工具坐标系下绕 Z 方向旋转,单位为度 | | | **AIPos: 关节位置** | A1-A6 | 六个关节的值,单位为角度 | | **EIPos: 附加轴数据** | EIPos | 附加轴数据 | | **WristBtnState: 手腕按键状态** | 按键状态 | 1 = 按键按下,0 = 按键抬起 | | DragModel | 拖拽按键状态 | | | RecordJoint | 示教记录按键状态 | | | PauseResume | 暂停恢复按键状态 | | | **Digout: DO 输出** | Digout | 数字输出(DO)的状态 | | **ProgramStatus: 程序状态** | ProgId | 程序 ID | | Status | 解释器执行状态:0 = INTERPRETER\_IDLE1 = INTERPRETER\_EXECUTE2 = INTERPRETER\_PAUSED | | | Xpath | 程序片段返回值,格式为 程序名:行号 | | | **IPOC: 时间戳** | IPOC | 时间戳 | ## 4.2.21 获取机器人软限位 [​](#4-2-21) | 方法名 | **Motion.GetUserSoftLimit**() | | ---------- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人软限位信息 | | 请求参数 | 无 | | 返回值 | List>: 机器人软限位信息,列表第一层代表各轴,第二层代表每个轴的下限位和上限位值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.22 指定 UDP 位置控制的相关参数 [​](#4-2-22) | 方法名 | **Motion.SetPositionTrajectoryParams**(int maxTimeoutCount , int timeout , int filterLayer , double wristElbowThreshold , double shoulderThreshold ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 设置 UDP 位置控制的相关参数 | | 请求参数 | maxTimeoutCount : int 最大超时次数,取值范围 \[1,100\] timeout : int 超时时间(即发送间隔,默认为 20ms),取值范围 \[1,100\] filterLayer : int 滤波层级,取值范围 \[1,100\] wristElbowThreshold : double 腕 / 肘部接近奇异点的阈值,取值范围 \[10,100\] shoulderThreshold : double 接近肩部奇异点的阈值,取值范围 \[100,300\] | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.23 获取轨迹整形器参数 [​](#4-2-23) | 方法名 | **Motion.GetShapingParam**() | | ---------- | ------------------------------------------------------------------------- | | 描述 | 获取当前轨迹整形器参数值 | | 请求参数 | 无参数 | | 返回值 | int: 轨迹整形器参数值(范围 5\~15,0 代表关闭) [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.2.24 设置轨迹整形器参数 [​](#4-2-24) | 方法名 | **Motion.SetShapingParam**(int value ) | | ---------- | ------------------------------------------ | | 描述 | 设置轨迹整形器参数值 | | 请求参数 | value : int 轨迹整形器参数(范围 5\~15,0 代表关闭) | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.2.25 负载相关接口 [​](#4-2-25) ### 4.2.25.1 获取当前激活的负载 [​](#4-2-25-1) | 方法名 | **Motion.Payload.GetCurrentPayload**() | | ---------- | ---------------------------------------------------- | | 描述 | 获取当前激活的负载编号,返回对应的索引 | | 请求参数 | 无 | | 返回值 | int: 负载索引 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.25.2 获取对应的负载 [​](#4-2-25-2) | 方法名 | **Motion.Payload.GetPayloadById**( int index ) | | ---------- | ---------------------------------------------- | | 描述 | 根据索引获取对应的负载信息 | | 请求参数 | index : int 负载索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.25.3 激活对应的负载 [​](#4-2-25-3) | 方法名 | **Motion.Payload.SetCurrentPayload**( int index ) | | ---------- | ------------------------------------------------- | | 描述 | 根据索引激活指定负载 | | 请求参数 | index : int 负载索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 激活操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 负载 ID 必须是当前设备中存在的 | ### 4.2.25.4 获取所有负载信息 [​](#4-2-25-4) | 方法名 | **Motion.Payload.GetAllPayloadInfo**() | | ---------- | --------------------------------------------------------------------------- | | 描述 | 获取所有负载的详细信息 | | 请求参数 | 无 | | 返回值 | Dictionary: 负载信息字典 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.25.5 添加负载 [​](#4-2-25-5) | 方法名 | **Motion.Payload.AddPayload**( PayloadInfo payload ) | | ---------- | ---------------------------------------------------- | | 描述 | 添加新的负载 | | 请求参数 | payload : [PayloadInfo](./../3-struct/#3-6) 负载对象 | | 返回值 | [StatusCode](./../3-struct/#3-1): 添加操作执行结果 | | 备注 | 新的负载 ID 必须是当前设备中没有的且在 1\~10 之间 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.25.6 删除指定负载 [​](#4-2-25-6) | 方法名 | **Motion.Payload.DeletePayload**( int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定索引的负载 | | 请求参数 | index : int 负载索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 注意:无法删除当前激活的负载,如果要删除激活的负载,请先激活其他负载再删除当前负载 | ### 4.2.25.7 更新指定负载 [​](#4-2-25-7) | 方法名 | **Motion.Payload.UpdatePayload**( PayloadInfo payload ) | | ---------- | ------------------------------------------------------- | | 描述 | 更新指定负载信息 | | 请求参数 | payload : [PayloadInfo](./../3-struct/#3-6) 负载对象 | | 返回值 | [StatusCode](./../3-struct/#3-1): 更新操作执行结果 | | 备注 | 负载 ID 必须是当前设备中存在的 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Motion/PayloadControl.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; public class PayloadControl { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取负载列表 // [EN] Get payload list Dictionary payloadList; (payloadList, code) = controller.Motion.Payload.GetAllPayloadInfo(); if (code == StatusCode.OK) { Console.WriteLine("获取负载列表成功:"); foreach (var p in payloadList) { Console.WriteLine($"负载ID: {p.Key}, 描述: {p.Value}"); } } else { Console.WriteLine($"获取负载列表失败: {code.GetDescription()}"); } // [ZH] 获取当前激活的负载 // [EN] Get current active payload int currentPayload; (currentPayload, code) = controller.Motion.Payload.GetCurrentPayload(); if (code == StatusCode.OK) { Console.WriteLine($"当前激活的负载ID: {currentPayload}"); } else { Console.WriteLine($"获取当前负载失败: {code.GetDescription()}"); } // [ZH] 添加新负载 // [EN] Add new payload PayloadInfo payload = new() { Id = 3, Comment = "测试负载", Weight = 1.0, MassCenter = new() { X = 1, Y = 2, Z = 3, }, InertiaMoment = new() { LX = 10, LY = 20, LZ = 30, }, }; code = controller.Motion.Payload.AddPayload(payload); if (code == StatusCode.OK) { Console.WriteLine("添加负载成功"); } else { Console.WriteLine($"添加负载失败: {code.GetDescription()}"); } // [ZH] 设置当前激活的负载 // [EN] Set current active payload if (code == StatusCode.OK) { code = controller.Motion.Payload.SetCurrentPayload(3); if (code == StatusCode.OK) { Console.WriteLine("设置当前负载成功"); } else { Console.WriteLine($"设置当前负载失败: {code.GetDescription()}"); } } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` ### 4.2.25.8 检测 3 轴是否水平 [​](#4-2-25-8) | 方法名 | **Motion.Payload.CheckAxisThreeHorizontal**() | | ---------- | ----------------------------------------------------------- | | 描述 | 检测 3 轴是否水平 | | 请求参数 | 无 | | 返回值 | double: 3 轴的水平角度 [StatusCode](./../3-struct/#3-1): 检测操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 水平的角度必须在 - 1\~1 之间才能进行负载测定 | ### 4.2.25.9 获取负载测定状态 [​](#4-2-25-9) | 方法名 | **Motion.Payload.GetPayloadIdentifyState**() | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 获取负载测定的状态 | | 请求参数 | 无 | | 返回值 | [PayloadIdentifyState](./../3-struct/#3-7): 负载测定状态 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.25.10 开始负载测定 [​](#4-2-25-10) | 方法名 | **Motion.Payload.StartPayloadIdentify**(double weight , double angle ) | | ---------- | ---------------------------------------------------------------------- | | 描述 | 开始负载测定 | | 请求参数 | weight : double 负载重量(未知重量填 - 1) angle : double 6 轴允许转动的角度(30-90 度) | | 返回值 | [StatusCode](./../3-struct/#3-1): 负载测定启动操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 开始负载测定前必须先进入负载测定状态 | ### 4.2.25.11 获取负载测定结果 [​](#4-2-25-11) | 方法名 | **Motion.Payload.PayloadIdentifyResult**() | | ---------- | ------------------------------------------------------------------------------------ | | 描述 | 获取负载测定的结果 | | 请求参数 | 无 | | 返回值 | [PayloadInfo](./../3-struct/#3-6): 负载测定结果 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.25.12 开始负载辨识干涉检查 [​](#4-2-25-12) | 方法名 | **Motion.Payload.InterferenceCheckForPayloadIdentify**(double weight , double angle ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 开始负载测定的干涉检查,用于查看是否会发生碰撞 | | 请求参数 | weight : double 负载重量(未知重量填 - 1) angle : double 6 轴允许转动的角度(30-90 度) | | 返回值 | [StatusCode](./../3-struct/#3-1): 干涉检查操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.25.13 进入负载测定状态 [​](#4-2-25-13) | 方法名 | **Motion.Payload.PayloadIdentifyStart**() | | ---------- | -------------------------------------------- | | 描述 | 进入负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 状态切换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.25.14 结束负载测定状态 [​](#4-2-25-14) | 方法名 | **Motion.Payload.PayloadIdentifyDone**() | | ---------- | -------------------------------------------- | | 描述 | 结束负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 状态切换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.25.15 负载测定全流程 [​](#4-2-25-15) | 方法名 | **Motion.Payload.PayloadIdentify**( double weight \= -1, double angle \= 90 ) | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 完整的负载测定流程,包含上述负载测定全部接口,无特殊需求负载测定只用该接口即可 | | 请求参数 | weight : double 负载重量(未知重量填 - 1) angle : double 6 轴允许转动的角度(30-90 度) | | 返回值 | [PayloadInfo](./../3-struct/#3-6): 负载测定结果 [StatusCode](./../3-struct/#3-1): 负载测定操作执行结果 | | 备注 | 返回的负载可以新增到机器人中或写入机器人中已有的某个负载 全流程步骤: 1\. 进入负载测定状态 2\. 开始负载测定 3\. 获取负载测定结果 4\. 结束负载测定状态 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.25.16 终止负载测定 [​](#4-2-25-16) | 方法名 | **Motion.Payload.TerminatePayloadIdentify**() | | ---------- | --------------------------------------------- | | 描述 | 终止负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 状态切换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | 示例代码 Motion/PayloadIdentify.cs ```cs using Agilebot.IR; using Agilebot.IR.Motion; using Agilebot.IR.Types; public class PayloadIdentify { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人模式 // [EN] Get robot mode (UserOpMode opMode, StatusCode opCode) = controller.GetOpMode(); if (opCode == StatusCode.OK) { Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}"); if (opMode != UserOpMode.AUTO) { Console.WriteLine( $"负载测定执行必须在机器人自动模式下/Payload identification execution must be in automatic mode" ); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 检测3轴是否水平 // [EN] Check if axis 3 is horizontal double horizontalAngle; (horizontalAngle, code) = controller.Motion.Payload.CheckAxisThreeHorizontal(); if (code == StatusCode.OK) { Console.WriteLine($"3轴水平角度: {horizontalAngle}"); if (Math.Abs(horizontalAngle) > 1) { Console.WriteLine("警告:3轴水平角度超出范围(-1~1),无法进行负载测定"); return StatusCode.OtherReason; } } else { Console.WriteLine($"检测3轴水平失败: {code.GetDescription()}"); } // [ZH] 获取负载测定状态 // [EN] Get payload identification state PayloadIdentifyState identifyState; (identifyState, code) = controller.Motion.Payload.GetPayloadIdentifyState(); if (code == StatusCode.OK) { Console.WriteLine($"负载测定状态: {identifyState}"); } else { Console.WriteLine($"获取负载测定状态失败: {code.GetDescription()}"); } // [ZH] 执行完整的负载测定流程 // [EN] Execute complete payload identification process PayloadInfo payload; (payload, code) = controller.Motion.Payload.PayloadIdentify(-1, 90); if (code == StatusCode.OK) { Console.WriteLine("负载测定成功:"); Console.WriteLine($"负载重量: {payload.Weight}"); Console.WriteLine( $"质心位置: X={payload.MassCenter.X}, Y={payload.MassCenter.Y}, Z={payload.MassCenter.Z}" ); Console.WriteLine( $"惯性矩: LX={payload.InertiaMoment.LX}, LY={payload.InertiaMoment.LY}, LZ={payload.InertiaMoment.LZ}" ); // [ZH] 保存负载到机器人中 // [EN] Save payload to robot payload.Id = 6; code = controller.Motion.Payload.AddPayload(payload); if (code == StatusCode.OK) { Console.WriteLine("保存负载到机器人成功"); } else { Console.WriteLine($"保存负载失败: {code.GetDescription()}"); } } else { Console.WriteLine($"负载测定失败: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); Console.WriteLine( disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected." ); } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.3-execution.html title: 4.3 机器人程序操作类 --- # 4.3 机器人程序操作类 [​](#4-3) ## 概述 [​](#概述) Execution 类提供机器人程序与运动任务的统一调度接口,负责以下核心功能: * 启动 / 停止 / 暂停 / 恢复示教程序 * 管理并发运行的任务列表 * 执行 BAS 脚本等自定义流程 结合 `Arm` 与 `Motion` 的连接和运动能力,Execution 负责在上位机侧触发和管控控制器中的程序流程。 ## 4.3.1 执行指定程序 [​](#4-3-1) | 方法名 | **Execution.Start**(string programName ) | | ---------- | ---------------------------------------------- | | 描述 | 执行指定程序 | | 请求参数 | programName : string 程序名称 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.2 停止正在执行的程序 [​](#4-3-2) | 方法名 | **Execution.Stop**(string programName \= null) | | ---------- | ---------------------------------------------------- | | 描述 | 停止正在执行的程序或停止机器人当前执行的运动 | | 请求参数 | programName : string 程序名称(默认为 null,表示停止当前运行的程序或运动指令) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.3 返回所有正在运行的程序详细信息 [​](#4-3-3) | 方法名 | **Execution.AllRunningPrograms**() | | ---------- | --------------------------------------------------------------------------------- | | 描述 | 返回所有正在运行程序的详细信息,包含程序 ID 和程序名称 | | 请求参数 | 无 | | 返回值 | Dictionary: 程序 ID 到程序名的映射 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.4 暂停程序运行 [​](#4-3-4) | 方法名 | **Execution.Pause**(string programName \= null) | | ---------- | ---------------------------------------------------- | | 描述 | 暂停当前执行的程序或暂停机器人当前执行的运动 | | 请求参数 | programName : string 程序名称(默认为 null,表示暂停当前运行的程序或运动指令) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.5 恢复程序运行 [​](#4-3-5) | 方法名 | **Execution.Resume**(string programName \= null) | | ---------- | -------------------------------------------------------- | | 描述 | 继续运行处于暂停状态的程序 | | 请求参数 | programName : string 程序名称(默认为 null,表示恢复当前处于暂停状态的程序或运动指令) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Execution/ProgramExecution.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ProgramExecution { /// /// 测试程序执行完整流程功能 /// 验证程序的启动、暂停、恢复和停止等完整操作流程 /// public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { Console.WriteLine("开始程序执行完整流程/Starting Program Execution Complete Flow"); // [ZH] 获取测试文件路径 // [EN] Get test file path string file_user_program = GetTestFilePath("test_prog.xml"); // [ZH] 设置程序名称 // [EN] Set program name string progName = "test_prog"; // [ZH] 上传用户程序文件 // [EN] Upload user program file code = controller.FileManager.Upload(file_user_program, FileType.UserProgram, true); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件上传成功/User Program File Upload Success: {progName}"); } else { Console.WriteLine($"用户程序文件上传失败/User Program File Upload Failed: {code.GetDescription()}"); return code; } // [ZH] 等待 // [EN] Wait Thread.Sleep(3000); // [ZH] 启动程序 // [EN] Start program code = controller.Execution.Start(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序启动成功/Program Started Successfully: {progName}"); } else { Console.WriteLine($"程序启动失败/Program Start Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 获取所有正在运行的程序列表 // [EN] Get all running programs list Dictionary progList; (progList, code) = controller.Execution.AllRunningPrograms(); if (code == StatusCode.OK) { Console.WriteLine("获取运行程序列表成功/Get Running Programs List Success"); Console.WriteLine($"运行程序数量/Running Programs Count: {progList.Count}"); foreach (var prog in progList) { Console.WriteLine($" 程序/Program: {prog.Key}, 状态/Status: {prog.Value}"); } } else { Console.WriteLine($"获取运行程序列表失败/Get Running Programs List Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 暂停程序 // [EN] Pause program code = controller.Execution.Pause(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序暂停成功/Program Paused Successfully: {progName}"); } else { Console.WriteLine($"程序暂停失败/Program Pause Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 恢复程序 // [EN] Resume program code = controller.Execution.Resume(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序恢复成功/Program Resumed Successfully: {progName}"); } else { Console.WriteLine($"程序恢复失败/Program Resume Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 停止程序 // [EN] Stop program code = controller.Execution.Stop(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序停止成功/Program Stopped Successfully: {progName}"); } else { Console.WriteLine($"程序停止失败/Program Stop Failed: {code.GetDescription()}"); return code; } // [ZH] 删除用户程序文件 // [EN] Delete user program file code = controller.FileManager.Delete(progName, FileType.UserProgram); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件删除成功/User Program File Delete Success: {progName}"); } else { Console.WriteLine($"用户程序文件删除失败/User Program File Delete Failed: {code.GetDescription()}"); return code; } Console.WriteLine("程序执行完整流程结束/Program Execution Complete Flow Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } /// /// 获取test_files文件夹中文件的路径示例方法 /// 展示如何获取当前程序目录下的test_files文件夹中的文件路径 /// private static string GetTestFilePath(string fileName) { // [ZH] 获取当前程序集的目录 // [EN] Get current assembly directory string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName(); if (string.IsNullOrEmpty(codeFilePath)) { throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path"); } string? codeDirectory = Path.GetDirectoryName(codeFilePath); if (string.IsNullOrEmpty(codeDirectory)) { throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path"); } // [ZH] 构建test_files文件夹路径 // [EN] Build test_files folder path string testFilesDirectory = Path.Combine(codeDirectory, "test_files"); // [ZH] 构建文件完整路径 // [EN] Build complete file path string filePath = Path.Combine(testFilesDirectory, fileName); return filePath; } } ``` ## 4.3.6 执行 BAS 脚本程序 [​](#4-3-6) | 方法名 | **Execution.ExecuteBasScript**(BasScript script ) | | ---------- | --------------------------------------------------------- | | 描述 | 执行用户自定义的 BAS 脚本程序 | | 请求参数 | script : [BasScript](./4.10-basScript.html#4-10) BAS 脚本程序 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 备注 | BAS 脚本程序的暂停、恢复、停止方法同普通程序 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 工业机器人: 7.6.0.0 | 示例代码 Execution/ExecuteBasScript.cs ```cs using Agilebot.IR; using Agilebot.IR.BasScript; using Agilebot.IR.Execution; using Agilebot.IR.Types; public class ExecuteBasScript { /// /// 测试执行Bas脚本功能 /// 验证能否成功执行包含条件判断、运动控制和赋值操作的Bas脚本 /// public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { Console.WriteLine("开始执行Bas脚本程序/Starting Execute BasScript"); // [ZH] 创建BAS脚本程序 // [EN] Create BAS script program BasScript script = new BasScript("test_bas"); // [ZH] 添加条件判断到脚本 // [EN] Add conditional statement to script code = script.Logical.IF(RegisterType.R, 1, OtherType.VALUE, 0); if (code != StatusCode.OK) { Console.WriteLine($"添加条件判断失败/Add Conditional Statement Failed: {code.GetDescription()}"); return code; } // [ZH] 添加运动控制到脚本 // [EN] Add motion control to script BasScript.ExtraParam param = new BasScript.ExtraParam(); param.Acceleration(80); code = script.Motion.MoveJoint( MovePoseType.PR, 1, SpeedType.VALUE, 30, SmoothType.SD, 10, extraParam: param ); if (code != StatusCode.OK) { Console.WriteLine($"添加运动控制失败/Add Motion Control Failed: {code.GetDescription()}"); return code; } // [ZH] 添加赋值操作到脚本 // [EN] Add assignment operation to script code = script.AssignValue(AssignType.R, 1, 99); if (code != StatusCode.OK) { Console.WriteLine($"添加赋值操作失败/Add Assignment Operation Failed: {code.GetDescription()}"); return code; } // [ZH] 结束条件判断 // [EN] End conditional statement code = script.Logical.END_IF(); if (code != StatusCode.OK) { Console.WriteLine($"结束条件判断失败/End Conditional Statement Failed: {code.GetDescription()}"); return code; } // [ZH] 等待上一个测试结束 // [EN] Wait for previous test to end Thread.Sleep(1000); // [ZH] 执行BAS脚本程序 // [EN] Execute BAS script program code = controller.Execution.ExecuteBasScript(script); if (code == StatusCode.OK) { Console.WriteLine("BAS脚本执行成功/Execute BasScript Success"); Console.WriteLine( "脚本包含条件判断、运动控制和赋值操作/Script includes conditional statements, motion control and assignment operations" ); } else { Console.WriteLine($"BAS脚本执行失败/Execute BasScript Failed: {code.GetDescription()}"); } Console.WriteLine("执行Bas脚本测试完成/Execute BasScript Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.4-programPoses.html title: 4.4 程序位姿读写 --- # 4.4 程序位姿读写 [​](#4-4) ## 概述 [​](#概述) ProgramPoses 类用于读取、写入和转换机器人示教程序中的位姿点。通过此类可以: * 定位到指定程序与点位序号 * 执行增删改查操作 * 在笛卡尔 / 关节表示之间进行转换 便于在上位机场景下批量维护程序点位或进行离线编辑。 ## 4.4.1 获取指定程序中指定位姿点值 [​](#4-4-1) | 方法名 | **ProgramPoses.Read**(string programName , int index , FileType ft \= FileType.UserProgram) | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 获取指定程序中指定序号的位姿点值 | | 请求参数 | programName : string 程序名称 index : int 位姿点序号 ft : [FileType](./../3-struct/#3-18) 文件类型 (默认 FileType.UserProgram) | | 返回值 | [ProgramPose](./../3-struct/#3-17): 位姿信息 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/ReadProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class ReadProgramPose { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置程序名称和位姿点索引 // [EN] Set program name and pose index string progName = "test_prog"; int index = 1; // [ZH] 读取指定程序中指定位姿点值 // [EN] Read specified pose value in specified program ProgramPose pose; (pose, code) = controller.ProgramPoses.Read(progName, index); if (code == StatusCode.OK) { Console.WriteLine("读取程序位姿点成功/Read Program Pose Success"); Console.WriteLine($"位姿信息/Pose Info: {pose}"); } else { Console.WriteLine($"读取程序位姿点失败/Read Program Pose Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.2 修改指定程序中指定位姿点值 [​](#4-4-2) | 方法名 | **ProgramPoses.Write**(string programName , int index , ProgramPose value , FileType ft \= FileType.UserProgram) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 修改指定程序中指定序号的位姿点值 | | 请求参数 | programName : string 程序名称 index : int 位姿点序号 value : [ProgramPose](./../3-struct/#3-17) 需更新的位姿点值 ft : [FileType](./../3-struct/#3-18) 文件类型 (默认 FileType.UserProgram) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/WriteProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class WriteProgramPose { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置程序名称和位姿点索引 // [EN] Set program name and pose index string progName = "test_prog"; int index = 2; // [ZH] 生成随机位姿点 // [EN] Generate random pose ProgramPose rndPose = ProgramPose.GenerateRandomPose(index); // [ZH] 修改指定程序中指定位姿点值 // [EN] Write specified pose value in specified program code = controller.ProgramPoses.Write(progName, index, rndPose); if (code == StatusCode.OK) { Console.WriteLine("写入程序位姿点成功/Write Program Pose Success"); } else { Console.WriteLine($"写入程序位姿点失败/Write Program Pose Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.3 向程序中添加指定位姿点 [​](#4-4-3) | 方法名 | **ProgramPoses.Add**(string programName , int index , ProgramPose value , FileType ft \= FileType.UserProgram) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 在指定程序的指定序号处新增位姿点 | | 请求参数 | programName : string 程序名称 index : int 位姿点序号 value : [ProgramPose](./../3-struct/#3-17) 需新增的位姿点值 ft : [FileType](./../3-struct/#3-18) 文件类型 (默认 FileType.UserProgram) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/AddProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class AddProgramPose { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置程序名称和位姿点索引 // [EN] Set program name and pose index string progName = "test_prog"; int index = 3; // [ZH] 生成随机位姿点 // [EN] Generate random pose ProgramPose rndPose = ProgramPose.GenerateRandomPose(index); // [ZH] 添加指定程序中指定位姿点 // [EN] Add specified pose in specified program code = controller.ProgramPoses.Add(progName, index, rndPose); if (code == StatusCode.OK) { Console.WriteLine("添加程序位姿点成功/Add Program Pose Success"); } else { Console.WriteLine($"添加程序位姿点失败/Add Program Pose Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.4 删除指定程序中指定序号的位姿点 [​](#4-4-4) | 方法名 | **ProgramPoses.Delete**(string programName , int index , FileType ft \= FileType.UserProgram) | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 删除指定程序中指定序号的位姿点 | | 请求参数 | programName : string 程序名称 index : int 位姿点序号 ft : [FileType](./../3-struct/#3-18) 文件类型 (默认 FileType.UserProgram) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/DeleteProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class DeleteProgramPose { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置程序名称和位姿点索引 // [EN] Set program name and pose index string progName = "test_prog"; int index = 3; // [ZH] 删除指定程序中指定位姿点 // [EN] Delete specified pose in specified program code = controller.ProgramPoses.Delete(progName, index); if (code == StatusCode.OK) { Console.WriteLine("删除程序位姿点成功/Delete Program Pose Success"); } else { Console.WriteLine($"删除程序位姿点失败/Delete Program Pose Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.5 获取指定程序中所有位姿点 [​](#4-4-5) | 方法名 | **ProgramPoses.ReadAllPoses**(string programName , FileType ft \= FileType.UserProgram) | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 获取指定程序中所有位姿点信息 | | 请求参数 | programName : string 程序名称 ft : [FileType](./../3-struct/#3-18) 文件类型 (默认 FileType.UserProgram) | | 返回值 | List<[ProgramPose](./../3-struct/#3-17)\>: 位姿信息列表 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/ReadAllProgramPoses.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class ReadAllProgramPoses { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置程序名称 // [EN] Set program name string progName = "test_prog"; // [ZH] 读取指定程序中所有位姿点 // [EN] Read all poses in specified program List poses; (poses, code) = controller.ProgramPoses.ReadAllPoses(progName); if (code == StatusCode.OK) { Console.WriteLine("读取所有程序位姿点成功/Read All Program Poses Success"); Console.WriteLine($"位姿点数量/Number of poses: {poses.Count}"); for (int i = 0; i < poses.Count; i++) { Console.WriteLine($"位姿点 {i + 1}/Pose {i + 1}: {poses[i]}"); } } else { Console.WriteLine($"读取所有程序位姿点失败/Read All Program Poses Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.6 机器人程序位姿点类型转换 [​](#4-4-6) | 方法名 | **ProgramPoses.ConvertPose**(ProgramPose pose , PoseType toType ) | | ---------- | ---------------------------------------------------------------------------------------------------- | | 描述 | 将机器人程序位姿点在关节坐标和笛卡尔空间坐标之间转换 | | 请求参数 | pose : [ProgramPose](./../3-struct/#3-17) 要转换的位姿点值 toType : [PoseType](./../3-struct/#3-12) 转换后的目标类型 | | 返回值 | [ProgramPose](./../3-struct/#3-17): 转换后的位姿信息 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/ConvertProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class ConvertProgramPose { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置程序名称和位姿点索引 // [EN] Set program name and pose index string progName = "test_prog"; int cartIndex = 1; // [ZH] 先读取一个位姿点 // [EN] First read a pose ProgramPose cartPose; (cartPose, code) = controller.ProgramPoses.Read(progName, cartIndex); if (code != StatusCode.OK) { Console.WriteLine($"读取位姿点失败/Read Pose Failed: {code.GetDescription()}"); return code; } // [ZH] 转换位姿点类型(从笛卡尔坐标转换为关节坐标) // [EN] Convert pose type (from Cartesian to Joint coordinates) ProgramPose pose; (pose, code) = controller.ProgramPoses.ConvertPose(cartPose, PoseType.Joint); if (code == StatusCode.OK) { Console.WriteLine("转换程序位姿点成功/Convert Program Pose Success"); Console.WriteLine($"原始位姿/Original Pose: {cartPose}"); Console.WriteLine($"转换后位姿/Converted Pose: {pose}"); } else { Console.WriteLine($"转换程序位姿点失败/Convert Program Pose Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.5-signals.html title: 4.5 IO信号 --- # 4.5 IO 信号 [​](#4-5) ## 概述 [​](#概述) Signals 类提供控制器 IO 的统一读写接口,封装了以下核心功能: * 数字 / 模拟输入输出控制 * 多路批量操作 通过 `Signals` 可以: * 读取当前信号状态 * 批量写入 DO/RO/GO 等端口 * 实现与外部夹爪、传感器或生产线设备的联动。 ## 4.5.1 读取指定类型和端口的 IO 值 [​](#4-5-1) | 方法名 | **Signals.Read**(SignalType type , int index ) | | ---------- | ------------------------------------------------------------------------------ | | 描述 | 读取指定类型和端口的 IO 值(支持 DI/DO/UI/UO/RI/RO/GI/GO/TAI/TDI/TDO/AI/AO) | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 要读取的 IO 类型 index : int IO 序号 (从 1 开始) | | 返回值 | int: IO 值,1 代表高电平,0 代表低电平 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 只能读不能写 | 示例代码 Signals/ReadSignal.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ReadSignal { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置IO信号类型和索引 // [EN] Set IO signal type and index SignalType type = SignalType.DI; int index = 1; // [ZH] 读取指定类型指定端口IO的值 // [EN] Read specified type and port IO value int res; (res, code) = controller.Signals.Read(type, index); if (code == StatusCode.OK) { Console.WriteLine("读取IO信号成功/Read Signal Success"); Console.WriteLine($"{type}:{index} 的值为/has value {res}"); Console.WriteLine($"信号状态/Signal Status: {(res == 1 ? "高电平/High Level" : "低电平/Low Level")}"); } else { Console.WriteLine($"读取IO信号失败/Read Signal Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.5.2 写入指定类型和端口的 IO 值 [​](#4-5-2) | 方法名 | **Signals.Write**(SignalType type , int index , double value ) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入指定类型和端口的 IO 值,当前仅支持 DO/RO/GO/TDO/AO | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 要写入的 IO 类型 index : int IO 序号 (从 1 开始) value : double IO 值 (DO/RO/TDO 仅允许 0 或 1;GO 为整型;AO 为浮点模拟量) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 只能读不能写 | 示例代码 Signals/WriteSignal.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class WriteSignal { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置IO信号类型、索引和值 // [EN] Set IO signal type, index and value SignalType type = SignalType.DO; int index = 1; int value = 1; // [ZH] 写指定类型指定端口IO的值 // [EN] Write specified type and port IO value code = controller.Signals.Write(type, index, value); if (code == StatusCode.OK) { Console.WriteLine("写入IO信号成功/Write Signal Success"); Console.WriteLine($"{type}:{index} 设置为/set to value {value}"); Console.WriteLine($"信号状态/Signal Status: {(value == 1 ? "高电平/High Level" : "低电平/Low Level")}"); } else { Console.WriteLine($"写入IO信号失败/Write Signal Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.5.3 批量写入 DO (数字输出) 信号 [​](#4-5-3) | 方法名 | **Signals.MultiWrite**(SignalType type , List ioData ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 批量写入 DO (数字输出) 信号 | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 要写入的 IO 类型 (仅支持 DO) ioData : List 端口号和端口值列表 (例如 \[port1, state1, port2, state2\];长度为偶数且大于 0) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 仅支持 DO 批量写入;UI/UO 不支持写入,DI/RI 仅支持单点读取 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; Arm controller = new Arm(controllerIP); StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 批量写入 DO1=1, DO2=0 code = controller.Signals.MultiWrite(SignalType.DO, new List { 1, 1, 2, 0 }); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "MultiWrite Success"); code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` --- ## 4.5.4 批量读取 DO (数字输出) 端口值 [​](#4-5-4) | 方法名 | **Signals.MultiRead**(SignalType type , List indexes ) | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 批量读取 DO (数字输出) 端口值 | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 要读取的 IO 类型 (仅支持 DO) indexes : List 端口号列表 (不能为空) | | 返回值 | List: 端口值列表(顺序与输入一致) [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 仅支持 DO 批量读取;UI/UO 不支持写入,DI/RI 仅支持单点读取 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; Arm controller = new Arm(controllerIP); StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 批量读取 DO1、DO2 (List values, StatusCode readCode) = controller.Signals.MultiRead(SignalType.DO, new List { 1, 2 }); if (readCode == StatusCode.OK) { Console.WriteLine($"MultiRead Success: DO1={values[0]}, DO2={values[1]}"); } code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` --- --- url: /zh/2-csharp/4-methods/4.6-registers.html title: 4.6 寄存器信息 --- # 4.6 寄存器信息 [​](#4-6) ## 概述 [​](#概述) Registers 类提供上位机读写控制器寄存器的统一入口,支持多种寄存器类型的操作。 ### 核心功能 [​](#核心功能) * 支持数值寄存器(R)的读写操作 * 支持运动寄存器(MR)的读写操作 * 支持字符串寄存器(SR)的读写操作 * 支持位姿寄存器(PR)的读写操作 * 支持 Modbus 寄存器(MH 保持寄存器、MI 输入寄存器)的读写操作 ### 使用场景 [​](#使用场景) * 程序运行时传递参数 * 同步机器人状态信息 * 与外部系统共享配置数据 * 实现机器人与外部设备的交互控制 ## 4.6.1 R 数值寄存器操作 [​](#4-6-1) ### 4.6.1.1 读取 R 寄存器值 [​](#4-6-1-1) | 方法名 | **Registers.Read\_R**(int index ) | | ---------- | ----------------------------------------------------- | | 描述 | 读取 R 数值寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | double: 寄存器值 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.1.2 读取 R 寄存器值(含元信息) [​](#4-6-1-2) | 方法名 | **Registers.Read\_R**(int index , bool withMeta ) | | ---------- | ---------------------------------------------------------------------------------- | | 描述 | 读取 R 数值寄存器的值,可返回元信息(名称 / 注释) | | 请求参数 | index : int 要读取的寄存器编号 withMeta : bool 是否返回元信息(true 时返回寄存器对象) | | 返回值 | Register: 寄存器对象(包含 id/name/comment/value) [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.1.3 写入 R 寄存器值 [​](#4-6-1-3) | 方法名 | **Registers.Write\_R**(int index , double value ) | | ---------- | ------------------------------------------------- | | 描述 | 写入 R 数值寄存器的值 | | 请求参数 | index : int 要写入的寄存器编号 value : double 要写入的寄存器数值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.1.4 写入 R 寄存器(含元信息) [​](#4-6-1-4) | 方法名 | **Registers.Write\_R**(Register register ) | | ---------- | ------------------------------------------------ | | 描述 | 使用 Register 对象写入 R 寄存器,包含名称与注释 | | 请求参数 | register : Register 寄存器对象(id/name/comment/value) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.1.5 删除 R 寄存器 [​](#4-6-1-5) | 方法名 | **Registers.Delete\_R**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 R 数值寄存器 | | 请求参数 | index : int 要删除的寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/RRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class RRegisterOperations { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置寄存器索引和值 // [EN] Set register index and value int index = 1; double value = 9.9; // [ZH] 写入R寄存器 // [EN] Write R register code = controller.Registers.Write_R(index, value); if (code == StatusCode.OK) { Console.WriteLine("写入R寄存器成功/Write R Register Success"); } else { Console.WriteLine($"写入R寄存器失败/Write R Register Failed: {code.GetDescription()}"); } // [ZH] 读取R寄存器 // [EN] Read R register double readValue; (readValue, code) = controller.Registers.Read_R(index); if (code == StatusCode.OK) { Console.WriteLine($"读取R寄存器成功/Read R Register Success: 值/Value = {readValue}"); } else { Console.WriteLine($"读取R寄存器失败/Read R Register Failed: {code.GetDescription()}"); } // [ZH] 删除R寄存器 // [EN] Delete R register code = controller.Registers.Delete_R(index); if (code == StatusCode.OK) { Console.WriteLine("删除R寄存器成功/Delete R Register Success"); } else { Console.WriteLine($"删除R寄存器失败/Delete R Register Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.2 MR 运动寄存器操作 [​](#4-6-2) ### 4.6.2.1 读取 MR 寄存器值 [​](#4-6-2-1) | 方法名 | **Registers.Read\_MR**(int index ) | | ---------- | -------------------------------------------------- | | 描述 | 读取 MR 运动寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.2.2 读取 MR 寄存器值(含元信息) [​](#4-6-2-2) | 方法名 | **Registers.Read\_MR**(int index , bool withMeta ) | | ---------- | ---------------------------------------------------------------------------------------- | | 描述 | 读取 MR 运动寄存器的值,可返回元信息(名称 / 注释) | | 请求参数 | index : int 要读取的寄存器编号 withMeta : bool 是否返回元信息(true 时返回寄存器对象) | | 返回值 | MotionRegister: 寄存器对象(包含 id/name/comment/value) [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.2.3 写入 MR 寄存器值 [​](#4-6-2-3) | 方法名 | **Registers.Write\_MR**(int index , int value ) | | ---------- | ----------------------------------------------- | | 描述 | 写入 MR 运动寄存器的值 | | 请求参数 | index : int 要写入的寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.2.4 写入 MR 寄存器(含元信息) [​](#4-6-2-4) | 方法名 | **Registers.Write\_MR**(MotionRegister register ) | | ---------- | ------------------------------------------------------ | | 描述 | 使用 MotionRegister 对象写入 MR 寄存器,包含名称与注释 | | 请求参数 | register : MotionRegister 寄存器对象(id/name/comment/value) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.2.5 删除 MR 寄存器 [​](#4-6-2-5) | 方法名 | **Registers.Delete\_MR**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 MR 运动寄存器 | | 请求参数 | index : int 要删除的寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/MRRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class MRRegisterOperations { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置寄存器索引和值 // [EN] Set register index and value int index = 1; int value = 9; // [ZH] 写入MR寄存器 // [EN] Write MR register code = controller.Registers.Write_MR(index, value); if (code == StatusCode.OK) { Console.WriteLine("写入MR寄存器成功/Write MR Register Success"); } else { Console.WriteLine($"写入MR寄存器失败/Write MR Register Failed: {code.GetDescription()}"); } // [ZH] 读取MR寄存器 // [EN] Read MR register int readValue; (readValue, code) = controller.Registers.Read_MR(index); if (code == StatusCode.OK) { Console.WriteLine($"读取MR寄存器成功/Read MR Register Success: 值/Value = {readValue}"); } else { Console.WriteLine($"读取MR寄存器失败/Read MR Register Failed: {code.GetDescription()}"); } // [ZH] 删除MR寄存器 // [EN] Delete MR register code = controller.Registers.Delete_MR(index); if (code == StatusCode.OK) { Console.WriteLine("删除MR寄存器成功/Delete MR Register Success"); } else { Console.WriteLine($"删除MR寄存器失败/Delete MR Register Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.3 SR 字符串寄存器操作 [​](#4-6-3) ### 4.6.3.1 读取 SR 寄存器值 [​](#4-6-3-1) | 方法名 | **Registers.Read\_SR**(int index ) | | ---------- | -------------------------------------------------------- | | 描述 | 读取 SR 字符串寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | string: 寄存器字符串值 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.3.2 读取 SR 寄存器值(含元信息) [​](#4-6-3-2) | 方法名 | **Registers.Read\_SR**(int index , bool withMeta ) | | ---------- | ---------------------------------------------------------------------------------------- | | 描述 | 读取 SR 字符串寄存器的值,可返回元信息(名称 / 注释) | | 请求参数 | index : int 要读取的寄存器编号 withMeta : bool 是否返回元信息(true 时返回寄存器对象) | | 返回值 | StringRegister: 寄存器对象(包含 id/name/comment/value) [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.3.3 写入 SR 寄存器值 [​](#4-6-3-3) | 方法名 | **Registers.Write\_SR**(int index , string value ) | | ---------- | -------------------------------------------------- | | 描述 | 写入 SR 字符串寄存器的值 | | 请求参数 | index : int 要写入的寄存器编号 value : string 要写入的寄存器字符串值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.3.4 写入 SR 寄存器(含元信息) [​](#4-6-3-4) | 方法名 | **Registers.Write\_SR**(StringRegister register ) | | ---------- | ------------------------------------------------------ | | 描述 | 使用 StringRegister 对象写入 SR 寄存器,包含名称与注释 | | 请求参数 | register : StringRegister 寄存器对象(id/name/comment/value) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.3.5 删除 SR 寄存器 [​](#4-6-3-5) | 方法名 | **Registers.Delete\_SR**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 SR 字符串寄存器 | | 请求参数 | index : int 要删除的寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/SRRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class SRRegisterOperations { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置寄存器索引和值 // [EN] Set register index and value int index = 1; string value = "test"; // [ZH] 写入SR寄存器 // [EN] Write SR register code = controller.Registers.Write_SR(index, value); if (code == StatusCode.OK) { Console.WriteLine("写入SR寄存器成功/Write SR Register Success"); } else { Console.WriteLine($"写入SR寄存器失败/Write SR Register Failed: {code.GetDescription()}"); } // [ZH] 读取SR寄存器 // [EN] Read SR register string readValue; (readValue, code) = controller.Registers.Read_SR(index); if (code == StatusCode.OK) { Console.WriteLine($"读取SR寄存器成功/Read SR Register Success: 值/Value = {readValue}"); } else { Console.WriteLine($"读取SR寄存器失败/Read SR Register Failed: {code.GetDescription()}"); } // [ZH] 删除SR寄存器 // [EN] Delete SR register code = controller.Registers.Delete_SR(index); if (code == StatusCode.OK) { Console.WriteLine("删除SR寄存器成功/Delete SR Register Success"); } else { Console.WriteLine($"删除SR寄存器失败/Delete SR Register Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.4 PR 位姿寄存器操作 [​](#4-6-4) ### 4.6.4.1 读取 PR 寄存器值 [​](#4-6-4-1) | 方法名 | **Registers.Read\_PR**(int index ) | | ---------- | ---------------------------------------------------------------------------------- | | 描述 | 读取 PR 位姿寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | [PoseRegister](./../3-struct/#3-20): 位姿数据 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.4.2 读取 PR 寄存器值(含元信息) [​](#4-6-4-2) | 方法名 | **Registers.Read\_PR**(int index , bool withMeta ) | | ---------- | ------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 PR 位姿寄存器的值,可返回元信息(名称 / 注释) | | 请求参数 | index : int 要读取的寄存器编号 withMeta : bool 是否返回元信息(true 时包含 name/comment) | | 返回值 | [PoseRegister](./../3-struct/#3-20): 位姿数据( withMeta=true 时包含 name/comment) [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.4.3 写入 PR 寄存器值 [​](#4-6-4-3) | 方法名 | **Registers.Write\_PR**(PoseRegister pose ) | | ---------- | --------------------------------------------------- | | 描述 | 写入 PR 位姿寄存器的值 | | 请求参数 | pose : [PoseRegister](./../3-struct/#3-20) 要写入的位姿数据 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.4.4 写入 PR 寄存器(含元信息) [​](#4-6-4-4) | 方法名 | **Registers.Write\_PR**(PoseRegister pose , bool withMeta ) | | ---------- | -------------------------------------------------------------------------------------------------- | | 描述 | 写入 PR 位姿寄存器的值,可控制是否写入元信息(名称 / 注释) | | 请求参数 | pose : [PoseRegister](./../3-struct/#3-20) 要写入的位姿数据 withMeta : bool 是否写入元信息(true 时写入 name/comment) | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.7.0.0+ 工业机器人: 7.7.0.0+ | ### 4.6.4.5 删除 PR 寄存器 [​](#4-6-4-5) | 方法名 | **Registers.Delete\_PR**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 PR 位姿寄存器 | | 请求参数 | index : int 要删除的寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/PRRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Registers; using Agilebot.IR.Types; public class PRRegisterOperations { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置寄存器索引 // [EN] Set register index int index = 1; // [ZH] 生成位姿寄存器 // [EN] Generate pose register var pose = new PoseRegister { Id = 1, Name = "Test", Comment = "Test", PoseRegisterData = new PoseRegisterData { Pt = PoseType.Joint, Joint = new Joint { J1 = 6.6, J2 = 6.6, J3 = 6.6, J4 = 6.6, J5 = 6.6, J6 = 6.6, }, CartData = null, }, }; // [ZH] 写入PR寄存器 // [EN] Write PR register code = controller.Registers.Write_PR(pose); if (code == StatusCode.OK) { Console.WriteLine("写入PR寄存器成功/Write PR Register Success"); } else { Console.WriteLine($"写入PR寄存器失败/Write PR Register Failed: {code.GetDescription()}"); } // [ZH] 读取PR寄存器 // [EN] Read PR register PoseRegister readValue; (readValue, code) = controller.Registers.Read_PR(index); if (code == StatusCode.OK) { Console.WriteLine($"读取PR寄存器成功/Read PR Register Success: ID = {readValue.Id}"); } else { Console.WriteLine($"读取PR寄存器失败/Read PR Register Failed: {code.GetDescription()}"); } // [ZH] 删除PR寄存器 // [EN] Delete PR register code = controller.Registers.Delete_PR(index); if (code == StatusCode.OK) { Console.WriteLine("删除PR寄存器成功/Delete PR Register Success"); } else { Console.WriteLine($"删除PR寄存器失败/Delete PR Register Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.5 Modbus 寄存器(MH 保持寄存器、MI 输入寄存器) [​](#4-6-5) ### 4.6.5.1 读取 MH 寄存器值 [​](#4-6-5-1) | 方法名 | **Registers.Read\_MH**(int index ) | | ---------- | -------------------------------------------------- | | 描述 | 读取 MH 保持寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | ### 4.6.5.2 读取 MI 寄存器值 [​](#4-6-5-2) | 方法名 | **Registers.Read\_MI**(int index ) | | ---------- | -------------------------------------------------- | | 描述 | 读取 MI 输入寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | ### 4.6.5.3 写入 MH 寄存器值 [​](#4-6-5-3) | 方法名 | **Registers.Write\_MH**(int index , int value ) | | ---------- | ----------------------------------------------- | | 描述 | 写入 MH 保持寄存器的值 | | 请求参数 | index : int 要写入的寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | ### 4.6.5.4 写入 MI 寄存器值 [​](#4-6-5-4) | 方法名 | **Registers.Write\_MI**(int index , int value ) | | ---------- | ----------------------------------------------- | | 描述 | 写入 MI 输入寄存器的值 | | 请求参数 | index : int 要写入的寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | 示例代码 Registers/ModbusRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ModbusRegisterOperations { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 设置寄存器索引和值 // [EN] Set register index and value int index = 1; int writeValue = 8; // [ZH] 写入MH保持寄存器 // [EN] Write MH holding register code = controller.Registers.Write_MH(index, writeValue); if (code == StatusCode.OK) { Console.WriteLine("写入MH保持寄存器成功/Write MH Holding Register Success"); } else { Console.WriteLine($"写入MH保持寄存器失败/Write MH Holding Register Failed: {code.GetDescription()}"); } // [ZH] 写入MI输入寄存器 // [EN] Write MI input register code = controller.Registers.Write_MI(index, writeValue + 1); if (code == StatusCode.OK) { Console.WriteLine("写入MI输入寄存器成功/Write MI Input Register Success"); } else { Console.WriteLine($"写入MI输入寄存器失败/Write MI Input Register Failed: {code.GetDescription()}"); } // [ZH] 读取MH保持寄存器 // [EN] Read MH holding register int mhValue; (mhValue, code) = controller.Registers.Read_MH(index); if (code == StatusCode.OK) { Console.WriteLine($"读取MH保持寄存器成功/Read MH Holding Register Success: 值/Value = {mhValue}"); } else { Console.WriteLine($"读取MH保持寄存器失败/Read MH Holding Register Failed: {code.GetDescription()}"); } // [ZH] 读取MI输入寄存器 // [EN] Read MI input register int miValue; (miValue, code) = controller.Registers.Read_MI(index); if (code == StatusCode.OK) { Console.WriteLine($"读取MI输入寄存器成功/Read MI Input Register Success: 值/Value = {miValue}"); } else { Console.WriteLine($"读取MI输入寄存器失败/Read MI Input Register Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.7-trajectory.html title: 4.7 轨迹控制 --- # 4.7 轨迹控制 [​](#4-7) ## 概述 [​](#概述) Trajectory 模块提供离线轨迹执行、轨迹文件转换的接口,支持复杂轨迹的复现。 ### 核心功能 [​](#核心功能) * 支持设置和执行离线轨迹文件 * 支持以安全速度将机器人移动到离线轨迹起始点 * 支持 CSV 到 trajectory 格式的文件转换 * 支持查询轨迹文件转换状态 ### 使用场景 [​](#使用场景) * 实现复杂轨迹的精确复现 * 转换外部轨迹数据为机器人可执行格式 ## 4.7.1 设置待执行的离线轨迹文件 [​](#4-7-1) | 方法名 | **Trajectory.SetOffLineTrajectoryFile**(string path ) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置待执行的离线轨迹文件 | | 请求参数 | path : string 离线轨迹文件程序名 (格式说明见下方备注) | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 备注 | A.trajectory 轨迹文件格式为文本文件:\- 第 1 行:6 代表 6 个轴,0.001 代表两点间隔 1 ms,8093 代表轨迹点数。\- 第 2 行:6 个轴的起始位置。\- 第 3-8095 行:轨迹点数据,包含 6 轴的位置 / 速度 / 加速度 / 力矩前馈 /do 端口 /do 端口值。\- do\_port 取值范围 1\~24;do\_port 为 -1 表示该位置不触发 IO;do\_port 为 1 且 do\_state 为 1 表示 do1 端口触发 ON;do\_port 为 1 且 do\_state 为 0 表示 do1 端口触发 OFF。用户通过 FileManager.upload 将离线文件发送到机器人控制器根目录,用 4.7.2 和 4.7.3 指令执行轨迹。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.2 让机器人以安全速度移动到离线轨迹中的起始点 [​](#4-7-2) | 方法名 | **Trajectory.PrepareOfflineTrajectory**() | | ---------- | ---------------------------------------------- | | 描述 | 让机器人以安全速度移动到离线轨迹中的起始点 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.3 让机器人开始执行离线轨迹文件 [​](#4-7-3) | 方法名 | **Trajectory.ExecuteOfflineTrajectory**() | | ---------- | ---------------------------------------------- | | 描述 | 让机器人开始执行离线轨迹程序 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.4 轨迹文件转换功能 [​](#4-7-4) | 方法名 | **Trajectory.TransformCsvToTrajectory**(string fileName ) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将轨迹 CSV 文件转换成 trajectory 格式的轨迹文件并存放在控制柜的轨迹文件目录上 | | 请求参数 | fileName : string CSV 轨迹文件名 | | 重载方法 | **Trajectory.TransformCsvToTrajectory**(string fileName , string separator , string ioFlag ) separator : string 分隔符,支持空格或逗号 ioFlag : string IO 来源标识,"1" 表示使用默认 IO 值,"2" 表示使用用户指定 IO | | 返回值 | string: 成功转换后的 trajectory 文件路径 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.5 查询轨迹文件转换状态 [​](#4-7-5) | 方法名 | **Trajectory.CheckTransformStatus**(string fileName ) | | ---------- | ----------------------------------------------------------------------------------- | | 描述 | 查询轨迹文件转换的当前状态 | | 请求参数 | fileName : string 轨迹文件路径 ( TransformCsvToTrajectory 接口返回) | | 返回值 | [TransformState](./../3-struct/#3-7): 转换状态 [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) Trajectory/OfflineTrajectory.cs ```cs using System.IO; using Agilebot.IR; using Agilebot.IR.Trajectory; using Agilebot.IR.Types; public class OfflineTrajectory { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人模式 // [EN] Get robot mode (UserOpMode opMode, StatusCode opCode) = controller.GetOpMode(); if (opCode == StatusCode.OK) { Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}"); if (opMode != UserOpMode.AUTO) { Console.WriteLine( $"离线轨迹执行必须在机器人自动模式下/Offline trajectory execution must be in automatic mode" ); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 添加程序文件到机器人中 // [EN] Add program file to robot string file_user_program = GetTestFilePath("test.csv"); StatusCode ret_code = controller.FileManager.Upload(file_user_program, FileType.TmpFile, true); if (ret_code != StatusCode.OK) { Console.WriteLine($"上传文件失败/Upload file failed: {ret_code.GetDescription()}"); return ret_code; } Console.WriteLine("文件上传成功/File upload success"); // [ZH] 测试CSV转换为轨迹文件功能 // [EN] Test CSV to trajectory file conversion functionality string csvFilename = "test.csv"; (string trajFileName, StatusCode transformCode) = controller.Trajectory.TransformCsvToTrajectory( csvFilename ); if (transformCode != StatusCode.OK) { Console.WriteLine($"CSV转换失败/CSV conversion failed: {transformCode.GetDescription()}"); return transformCode; } Console.WriteLine($"CSV转换成功/CSV conversion success, trajectory file: {trajFileName}"); // [ZH] 检查转换状态 // [EN] Check conversion status var startTime = System.DateTime.Now; TransformState state; StatusCode statusCode; do { (state, statusCode) = controller.Trajectory.CheckTransformStatus( System.IO.Path.GetFileName(trajFileName) ); if (statusCode != StatusCode.OK) { Console.WriteLine($"检查转换状态失败/Check transform status failed: {statusCode.GetDescription()}"); return statusCode; } Console.WriteLine($"转换状态/Transform state: {state}"); Thread.Sleep(2000); // 等待2秒 if (System.DateTime.Now - startTime > System.TimeSpan.FromSeconds(60)) { Console.WriteLine("转换状态检查超时/Transform status check timeout"); break; } } while (state != TransformState.TRANSFORM_SUCCESS && state != TransformState.TRANSFORM_FAILED); if (state == TransformState.TRANSFORM_FAILED) { Console.WriteLine("CSV转换失败/CSV conversion failed"); return StatusCode.OtherReason; } // [ZH] 转换任务成功并进行了结果查询后 服务端不会继续保存转换任务的状态 // [EN] After the conversion task is successful and the result is queried, the server will not continue to save the conversion task status (TransformState finalState, StatusCode finalCode) = controller.Trajectory.CheckTransformStatus( System.IO.Path.GetFileName(trajFileName) ); if (finalCode != StatusCode.OK) { Console.WriteLine($"最终状态检查失败/Final status check failed: {finalCode.GetDescription()}"); return finalCode; } Console.WriteLine($"最终转换状态/Final transform state: {finalState}"); // [ZH] 设置轨迹文件 // [EN] Set trajectory file code = controller.Trajectory.SetOffLineTrajectoryFile("test_torque.trajectory"); if (code != StatusCode.OK) { Console.WriteLine($"设置轨迹文件失败/Set trajectory file failed: {code.GetDescription()}"); return code; } Console.WriteLine("设置轨迹文件成功/Set trajectory file success"); // [ZH] 准备离线轨迹 // [EN] Prepare offline trajectory code = controller.Trajectory.PrepareOfflineTrajectory(); if (code != StatusCode.OK) { Console.WriteLine($"准备离线轨迹失败/Prepare offline trajectory failed: {code.GetDescription()}"); return code; } Console.WriteLine("准备离线轨迹成功/Prepare offline trajectory success"); // [ZH] 等待机器人和伺服器空闲 // [EN] Wait for robot and servo to be idle startTime = System.DateTime.Now; RobotState robotStatus; ServoState servoStatus; StatusCode robotStatusCode; StatusCode servoStatusCode; do { (robotStatus, robotStatusCode) = controller.GetRobotState(); if (robotStatusCode != StatusCode.OK) { Console.WriteLine($"获取机器人状态失败/Get robot state failed: {robotStatusCode.GetDescription()}"); return robotStatusCode; } (servoStatus, servoStatusCode) = controller.GetServoState(); if (servoStatusCode != StatusCode.OK) { Console.WriteLine($"获取伺服状态失败/Get servo state failed: {servoStatusCode.GetDescription()}"); return servoStatusCode; } Console.WriteLine($"机器人状态/Robot state: {robotStatus}, 伺服状态/Servo state: {servoStatus}"); if (robotStatus == RobotState.ROBOT_IDLE && servoStatus == ServoState.SERVO_IDLE) { Console.WriteLine("机器人和伺服器已空闲/Robot and servo are idle"); break; } Thread.Sleep(2000); // 等待2秒 if (System.DateTime.Now - startTime > System.TimeSpan.FromSeconds(60)) { Console.WriteLine("等待机器人和伺服器空闲超时/Waiting for robot and servo idle timeout"); break; } } while (true); // [ZH] 执行离线轨迹 // [EN] Execute offline trajectory code = controller.Trajectory.ExecuteOfflineTrajectory(); if (code == StatusCode.OK) { Console.WriteLine("执行离线轨迹成功/Execute offline trajectory success"); Console.WriteLine("机器人开始执行轨迹程序/Robot started executing trajectory program"); } else { Console.WriteLine($"执行离线轨迹失败/Execute offline trajectory failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine( $"执行过程中发生异常/Exception occurred during execution/Exception occurred during execution: {ex.Message}" ); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } /// /// 获取test_files文件夹中文件的路径示例方法 /// 展示如何获取当前程序目录下的test_files文件夹中的文件路径 /// private static string GetTestFilePath(string fileName) { // 获取当前程序集的目录 string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName(); if (string.IsNullOrEmpty(codeFilePath)) { throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path"); } string? codeDirectory = Path.GetDirectoryName(codeFilePath); if (string.IsNullOrEmpty(codeDirectory)) { throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path"); } // 构建test_files文件夹路径 string testFilesDirectory = Path.Combine(codeDirectory, "test_files"); // 构建文件完整路径 string filePath = Path.Combine(testFilesDirectory, fileName); return filePath; } } ``` ## 4.7.6 开始记录轨迹 [​](#4-7-6) | 方法名 | **Trajectory.TrajectoryRecordBegin**(string name ) | | ---------- | -------------------------------------------------- | | 描述 | 开始轨迹复现功能的轨迹记录 | | 请求参数 | name : string 轨迹程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 记录开始操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.7 结束记录轨迹 [​](#4-7-7) | 方法名 | **Trajectory.TrajectoryRecordFinish**(string name ) | | ---------- | --------------------------------------------------- | | 描述 | 结束轨迹复现功能的轨迹记录 | | 请求参数 | name : string 轨迹程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 记录结束操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.8 开始播放轨迹 [​](#4-7-8) | 方法名 | **Trajectory.TrajectoryReplayStart**(string name ) | | ---------- | -------------------------------------------------- | | 描述 | 开始播放指定轨迹 | | 请求参数 | name : string 轨迹程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 播放开始操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.9 停止播放轨迹 [​](#4-7-9) | 方法名 | **Trajectory.TrajectoryReplayStop**(string name ) | | ---------- | ------------------------------------------------- | | 描述 | 停止播放指定轨迹 | | 请求参数 | name : string 轨迹程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 播放停止操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.10 删除轨迹 [​](#4-7-10) | 方法名 | **Trajectory.TrajectoryRecordDelete**(string name ) | | ---------- | --------------------------------------------------- | | 描述 | 删除指定轨迹 | | 请求参数 | name : string 轨迹程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.11 获取轨迹列表 [​](#4-7-11) | 方法名 | **Trajectory.GetTrajectoryRecordList**() | | ---------- | --------------------------------------------------------------------- | | 描述 | 获取当前已录制轨迹名称列表 | | 请求参数 | 无参数 | | 返回值 | List<string>: 轨迹名称列表 [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.12 获取轨迹起始位置 [​](#4-7-12) | 方法名 | **Trajectory.GetTrajectoryRecordStartPose**(string name ) | | ---------- | ----------------------------------------------------------------------------------- | | 描述 | 获取指定录制轨迹的起始位置 | | 请求参数 | name : string 轨迹程序名 | | 返回值 | [MotionPose](./../3-struct/#3-9): 轨迹起始位置 [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.13 开始记录轨迹表 / 路径表 [​](#4-7-13) | 方法名 | **Trajectory.PathRecordBegin**(string name , string comment , double param , double angle \= 1) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 开始记录轨迹表( .traj )或路径表( .path ) | | 请求参数 | name : string 轨迹表 / 路径表文件名,必须以 .path 或 .traj 结尾 comment : string 描述信息 param : double 记录参数( .path 为距离阈值,且需 >=0.5; .traj 为记录间隔,且需 >=2) angle : double 路径表旋转角度阈值(仅 .path 生效,需 >=1) | | 返回值 | [StatusCode](./../3-struct/#3-1): 记录开始操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.14 结束记录轨迹表 / 路径表 [​](#4-7-14) | 方法名 | **Trajectory.PathRecordFinish**() | | ---------- | -------------------------------------------- | | 描述 | 结束当前轨迹表 / 路径表记录 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 记录结束操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.15 获取轨迹表 / 路径表起始姿态 [​](#4-7-15) | 方法名 | **Trajectory.GetPathStartPose**(string name ) | | ---------- | --------------------------------------------------------------------------------- | | 描述 | 获取指定轨迹表 / 路径表的起始姿态 | | 请求参数 | name : string 轨迹表 / 路径表名称 | | 返回值 | [MotionPose](./../3-struct/#3-9): 起始姿态 [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.16 获取轨迹表 / 路径表状态 [​](#4-7-16) | 方法名 | **Trajectory.GetPathState**(List<string> pathList ) | | ---------- | ----------------------------------------------------------------------------------------------- | | 描述 | 批量查询轨迹表 / 路径表当前录制状态 | | 请求参数 | pathList : List<string> 轨迹表 / 路径表名称列表 | | 返回值 | Dictionary<string, MotionTableState>: 文件名与状态映射 [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.17 设置路径规划参数 [​](#4-7-17) | 方法名 | **Trajectory.SetPathPlannerParameter**(double transitionTime , double scalingFactor ) | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置路径规划器参数,影响轨迹过渡和平滑性 | | 请求参数 | transitionTime : double 启停过渡时长,需 >=0.2 数值越小加减速越快,最小 0.2 scalingFactor : double 缩放系数,范围 \[0,1\] \=0,机器人将以恒定时间通过每个路径点,优先保证点与点之间时间间隔 \=1,严格缩放,机器人以恒定线速度通过每个路径点,优先保证每个点匀速经过 在 0\~1 之间则是折衷的行为 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | ## 4.7.18 获取路径规划参数 [​](#4-7-18) | 方法名 | **Trajectory.GetPathPlannerParameter**() | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取当前路径规划器参数 | | 请求参数 | 无参数 | | 返回值 | double: transitionTime 启停过渡时长,数值越小加减速越快,最小 0.2 double: scalingFactor 缩放系数,=0 时以恒定时间通过每个路径点,=1 时以恒定线速度通过每个路径点,0\~1 之间为折衷行为 [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.19 沿轨迹表 / 路径表运动 [​](#4-7-19) | 方法名 | **Trajectory.MovePath**(string name , double vel \= 100, double acc \= 1) | | ---------- | ------------------------------------------------------------------------------------------------ | | 描述 | 让机器人末端沿指定轨迹表 / 路径表运动 | | 请求参数 | name : string 轨迹表 / 路径表名称 vel : double 运动速度,范围 \[0,5000\] (mm/s) acc : double 加速度系数,范围 \[0,1.2\] | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.I.0+ 工业 (Bronze): 不支持 | --- url: /zh/2-csharp/4-methods/4.8-alarm.html title: 4.8 报警信息 --- # 4.8 报警信息 [​](#4-8) ## 概述 [​](#概述) Alarm 模块提供机器人报警信息的读取、复位和查询功能,用于监控和处理机器人运行时可能出现的异常情况。 ### 核心功能 [​](#核心功能) * 支持报警复位 * 支持获取所有活动报警 * 支持获取最高优先级报警 ### 使用场景 [​](#使用场景) * 监控机器人运行状态,及时发现异常 * 处理机器人运行过程中的错误和报警 * 记录和分析机器人报警历史 * 实现自动化报警处理流程 * 集成到机器人监控系统中 ## 4.8.1 获取最高优先级报警 [​](#4-8-1) | 方法名 | **Alarm.GetTopAlarm**() | | ---------- | -------------------------------------------------------- | | 描述 | 获取当前最高优先级的报警 | | 请求参数 | 无参数 | | 返回值 | string: 报警信息字符串 [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Alarm/GetTopAlarm.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetTopAlarm { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取最严重的一条报警 // [EN] Get the most severe alarm string topError; (topError, code) = controller.Alarm.GetTopAlarm(); if (code == StatusCode.OK) { Console.WriteLine("获取最严重报警成功/Get Top Alarm Success"); if (string.IsNullOrEmpty(topError)) { Console.WriteLine("当前无报警/No current alarms"); } else { Console.WriteLine($"最严重报警/Most Severe Alarm: {topError}"); } } else { Console.WriteLine($"获取最严重报警失败/Get Top Alarm Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.8.2 获取所有活动报警 [​](#4-8-2) | 方法名 | **Alarm.GetAllActiveAlarms**() | | ---------- | --------------------------------------------------------------- | | 描述 | 获取所有当前活动的报警 | | 请求参数 | 无参数 | | 返回值 | List: 活动报警条目列表 [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Alarm/GetAllActiveAlarms.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetAllActiveAlarms { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取所有的活动的报警 // [EN] Get all active alarms List errors; (errors, code) = controller.Alarm.GetAllActiveAlarms(); if (code == StatusCode.OK) { Console.WriteLine("获取所有活动报警成功/Get All Active Alarm Success"); Console.WriteLine($"活动报警数量/Active Alarm Count: {errors.Count}"); if (errors.Count == 0) { Console.WriteLine("当前无活动报警/No active alarms"); } else { Console.WriteLine("活动报警列表/Active Alarm List:"); for (int i = 0; i < errors.Count; i++) { Console.WriteLine($" {i + 1}. {errors[i]}"); } } } else { Console.WriteLine($"获取所有活动报警失败/Get All Active Alarm Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.8.3 复位报警 [​](#4-8-3) | 方法名 | **Alarm.ResetAlarms**() | | ---------- | ---------------------------------------------- | | 描述 | 复位当前错误 / 报警 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/2-csharp/4-methods/4.9-fileManager.html title: 4.9 文件服务类 --- # 4.9 文件服务类 [​](#4-9) ## 概述 [​](#概述) FileManager 用于在上位机和机器人控制器之间上传、下载、删除或搜索程序、轨迹及临时文件等资源,支持多种文件类型的管理和操作。 ### 核心功能 [​](#核心功能) * 支持本地文件上传到机器人控制器 * 支持机器人文件下载到本地目录 * 支持从机器人控制器删除文件 * 支持按文件名模式搜索文件 * 支持多种文件类型管理(UserProgram、BlockProgram、TrajectoryProgram、TmpFile) * 支持上传 / 下载时的覆盖控制 ### 使用场景 [​](#使用场景) * 部署程序到机器人控制器 * 备份机器人上的程序和轨迹文件 * 同步调试产线数据 * 批量管理和查询机器人文件 * 上传临时数据文件到机器人 * 下载机器人日志或输出文件到本地 ## 4.9.1 上传本地文件到机器人 [​](#4-9-1) | 方法名 | **FileManager.Upload**(string filePath , FileType ft , bool overWriting \= false) | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将本地文件上传到机器人控制器 | | 请求参数 | filePath : string 本地文件绝对路径。 ft : [FileType](./../3-struct/#3-18) 文件类型枚举值(UserProgram: filePath 为程序名路径,上传同目录 .json / .xml ;BlockProgram: filePath 为积木程序名路径,上传同目录 .block / .json / .xml ;TrajectoryProgram: filePath 为完整轨迹文件路径;TmpFile: filePath 为完整临时文件路径)。 overWriting : bool 是否覆盖同名文件(默认 false )。 | | 备注 | UserProgram 、 BlockProgram 上传时请提供对应 .xml / .block 文件的完整路径,系统会同时上传同名 .json / .xml 文件。 | | 返回值 | [StatusCode](./../3-struct/#3-1): 上传操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.9.2 下载机器人文件到本地 [​](#4-9-2) | 方法名 | **FileManager.Download**(string fileName , FileType ft , string savePath ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 将机器人上的文件下载到本地目录。 | | 请求参数 | fileName : string 文件名。 ft : [FileType](./../3-struct/#3-18) 文件类型枚举值。 savePath : string 本地保存目录。 | | 备注 | UserProgram / BlockProgram / TrajectoryProgram 下载时仅填写程序名(不含后缀),系统会下载对应 .json / .xml 或 .trajectory 文件; TmpFile 请填写带后缀的完整文件名(如 .csv )。 | | 返回值 | [StatusCode](./../3-struct/#3-1): 下载操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.9.3 删除机器人上的文件 [​](#4-9-3) | 方法名 | **FileManager.Delete**(string fileName , FileType ft ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 删除机器人控制器上的文件 | | 请求参数 | fileName : string 要删除的文件名 ft : [FileType](./../3-struct/#3-18) 要删除的文件类型 | | 备注 | UserProgram / BlockProgram / TrajectoryProgram 删除时仅填写程序名(不含后缀); TmpFile 请填写带后缀的完整文件名。 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 FileManager/UserProgramOperations.cs ```cs using System.Collections.Generic; using System.IO; using Agilebot.IR; using Agilebot.IR.FileManager; using Agilebot.IR.Types; public class UserProgramOperations { /// /// 测试用户程序文件的完整操作流程:上传、下载、搜索和删除 /// public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { Console.WriteLine("开始用户程序文件操作测试/Starting User Program File Operations Test"); // [ZH] 获取测试文件路径 // [EN] Get test file path string file_user_program = GetTestFilePath("test_prog.xml"); string fileName = "test_prog"; string save_path = GetTestFilePath("download"); // [ZH] 上传用户程序文件 // [EN] Upload user program file code = controller.FileManager.Upload(file_user_program, FileType.UserProgram, true); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件上传成功/User Program File Upload Success: {fileName}"); } else { Console.WriteLine($"用户程序文件上传失败/User Program File Upload Failed: {code.GetDescription()}"); return code; } // [ZH] 等待下载 // [EN] Wait before download Thread.Sleep(1000); // [ZH] 下载用户程序文件 // [EN] Download user program file code = controller.FileManager.Download(fileName, FileType.UserProgram, save_path); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件下载成功/User Program File Download Success: {fileName}"); } else { Console.WriteLine($"用户程序文件下载失败/User Program File Download Failed: {code.GetDescription()}"); return code; } // [ZH] 搜索用户程序文件 // [EN] Search user program file List results = new List(); (results, code) = controller.FileManager.Search(fileName); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件搜索成功/User Program File Search Success"); Console.WriteLine($"搜索结果数量/Search Results Count: {results.Count}"); foreach (var result in results) { Console.WriteLine($" 找到文件/Found File: {result}"); } } else { Console.WriteLine($"用户程序文件搜索失败/User Program File Search Failed: {code.GetDescription()}"); return code; } // [ZH] 等待删除 // [EN] Wait before delete Thread.Sleep(1000); // [ZH] 删除用户程序文件 // [EN] Delete user program file code = controller.FileManager.Delete(fileName, FileType.UserProgram); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件删除成功/User Program File Delete Success: {fileName}"); } else { Console.WriteLine($"用户程序文件删除失败/User Program File Delete Failed: {code.GetDescription()}"); return code; } Console.WriteLine("用户程序文件操作测试完成/User Program File Operations Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } /// /// 获取test_files文件夹中文件的路径示例方法 /// 展示如何获取当前程序目录下的test_files文件夹中的文件路径 /// private static string GetTestFilePath(string fileName) { // [ZH] 获取当前程序集的目录 // [EN] Get current assembly directory string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName(); if (string.IsNullOrEmpty(codeFilePath)) { throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path"); } string? codeDirectory = Path.GetDirectoryName(codeFilePath); if (string.IsNullOrEmpty(codeDirectory)) { throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path"); } // [ZH] 构建test_files文件夹路径 // [EN] Build test_files folder path string testFilesDirectory = Path.Combine(codeDirectory, "test_files"); // [ZH] 构建文件完整路径 // [EN] Build complete file path string filePath = Path.Combine(testFilesDirectory, fileName); return filePath; } } ``` ## 4.9.4 按文件名模式搜索文件 [​](#4-9-4) | 方法名 | **FileManager.Search**(string pattern , ref List fl ) | | ---------- | ------------------------------------------------------------- | | 描述 | 在机器人控制器上按文件名模式搜索文件。 | | 请求参数 | pattern : string 文件名匹配模式 fl : ref List 返回的文件列表 | | 返回值 | [StatusCode](./../3-struct/#3-1): 搜索操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/2-csharp/4-methods/4.10-basScript.html title: 4.10 BasScript 脚本程序类 --- # 4.10 BasScript 脚本程序类 [​](#4-10) ## 概述 [​](#概述) BasScript 用于在上位机以结构化方式构建机器人中的 BAS 指令序列,涵盖运动、逻辑、程序调用、通信、视觉和 Modbus 等多种指令类型。 ### 核心功能 [​](#核心功能) * 支持构建运动指令(MoveJoint、MoveLine、MoveCircle 等) * 支持构建逻辑指令(If、While、Switch、Goto 等) * 支持构建赋值、等待、暂停和中断指令 * 支持构建程序调用和管理指令 * 支持构建 Socket 通信指令 * 支持构建 Modbus 寄存器读写指令 * 支持构建视觉程序指令 * 支持设置额外参数(加速度、RTCP、帧偏移等) * 支持快速运动指令(JUMP 系列) ### 使用场景 [​](#使用场景) * 自动化生成复杂的机器人程序 * 编辑和修改机器人程序 * 复用常用程序模块和指令序列 * 实现上位机与机器人程序的无缝对接 * 构建定制化的机器人运动轨迹 * 集成视觉、通信和 Modbus 功能到机器人程序中 ## 类构造函数 [​](#类构造函数) | 方法名 | **BasScript**(string name ) | | ---------- | ---------------------------------------- | | 描述 | 构建用于机器人中的 BAS 指令序列类 | | 请求参数 | name : string 脚本程序名称 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 本类下所有方法的兼容版本要求与本类一致 | ## 子类结构 [​](#子类结构) BasScript 类包含以下子类,用于组织不同类型的指令: 1. **ExtraParam**:额外参数类,用于构建复杂的机器人控制命令 2. **BasMotion**:运动指令子类,包含所有机器人运动相关的方法 3. **BasLogical**:逻辑指令子类,包含所有逻辑控制相关的方法 4. **BasStructure**:结构指令子类,包含所有结构控制相关的方法 5. **BasSocket**:Socket 通信子类,包含所有 Socket 通信相关的方法 6. **BasModbus**:Modbus 通信子类,包含所有 Modbus 通信相关的方法 7. **BasVision**:视觉指令子类,包含所有视觉相关的方法 ## 4.10.1 ExtraParam 额外参数类 [​](#4-10-1) | 方法名 | **ExtraParam**() | | ---- | -------------------- | | 描述 | 额外参数类,用于构建复杂的机器人控制命令 | | 请求参数 | 无 | | 返回值 | ExtraParam 对象 | ## 4.10.1.1 设置加速度 [​](#4-10-1-1) | 方法名 | **ExtraParam.Acceleration**(double value ) | | ---- | ------------------------------------------ | | 描述 | 设置加速度,范围为 1\~120% | | 请求参数 | value : double 加速度值,单位:%(浮点数) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.1.2 设置 RTCP 参数 [​](#4-10-1-2) | 方法名 | **ExtraParam.RTCP**() | | ---- | ------------------------------------------ | | 描述 | 设置 RTCP 参数,仅支持 MoveL 和 MoveC 指令 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.1.3 设置帧偏移 [​](#4-10-1-3) | 方法名 | **ExtraParam.Offset**(int index ) | | ---- | ------------------------------------------ | | 描述 | 设置帧偏移 | | 请求参数 | index : int 偏移索引(整数) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.1.4 设置时间基准运行或赋值 [​](#4-10-1-4) | 方法名 | **ExtraParam.TB**(double second , string type , string name ) | | ---- | --------------------------------------------------------------------------------- | | 描述 | 设置时间基准运行或赋值,范围为 0.01-30s,若输入小于 0.01 的数不会保存成功 | | 请求参数 | second : double 秒数,单位:sec(浮点数) type : string 执行类型(字符串) name : string 名称(用于运行,字符串) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | | 方法名 | **ExtraParam.TB**(double second , string type , int index , int status ) | | ---- | -------------------------------------------------------------------------------------------------------- | | 描述 | 设置时间基准运行或赋值,范围为 0.01-30s,若输入小于 0.01 的数不会保存成功 | | 请求参数 | second : double 秒数,单位:sec(浮点数) type : string IO 类型(字符串) index : int 索引(用于赋值,整数) status : int 状态(用于赋值,整数) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.1.5 设置跳转 [​](#4-10-1-5) | 方法名 | **ExtraParam.SKIP**(int index ) | | ---- | ----------------------------------------------------------------- | | 描述 | 设置跳转,当满足 SKIP CONDITION 指令设置的跳转条件时,从含有 SKIP 指令的当前行直接跳转到目标指令行或目标程序 | | 请求参数 | index : int 目标标签的索引(整数) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.1.6 设置出发距离和接近距离 [​](#4-10-1-6) | 方法名 | **ExtraParam.Approach**(double departureDist , double approachingDist ) | | ---- | ------------------------------------------------------------------------------- | | 描述 | 设置门型运动的出发距离和接近距离,仅用于 JUMP 指令 | | 请求参数 | departureDist : double 出发距离,单位:mm(浮点数) approachingDist : double 接近距离,单位:mm(浮点数) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.2 BasMotion 运动指令子类 [​](#4-10-2) BasMotion 子类包含所有机器人运动相关的方法,用于构建运动指令序列。 ## 4.10.2.1 MoveJoint 运动到点指令 [​](#4-10-2-1) | 方法名 | **BasScript.BasMotion.MoveJoint**(MovePoseType poseType , int poseIndex , SpeedType speedType , double speedValue , SmoothType smoothType , double smoothDistance \= 0, ExtraParam extraParam \= null) | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 关节运动指令,以指定的移动速度和移动方法使机器人向作业空间内的指定位置移动,对应机器人程序编写中的 MoveJoint 指令 | | 请求参数 | poseType : MovePoseType 位姿类型 poseIndex : int 位姿索引 speedType : SpeedType 速度类型 speedValue : double 速度值,单位:% smoothType : SmoothType 平滑类型 smoothDistance : double 平滑距离,单位:mm,取值范围:0\~1000 extraParam : ExtraParam 附加参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.2.2 MoveLine 直线运动到点指令 [​](#4-10-2-2) | 方法名 | **BasScript.BasMotion.MoveLine**(MovePoseType poseType , int poseIndex , SpeedType speedType , double speedValue , SmoothType smoothType , double smoothDistance \= 0, ExtraParam extraParam \= null) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 直线运动指令,以指定的移动速度和移动方法使机器人向作业空间内的指定位置直线移动,对应机器人程序编写中的 MoveLine 指令 | | 请求参数 | poseType : MovePoseType 位姿类型 poseIndex : int 位姿索引 speedType : SpeedType 速度类型 speedValue : double 速度值,单位:mm/s smoothType : SmoothType 平滑类型 smoothDistance : double 平滑距离,单位:mm,取值范围:0\~1000 extraParam : ExtraParam 附加参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.2.3 MoveCircle 弧线运动到点指令 [​](#4-10-2-3) | 方法名 | **BasScript.BasMotion.MoveCircle**(MovePoseType poseType1 , int poseIndex1 , MovePoseType poseType2 , int poseIndex2 , SpeedType speedType , double speedValue , SmoothType smoothType , double smoothDistance \= 0, ExtraParam extraParam \= null) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 圆弧运动指令,以指定的移动速度和移动方法使机器人向作业空间内的指定位置圆弧移动,对应机器人程序编写中的 MoveCircle 指令 | | 请求参数 | poseType1 : MovePoseType 第一个位姿类型 poseIndex1 : int 第一个位姿索引 poseType2 : MovePoseType 第二个位姿类型 poseIndex2 : int 第二个位姿索引 speedType : SpeedType 速度类型 speedValue : double 速度值,单位:mm/s smoothType : SmoothType 平滑类型 smoothDistance : double 平滑距离,单位:mm,取值范围:0\~1000 extraParam : ExtraParam 附加参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.2.4 Jump 点对点移动指令 [​](#4-10-2-4) | 方法名 | **BasScript.BasMotion.Jump**(MovePoseType poseType , int poseIndex , double speedValue , double speedRatio , SpeedType limZType , double limZValue , SmoothType smoothType , double smoothDistance \= 0, ExtraParam extraParam \= null) | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 门型运动指令,指定机器人做门型运动(首先垂直上升、然后水平移动,最后垂直下降),对应机器人程序编写中的 JUMP 指令 | | 请求参数 | poseType : MovePoseType 目标位姿存储类型 poseIndex : int 目标位置的索引 speedValue : double 移动速度的值,单位:mm/s speedRatio : double 移动速度的比率,单位:% limZType : SpeedType Z 轴限制的类型 limZValue : double Z 轴限制的值 smoothType : SmoothType 平滑类型 smoothDistance : double 平滑距离,单位:mm,取值范围:0\~1000 extraParam : ExtraParam 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.2.5 Jump3 三点跳跃指令 [​](#4-10-2-5) | 方法名 | **BasScript.BasMotion.Jump3**(MovePoseType poseType , int poseIndex , double speedValue , double speedRatio , SmoothType smoothType , double smoothDistance \= 0, ExtraParam extraParam \= null) | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 门型运动指令,指定机器人做门型运动,包含出发、接近和目标三个位置,对应机器人程序编写中的 JUMP3 指令 | | 请求参数 | poseType : MovePoseType 目标位姿存储类型 poseIndex : int 3 个目标位置的索引 speedValue : double 移动速度的值,单位:mm/s speedRatio : double 移动速度的比率,单位:% smoothType : SmoothType 平滑类型 smoothDistance : double 平滑距离,单位:mm,取值范围:0\~1000 extraParam : ExtraParam 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.2.6 Jump3CP 三点跳跃 CP 指令 [​](#4-10-2-6) | 方法名 | **BasScript.BasMotion.Jump3CP**(MovePoseType poseType , int poseIndex , double speedValue , SmoothType smoothType , double smoothDistance \= 0, ExtraParam extraParam \= null) | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 门型运动指令,指定机器人做门型运动,包含出发、接近和目标三个位置,对应机器人程序编写中的 JUMP3CP 指令 | | 请求参数 | poseType : MovePoseType 目标位姿存储类型 poseIndex : int 3 个目标位置的索引 speedValue : double 移动速度的值,单位:mm/s smoothType : SmoothType 平滑类型 smoothDistance : double 平滑距离,单位:mm,取值范围:0\~1000 extraParam : ExtraParam 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.3 BasLogical 逻辑指令子类 [​](#4-10-3) BasLogical 子类包含所有逻辑控制相关的方法,用于构建逻辑控制指令序列。 ## 4.10.3.1 IF 条件指令 [​](#4-10-3-1) | 方法名 | **BasScript.BasLogical.IF**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 IF 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 索引(整数) param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.2 ELSE\_IF 条件分支指令 [​](#4-10-3-2) | 方法名 | **BasScript.BasLogical.ELSE\_IF**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 ELSE IF 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 索引(整数) param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.3 ELSE 否则指令 [​](#4-10-3-3) | 方法名 | **BasScript.BasLogical.ELSE**() | | ---- | ---------------------------------------- | | 描述 | 添加一个逻辑 ELSE 语句到脚本中 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.4 END\_IF 结束条件指令 [​](#4-10-3-4) | 方法名 | **BasScript.BasLogical.END\_IF**() | | ---- | ---------------------------------------- | | 描述 | 结束逻辑 IF 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; using Agilebot.IR.BasScript; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; // 初始化捷勃特机器人 Arm controller = new Arm(controllerIP); // 连接捷勃特机器人 StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 生成脚本程序 BasScript script = new BasScript("test"); code = script.BasLogical.IF(RegisterType.R, 1, OtherType.VALUE, 1); code = script.BasMotion.MoveJoint(MovePoseType.PR, 1, SpeedType.VALUE, 25, SmoothType.FINE); code = script.BasLogical.ELSE_IF(RegisterType.R, 1, OtherType.VALUE, 2); code = script.BasMotion.MoveJoint(MovePoseType.PR, 2, SpeedType.VALUE, 50, SmoothType.FINE); code = script.BasLogical.ELSE(); code = script.BasMotion.MoveJoint(MovePoseType.PR, 3, SpeedType.VALUE, 50, SmoothType.FINE); code = script.BasLogical.END_IF(); // 执行脚本程序 code = controller.Execution.ExecuteBasScript(script); // 关闭连接 code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` ## 4.10.3.5 WHILE 循环指令 [​](#4-10-3-5) | 方法名 | **BasScript.BasLogical.WHILE**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 WHILE 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 索引(整数) param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.6 END\_WHILE 结束循环指令 [​](#4-10-3-6) | 方法名 | **BasScript.BasLogical.END\_WHILE**() | | ---- | ---------------------------------------- | | 描述 | 结束逻辑 While 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; using Agilebot.IR.BasScript; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; // 初始化捷勃特机器人 Arm controller = new Arm(controllerIP); // 连接捷勃特机器人 StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 生成脚本程序 BasScript script = new BasScript("test"); code = script.BasLogical.WHILE(IOType.DO, 1, OtherType.IO_STATUS, IOStatus.ON); code = script.BasMotion.MoveJoint(MovePoseType.PR, 1, SpeedType.VALUE, 25, SmoothType.FINE); code = script.BasLogical.END_WHILE(); // 执行脚本程序 code = controller.Execution.ExecuteBasScript(script); // 关闭连接 code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` ## 4.10.3.7 SWITCH 多分支选择指令 [​](#4-10-3-7) | 方法名 | **BasScript.BasLogical.SWITCH**(param, index) | | ---- | -------------------------------------------------- | | 描述 | 添加一个逻辑 SWITCH 语句到脚本中 | | 请求参数 | param : 参数,类型为 RegisterType 或 IOType index : 参数的索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.8 CASE 分支指令 [​](#4-10-3-8) | 方法名 | **BasScript.BasLogical.CASE**(param, value) | | ---- | --------------------------------------------------------------------- | | 描述 | 添加一个逻辑 CASE 语句到脚本中 | | 请求参数 | param : 参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.9 DEFAULT 默认分支指令 [​](#4-10-3-9) | 方法名 | **BasScript.BasLogical.DEFAULT**() | | ---- | ---------------------------------------- | | 描述 | 添加一个逻辑 DEFAULT 语句到脚本中 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.10 END\_SWITCH 结束多分支选择指令 [​](#4-10-3-10) | 方法名 | **BasScript.BasLogical.END\_SWITCH**() | | ---- | ---------------------------------------- | | 描述 | 结束逻辑 SWITCH 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.11 SKIP\_CONDITION 跳过条件指令 [​](#4-10-3-11) | 方法名 | **BasScript.BasLogical.SKIP\_CONDITION**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 SKIP CONDITION 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 参数一的索引 param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.12 GOTO 跳转指令 [​](#4-10-3-12) | 方法名 | **BasScript.BasLogical.GOTO**(index) | | ---- | ---------------------------------------- | | 描述 | GOTO 跳转语句 | | 请求参数 | index : 目标标签的索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.13 LABEL 标签指令 [​](#4-10-3-13) | 方法名 | **BasScript.BasLogical.LABEL**(index) | | ---- | ---------------------------------------- | | 描述 | LABEL 语句 | | 请求参数 | index : 标签的索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.14 BREAK 跳出循环指令 [​](#4-10-3-14) | 方法名 | **BasScript.BasLogical.BREAK**() | | ---- | ---------------------------------------- | | 描述 | BREAK 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.3.15 CONTINUE 跳过循环指令 [​](#4-10-3-15) | 方法名 | **BasScript.BasLogical.CONTINUE**() | | ---- | ---------------------------------------- | | 描述 | CONTINUE 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4 BasStructure 结构指令子类 [​](#4-10-4) BasStructure 子类包含所有结构控制相关的方法,用于构建结构控制指令序列。 ## 4.10.4.1 WAIT 等待条件指令 [​](#4-10-4-1) | 方法名 | **BasScript.BasStructure.WAIT**(RegisterType param1 , int index , ValueType param2 , object value , BooleanOperator operatorType \= BooleanOperator.EQ) | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 等待条件指令,执行 WAIT 指令只有当条件满足时,程序才能继续向下执行,否则一直等待直到条件满足为止,对应机器人程序编写中的 WAIT COND 等待条件语句 | | 请求参数 | param1 : RegisterType 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : ValueType 第二个参数(寄存器、IO 信号或其他类型) value : object 参数 2 的索引或值 operatorType : BooleanOperator 逻辑运算符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.2 WAIT\_TIME 等待时间指令 [​](#4-10-4-2) | 方法名 | **BasScript.BasStructure.WAIT\_TIME**(ValueType param , double value ) | | ---- | ----------------------------------------------------------------------- | | 描述 | 等待时间指令,执行 WAIT TIME 指令,机器人等待指定的时间后继续执行后续指令,对应机器人程序编写中的 WAIT TIME 等待时间语句 | | 请求参数 | param : ValueType 参数类型(R 寄存器或数值) value : double 时间值,单位:sec | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.3 PAUSE 暂停指令 [​](#4-10-4-3) | 方法名 | **BasScript.BasStructure.PAUSE**() | | ---- | ---------------------------------------- | | 描述 | PAUSE 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.4 ABORT 中断指令 [​](#4-10-4-4) | 方法名 | **BasScript.BasStructure.ABORT**() | | ---- | ---------------------------------------- | | 描述 | ABORT 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.5 CALL 同步调用程序指令 [​](#4-10-4-5) | 方法名 | **BasScript.BasStructure.CALL**(name) | | ---- | ---------------------------------------- | | 描述 | CALL 同步调用程序 | | 请求参数 | name : 程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.6 RUN 异步调用程序指令 [​](#4-10-4-6) | 方法名 | **BasScript.BasStructure.RUN**(name) | | ---- | ---------------------------------------- | | 描述 | RUN 异步调用程序 | | 请求参数 | name : 程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.7 LOAD 加载程序指令 [​](#4-10-4-7) | 方法名 | **BasScript.BasStructure.LOAD**(param, value) | | ---- | -------------------------------------------------- | | 描述 | LOAD 载入程序 | | 请求参数 | param : 参数,R 寄存器、SR 寄存器、数值或字符串 value : 参数的值,数值或字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.8 UNLOAD 卸载程序指令 [​](#4-10-4-8) | 方法名 | **BasScript.BasStructure.UNLOAD**(param, value) | | ---- | -------------------------------------------------- | | 描述 | UNLOAD 卸载程序 | | 请求参数 | param : 参数,R 寄存器、SR 寄存器、数值或字符串 value : 参数的值,数值或字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.4.9 EXEC 执行程序指令 [​](#4-10-4-9) | 方法名 | **BasScript.BasStructure.EXEC**(param, value) | | ---- | -------------------------------------------------- | | 描述 | EXEC 执行程序 | | 请求参数 | param : 参数,R 寄存器、SR 寄存器、数值或字符串 value : 参数的值,数值或字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.5 BasSocket Socket 通信子类 [​](#4-10-5) BasSocket 子类包含所有 Socket 通信相关的方法,用于构建 Socket 通信指令序列。 ## 4.10.5.1 OPEN 打开 socket 连接指令 [​](#4-10-5-1) | 方法名 | **BasScript.BasSocket.OPEN**(int index ) | | ---- | ------------------------------------------------------------------------------- | | 描述 | 使用 Socket Open 指令创建一个 Server 并等待 Client 连接,对应机器人程序编写中的 SOCKET OPEN 打开 socket 连接 | | 请求参数 | index : int SK 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.5.2 CLOSE 关闭 socket 连接指令 [​](#4-10-5-2) | 方法名 | **BasScript.BasSocket.CLOSE**(int index ) | | ---- | ----------------------------------------------------- | | 描述 | 关闭指定的 socket 连接,对应机器人程序编写中的 SOCKET CLOSE 关闭 socket 连接 | | 请求参数 | index : int SK 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.5.3 CONNECT 连接 socket 指令 [​](#4-10-5-3) | 方法名 | **BasScript.BasSocket.CONNECT**(int index ) | | ---- | -------------------------------------------------------------------------- | | 描述 | 使用 Socket Connect 指令连接到指定的 socket 服务器,对应机器人程序编写中的 SOCKET CONNECT 连接 socket | | 请求参数 | index : int SK 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.5.4 SEND 发送 socket 数据指令 [​](#4-10-5-4) | 方法名 | **BasScript.BasSocket.SEND**(int index , StrType msgType , object value ) | | ---- | ------------------------------------------------------------------------- | | 描述 | 使用 Socket Send 指令向指定的 socket 连接发送数据,对应机器人程序编写中的 SOCKET SEND 发送数据 | | 请求参数 | index : int SK 寄存器序号 msgType : StrType 消息类型 value : object 消息内容或序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.5.5 RECV 接收 socket 数据指令 [​](#4-10-5-5) | 方法名 | **BasScript.BasSocket.RECV**(int index , int msgLength , StrType msgType , object value ) | | ---- | ----------------------------------------------------------------------------------------- | | 描述 | 使用 Socket Recv 指令从指定的 socket 连接读取字符,可以指定最大长度,对应机器人程序编写中的 SOCKET RECV 接收数据 | | 请求参数 | index : int SK 寄存器序号 msgLength : int 消息最大长度 msgType : StrType 消息类型 value : object 消息内容或序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.6 BasModbus Modbus 通信子类 [​](#4-10-6) BasModbus 子类包含所有 Modbus 通信相关的方法,用于构建 Modbus 寄存器读写指令序列。 ## 4.10.6.1 READ\_MH 读取 Modbus 保持寄存器指令 [​](#4-10-6-1) | 方法名 | **BasScript.BasModbus.READ\_MH**(int index , int id , int address , int length , int rIndex ) | | ---- | -------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 Modbus 保持寄存器指令,对应机器人程序编写中的 READ\_MH 读取 Modbus 保持寄存器 | | 请求参数 | index : int 通道序号 id : int Modbus ID address : int 寄存器起始地址 length : int 寄存器长度,即要读取的寄存器数量 rIndex : int 写入结果的 R 寄存器起始序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.6.2 READ\_MI 读取 Modbus 输入寄存器指令 [​](#4-10-6-2) | 方法名 | **BasScript.BasModbus.READ\_MI**(int index , int id , int address , int length , int rIndex ) | | ---- | -------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取 Modbus 输入寄存器指令,对应机器人程序编写中的 READ\_MI 读取 Modbus 输入寄存器 | | 请求参数 | index : int 通道序号 id : int Modbus ID address : int 寄存器起始地址 length : int 寄存器长度,即要读取的寄存器数量 rIndex : int 写入结果的 R 寄存器起始序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.6.3 WRITE\_MH 写入 Modbus 保持寄存器指令 [​](#4-10-6-3) | 方法名 | **BasScript.BasModbus.WRITE\_MH**(int index , int id , int address , int length , ValueType valueType , int value ) | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 写入 Modbus 保持寄存器指令,对应机器人程序编写中的 WRITE\_MH 写入 Modbus 保持寄存器 | | 请求参数 | index : int 通道序号 id : int Modbus ID address : int 寄存器起始地址 length : int 寄存器长度,即要写入的寄存器数量 valueType : ValueType 值类型 value : int 值或 R 寄存器起始索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.7 BasVision 视觉指令子类 [​](#4-10-7) BasVision 子类包含所有视觉相关的方法,用于构建视觉程序指令序列。 ## 4.10.7.1 FIND 寻找视觉程序指令 [​](#4-10-7-1) | 方法名 | **BasScript.BasVision.FIND**(string name ) | | ---- | ------------------------------------------ | | 描述 | 执行视觉寻找程序,对应机器人程序编写中的 VISION FIND 寻找视觉程序 | | 请求参数 | name : string 视觉程序名称 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.7.2 GET\_OFFSET 获取视觉程序偏移量指令 [​](#4-10-7-2) | 方法名 | **BasScript.BasVision.GET\_OFFSET**(string name , int index , int labelIndex ) | | ---- | ------------------------------------------------------------------------------ | | 描述 | 获取视觉程序执行后的偏移量,对应机器人程序编写中的 VISION GET OFFSET 获取视觉程序偏移量 | | 请求参数 | name : string 视觉程序名称 index : int 视觉寄存器索引 labelIndex : int 标签索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.7.3 GET\_QUANTITY 获取视觉程序结果指令 [​](#4-10-7-3) | 方法名 | **BasScript.BasVision.GET\_QUANTITY**(string name , int index ) | | ---- | --------------------------------------------------------------- | | 描述 | 获取视觉程序执行后的结果数量,对应机器人程序编写中的 VISION GET QUANTITY 获取视觉程序结果 | | 请求参数 | name : string 视觉程序名称 index : int 结果存储的 R 寄存器索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.8 AssignValue 赋值指令(完整参数) [​](#4-10-8) | 方法名 | **BasScript.AssignValue**(AssignType param1 , int index , AssignType param2 , object value , int optIndex \= 0, int optValue \= 0) | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 赋值指令,用于给寄存器、IO 信号等赋值,对应机器人程序编写中的 ASSIGN 赋值语句 | | 请求参数 | param1 : AssignType 第一个参数(寄存器或 IO 信号) index : int 参数 1 的索引 param2 : AssignType 第二个参数(寄存器、IO 信号或其他类型) value : object 参数 2 的索引或值 optIndex : int 参数 1 为 PR\_ELEMENT 时的额外索引,默认 0 optValue : int 参数 2 为 PR\_ELEMENT 时的额外索引或 value 为 IOStatus.PULSE 时的脉冲值,默认 0 | | 返回值 | [StatusCode](./../3-struct/#3-1): 赋值指令执行结果 | ## 4.10.9 AssignValue 赋值指令(简化参数) [​](#4-10-9) | 方法名 | **BasScript.AssignValue**(AssignType param , int index , object value ) | | ---- | ----------------------------------------------------------------------------------------------- | | 描述 | 赋值指令(简化参数),用于给寄存器、IO 信号等赋值,对应机器人程序编写中的 ASSIGN 赋值语句 | | 请求参数 | param : AssignType 参数类型(寄存器或 IO 信号) index : int 参数索引 value : object 值(IOStatus、double 或 string) | | 返回值 | [StatusCode](./../3-struct/#3-1): 赋值操作执行结果 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; using Agilebot.IR.BasScript; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; // 初始化捷勃特机器人 Arm controller = new Arm(controllerIP); // 连接捷勃特机器人 StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 生成脚本程序 BasScript script = new BasScript("test"); code = script.BasMotion.MoveJoint(MovePoseType.PR, 1, SpeedType.VALUE, 25, SmoothType.FINE); BasScript.ExtraParam param = new(); param.Acceleration(80); code = script.BasMotion.MoveJoint(MovePoseType.PR, 2, SpeedType.VALUE, 50, SmoothType.FINE, extraParam: param); // 执行脚本程序 code = controller.Execution.ExecuteBasScript(script); // 关闭连接 code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` ## 4.10.10 SetParam 设置参数指令 [​](#4-10-10) | 方法名 | **BasScript.SetParam**(ParamType type , ValueType valueType , object value ) | | ---- | ---------------------------------------------------------------------------- | | 描述 | 设置参数指令,用于设置机器人的各种参数,对应机器人程序编写中的 SET PARAM 设置参数 | | 请求参数 | type : ParamType 参数类型 valueType : ValueType 值类型 value : object 值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | --- --- url: /zh/2-csharp/4-methods/4.11-coordinateSystem.html title: 4.11 坐标系类 --- # 4.11 坐标系类 [​](#4-11) ## 概述 [​](#概述) CoordinateSystem 类用于管理机器人用户坐标系(UF)与工具坐标系(TF),提供新增、删除、更新、查询和计算坐标系的统一接口。 ### 核心功能 [​](#核心功能) * 支持获取用户 / 工具坐标系摘要信息列表 * 支持添加、删除、更新和查询用户 / 工具坐标系 * 支持根据输入的多组位姿计算用户 / 工具坐标系 * 提供统一的坐标系管理接口,便于维护控制器中的坐标系列表 ### 使用场景 [​](#使用场景) * 工具切换时管理不同工具坐标系 * 多工位调试时保持一致的空间参考 * 批量管理和查询机器人坐标系 * 根据示教点快速计算新的用户 / 工具坐标系 ## 4.11.1 获取用户 / 工具坐标系列表 [​](#4-11-1) | 方法名 | **CoordinateSystem.GetCoordinateList**(CoordinateType type ) | | ---------- | -------------------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型,获取所有坐标系摘要信息列表 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型(UF 或 TF) | | 返回值 | List<[CoordSummary](./../3-struct/#3-22-2)\>: 坐标系摘要信息列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.2 添加用户 / 工具坐标系 [​](#4-11-2) | 方法名 | **CoordinateSystem.Add**(CoordinateType type , Coordinate coordinate ) | | ---------- | ---------------------------------------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型,添加一个新的坐标系 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型(UF 或 TF) coordinate : [Coordinate](./../3-struct/#3-22) 要添加的坐标系信息 | | 返回值 | [StatusCode](./../3-struct/#3-1): 添加操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.3 删除用户 / 工具坐标系 [​](#4-11-3) | 方法名 | **CoordinateSystem.Delete**(CoordinateType type , int index ) | | ---------- | ------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和索引,删除对应坐标系 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型(UF 或 TF) index : int 坐标系索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.4 更新用户 / 工具坐标系 [​](#4-11-4) | 方法名 | **CoordinateSystem.Update**(CoordinateType type , Coordinate coordinate ) | | ---------- | ---------------------------------------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和坐标系信息,更新对应坐标系 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型(UF 或 TF) coordinate : [Coordinate](./../3-struct/#3-22) 要更新的坐标系信息 | | 返回值 | [StatusCode](./../3-struct/#3-1): 更新操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.5 获取用户 / 工具坐标系信息 [​](#4-11-5) | 方法名 | **CoordinateSystem.Get**(CoordinateType type , int index ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和索引,获取对应坐标系信息 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型(UF 或 TF) index : int 坐标系索引 | | 返回值 | [Coordinate](./../3-struct/#3-22): 坐标系信息数据 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.6 计算用户 / 工具坐标系 [​](#4-11-6) | 方法名 | **CoordinateSystem.Calculate**(CoordinateType type , List<[Position](./../3-struct/#3-10-1)\> pose ) | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 根据输入的位姿点集,计算用户 / 工具坐标系 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型(UF 或 TF) pose : List<[Position](./../3-struct/#3-10-1)\> 输入位姿列表,支持 4 点法或 7 点法。4 点法为 4 组工具指向同一点的位姿;7 点法在此基础上增加坐标原点、X 方向点和 Y 方向点。角度单位为度(°) | | 返回值 | [Position](./../3-struct/#3-10-1): 计算后的坐标系位姿 [StatusCode](./../3-struct/#3-1): 计算操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 CoordinateSystem/TFCoordinateTest.cs ```cs using Agilebot.IR; using Agilebot.IR.CoordinateSystem; using Agilebot.IR.Types; public class TFCoordinateTest { /// /// 测试 TF 坐标系的计算、添加、获取列表、获取单个坐标系、更新和删除操作 /// public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 准备测试数据 // [EN] Prepare test data var poseData = new List { new Position(847.0999429718556, 166.7999999999656, 276.8195498896624, 90, 0, -70), new Position(809.0227439212846, 166.79999999994843, 459.80354972094295, 90, 0, -45), new Position(717.1223240422377, 166.79999999993265, 654.0891675073312, 90, 0, -30), new Position(572.917828754028, 166.79999999992168, 825.1862002007621, 90, 0, -40), }; Console.WriteLine("开始TF坐标系测试/Starting TF Coordinate Test"); // [ZH] 计算坐标系 // [EN] Calculate coordinate system Coordinate calculatedCoord = new Coordinate(); (Position coord, StatusCode calculateCode) = controller.CoordinateSystem.Calculate( CoordinateType.ToolCoordinate, poseData ); if (code == StatusCode.OK) { Console.WriteLine("计算TF坐标系成功/Calculate TF Coordinate Success"); } else { Console.WriteLine($"计算TF坐标系失败/Calculate TF Coordinate Failed: {code.GetDescription()}"); return code; } calculatedCoord.Id = 5; calculatedCoord.Data = coord; // [ZH] 删除可能存在的坐标系 // [EN] Delete existing coordinate if exists StatusCode deleteCode = controller.CoordinateSystem.Delete( CoordinateType.ToolCoordinate, calculatedCoord.Id ); Console.WriteLine($"删除现有坐标系/Delete Existing Coordinate: {deleteCode.GetDescription()}"); // [ZH] 添加坐标系 // [EN] Add coordinate system StatusCode addCode = controller.CoordinateSystem.Add(CoordinateType.ToolCoordinate, calculatedCoord); if (addCode == StatusCode.OK) { Console.WriteLine("添加TF坐标系成功/Add TF Coordinate Success"); } else { Console.WriteLine($"添加TF坐标系失败/Add TF Coordinate Failed: {addCode.GetDescription()}"); return addCode; } // [ZH] 获取坐标系列表 // [EN] Get coordinate list List listRes; (listRes, code) = controller.CoordinateSystem.GetCoordinateList(CoordinateType.ToolCoordinate); if (code == StatusCode.OK) { Console.WriteLine("获取TF坐标系列表成功/Get TF Coordinate List Success"); Console.WriteLine($"坐标系列表数量/Coordinate List Count: {listRes.Count}"); } else { Console.WriteLine($"获取TF坐标系列表失败/Get TF Coordinate List Failed: {code.GetDescription()}"); return code; } // [ZH] 获取单个坐标系 // [EN] Get single coordinate Coordinate getCoord; (getCoord, code) = controller.CoordinateSystem.Get(CoordinateType.ToolCoordinate, calculatedCoord.Id); if (code == StatusCode.OK) { Console.WriteLine("获取TF坐标系成功/Get TF Coordinate Success"); Console.WriteLine($"坐标系名称/Coordinate Name: {getCoord.Name}"); } else { Console.WriteLine($"获取TF坐标系失败/Get TF Coordinate Failed: {code.GetDescription()}"); return code; } // [ZH] 更新坐标系 // [EN] Update coordinate system getCoord.Name = "test"; StatusCode updateCode = controller.CoordinateSystem.Update(CoordinateType.ToolCoordinate, getCoord); if (updateCode == StatusCode.OK) { Console.WriteLine("更新TF坐标系成功/Update TF Coordinate Success"); } else { Console.WriteLine($"更新TF坐标系失败/Update TF Coordinate Failed: {updateCode.GetDescription()}"); return updateCode; } // [ZH] 删除坐标系 // [EN] Delete coordinate system deleteCode = controller.CoordinateSystem.Delete(CoordinateType.ToolCoordinate, calculatedCoord.Id); if (deleteCode == StatusCode.OK) { Console.WriteLine("删除TF坐标系成功/Delete TF Coordinate Success"); } else { Console.WriteLine($"删除TF坐标系失败/Delete TF Coordinate Failed: {deleteCode.GetDescription()}"); return deleteCode; } Console.WriteLine("TF坐标系测试完成/TF Coordinate Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.12-jogging.html title: 4.12 机器人示教运动 --- # 4.12 机器人示教运动 [​](#4-12) ## 概述 [​](#概述) Jogging 类提供机器人在示教模式下的点动控制接口,支持单轴步进、单轴连续点动、多轴联动及停止操作。 ### 核心功能 [​](#核心功能) * 支持机器人单轴步进示教运动 * 支持机器人单轴连续点动示教运动 * 支持机器人多轴连续示教运动 * 支持停止机器人连续示教运动 * 支持通过方向符号控制正向 / 反向点动 * 支持设置步进长度和旋转步进角度 ### 使用场景 [​](#使用场景) * 机器人调试和示教过程 * 位置微调和姿态修正 * 上位机远程手动调姿 * 机器人安装和校准 * 复杂轨迹执行前的定位确认 ## 4.12.1 单轴步进示教运动 [​](#4-12-1) | 方法名 | **Jogging.Move**(int ajNum , MoveMode moveMode , double stepLength \= 0, double stepAngle \= 0) | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人按设定步进量进行单轴示教运动( moveMode 取 MoveMode.Stepping ) | | 请求参数 | ajNum : int 轴编号(1\~6 对应当前坐标系各轴;笛卡尔坐标系下 x/y/z/rx/ry/rz 对应 1\~6;数值正负表示运动方向) moveMode : MoveMode 运动模式,单轴步进场景固定为 MoveMode.Stepping stepLength : double 单次直线步进长度,单位 mm(步进模式下生效) stepAngle : double 单次旋转步进角度,单位 °(步进模式下生效) | | 返回值 | [StatusCode](./../3-struct/#3-1): 返回点动是否成功的状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/StepJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class StepJogging { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人模式 // [EN] Get robot mode (UserOpMode opMode, StatusCode opCode) = controller.GetOpMode(); if (opCode == StatusCode.OK) { Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}"); if (opMode != UserOpMode.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 设置单步示教运动参数 // [EN] Set step jogging parameters int ajNum = 1; // 轴序号,正数表示正方向运动 MoveMode moveMode = MoveMode.Stepping; // 单步运动模式 double stepLength = 5.0; // 步长,单位为mm或角度 double stepAngle = 5.0; // 轴旋转角度,单位为角度 Console.WriteLine("开始单步示教运动/Starting Step Jogging"); Console.WriteLine($"轴序号/Axis Number: {ajNum}"); Console.WriteLine($"运动模式/Move Mode: {moveMode}"); Console.WriteLine($"步长/Step Length: {stepLength}"); // [ZH] 执行单步示教运动 // [EN] Execute step jogging movement code = controller.Jogging.Move(ajNum, moveMode, stepLength, stepAngle); if (code == StatusCode.OK) { Console.WriteLine("单步示教运动执行成功/Step Jogging Executed Successfully"); Console.WriteLine( $"轴{ajNum}向正方向移动{stepLength}单位/Axis {ajNum} moved {stepLength} units in positive direction" ); } else { Console.WriteLine($"单步示教运动执行失败/Step Jogging Execution Failed: {code.GetDescription()}"); } // [ZH] 等待一秒后执行反向运动 // [EN] Wait one second then execute reverse movement Thread.Sleep(1000); // [ZH] 执行反向单步运动 // [EN] Execute reverse step movement int reverseAjNum = -ajNum; // 负数表示负方向运动 code = controller.Jogging.Move(reverseAjNum, moveMode, stepLength, stepAngle); if (code == StatusCode.OK) { Console.WriteLine("反向单步示教运动执行成功/Reverse Step Jogging Executed Successfully"); Console.WriteLine( $"轴{Math.Abs(reverseAjNum)}向负方向移动{stepLength}单位/Axis {Math.Abs(reverseAjNum)} moved {stepLength} units in negative direction" ); } else { Console.WriteLine( $"反向单步示教运动执行失败/Reverse Step Jogging Execution Failed: {code.GetDescription()}" ); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.12.2 单轴连续点动示教运动 [​](#4-12-2) | 方法名 | **Jogging.Move**(int ajNum , MoveMode moveMode , double stepLength \= 0, double stepAngle \= 0) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人进行单轴连续点动示教运动( moveMode 取 MoveMode.Continuous ) | | 请求参数 | ajNum : int 轴编号(1\~6 对应当前坐标系各轴;笛卡尔坐标系下 x/y/z/rx/ry/rz 对应 1\~6;数值正负表示运动方向) moveMode : MoveMode 运动模式,单轴连续点动场景固定为 MoveMode.Continuous stepLength : double 步长参数(连续模式下通常不使用) stepAngle : double 步角参数(连续模式下通常不使用) | | 返回值 | [StatusCode](./../3-struct/#3-1): 返回点动是否成功的状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/ContinuousJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ContinuousJogging { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人模式 // [EN] Get robot mode (UserOpMode opMode, StatusCode opCode) = controller.GetOpMode(); if (opCode == StatusCode.OK) { Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}"); if (opMode != UserOpMode.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 设置示教运动参数 // [EN] Set jogging parameters int ajNum = 3; // 轴序号,正数表示正方向运动 MoveMode moveMode = MoveMode.Continuous; // 连续运动模式 Console.WriteLine("开始连续示教运动/Starting Continuous Jogging"); Console.WriteLine($"轴序号/Axis Number: {ajNum}"); Console.WriteLine($"运动模式/Move Mode: {moveMode}"); // [ZH] 启动连续示教运动 // [EN] Start continuous jogging movement code = controller.Jogging.Move(ajNum, moveMode); if (code == StatusCode.OK) { Console.WriteLine("连续示教运动启动成功/Continuous Jogging Started Successfully"); Console.WriteLine("运动3秒后自动停止/Moving for 3 seconds then auto stop"); // [ZH] 运动3秒 // [EN] Move for 3 seconds Thread.Sleep(3000); // [ZH] 停止示教运动 // [EN] Stop jogging movement controller.Jogging.Stop(); Console.WriteLine("示教运动已停止/Jogging Movement Stopped"); } else { Console.WriteLine($"连续示教运动启动失败/Continuous Jogging Start Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.12.3 多轴连续示教运动 [​](#4-12-3) | 方法名 | **Jogging.MultiMove**(int\[\] ajNums ) | | ---------- | ----------------------------------------------------------------------------------- | | 描述 | 控制机器人多轴同时进行连续示教运动 | | 请求参数 | ajNums : int \[\] 轴编号列表(1\~6 对应当前坐标系各轴;笛卡尔坐标系下 x/y/z/rx/ry/rz 对应 1\~6;数值正负表示各轴运动方向) | | 返回值 | [StatusCode](./../3-struct/#3-1): 返回点动是否成功的状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/MultiJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Jogging; using Agilebot.IR.Types; public class MultiJogging { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人模式 // [EN] Get robot mode (UserOpMode opMode, StatusCode opCode) = controller.GetOpMode(); if (opCode == StatusCode.OK) { Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}"); if (opMode != UserOpMode.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } Console.WriteLine("开始多轴示教运动/Starting Multi-axis Jogging"); Console.WriteLine("演示多轴运动/Demo multi-axis step movements"); // [ZH] 多轴运动 // [EN] Multi-axis step movement Console.WriteLine("\n=== 多轴运动/Multi-axis Step Movement ==="); int[] axes = { 1, 2, 3 }; // 正方向运动 code = controller.Jogging.MultiMove(axes); if (code == StatusCode.OK) { Console.WriteLine("连续示教运动启动成功/Continuous Jogging Started Successfully"); Console.WriteLine("运动3秒后自动停止/Moving for 3 seconds then auto stop"); // [ZH] 运动3秒 // [EN] Move for 3 seconds Thread.Sleep(3000); // [ZH] 停止示教运动 // [EN] Stop jogging movement controller.Jogging.Stop(); Console.WriteLine("示教运动已停止/Jogging Movement Stopped"); } else { Console.WriteLine($"连续示教运动启动失败/Continuous Jogging Start Failed: {code.GetDescription()}"); } Console.WriteLine("\n多轴示教运动完成/Multi-axis Jogging Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.12.4 停止机器人连续运动 [​](#4-12-4) | 方法名 | **Jogging.Stop**() | | ---------- | ---------------------------------------------- | | 描述 | 终止机器人当前示教点动(JOG)连续运动 | | 请求参数 | 无 | | 返回值 | void | | 备注 | 仅在连续点动模式下需要调用此方法停止运动 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/ContinuousJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ContinuousJogging { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); if (code != StatusCode.OK) { return code; } try { // [ZH] 获取机器人模式 // [EN] Get robot mode (UserOpMode opMode, StatusCode opCode) = controller.GetOpMode(); if (opCode == StatusCode.OK) { Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}"); if (opMode != UserOpMode.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 设置示教运动参数 // [EN] Set jogging parameters int ajNum = 3; // 轴序号,正数表示正方向运动 MoveMode moveMode = MoveMode.Continuous; // 连续运动模式 Console.WriteLine("开始连续示教运动/Starting Continuous Jogging"); Console.WriteLine($"轴序号/Axis Number: {ajNum}"); Console.WriteLine($"运动模式/Move Mode: {moveMode}"); // [ZH] 启动连续示教运动 // [EN] Start continuous jogging movement code = controller.Jogging.Move(ajNum, moveMode); if (code == StatusCode.OK) { Console.WriteLine("连续示教运动启动成功/Continuous Jogging Started Successfully"); Console.WriteLine("运动3秒后自动停止/Moving for 3 seconds then auto stop"); // [ZH] 运动3秒 // [EN] Move for 3 seconds Thread.Sleep(3000); // [ZH] 停止示教运动 // [EN] Stop jogging movement controller.Jogging.Stop(); Console.WriteLine("示教运动已停止/Jogging Movement Stopped"); } else { Console.WriteLine($"连续示教运动启动失败/Continuous Jogging Start Failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.13-subpub.html title: 4.13 机器人订阅发布接口 --- # 4.13 机器人订阅发布接口 [​](#4-13) ## 概述 [​](#概述) SubPub 类提供机器人控制器 WebSocket 订阅 / 发布通道的管理能力,负责建立连接、订阅机器人状态 / 寄存器 / IO 等主题,并通过回调或阻塞接口接收实时数据。 ### 核心功能 [​](#核心功能) * 支持连接和断开 WebSocket 服务器 * 支持订阅机器人状态数据 * 支持订阅寄存器数据 * 支持订阅 IO 信号数据 * 支持通过回调函数持续接收消息 * 支持阻塞式接收下一条消息 * 支持设置订阅频率 * 支持在接收流程中处理异常并进行排查 ### 使用场景 [​](#使用场景) * 上位机实时监听机器人运行状态 * 实现机器人数据可视化 * 与外部系统实现数据联动 * 实时监控寄存器和 IO 状态 * 构建机器人监控和控制系统 * 实现机器人状态的实时报警和通知 ## 4.13.1 连接到 WebSocket 服务器 [​](#4-13-1) | 方法名 | **SubPub.Connect**() | | ---------- | ---------------------------------------------- | | 描述 | 连接到机器人控制器 WebSocket 服务器 | | 请求参数 | 无 | | 返回值 | Task:异步连接操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.2 断开 WebSocket 连接 [​](#4-13-2) | 方法名 | **SubPub.Disconnect**() | | ---------- | ---------------------------------------------- | | 描述 | 断开与机器人控制器 WebSocket 服务器的连接 | | 请求参数 | 无 | | 返回值 | Task:异步断开操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.3 添加机器人状态订阅 [​](#4-13-3) | 方法名 | **SubPub.SubscribeStatus**(RobotTopicType\[\] topicTypes , int frequency \= 200) | | ---------- | ---------------------------------------------------------------------------------------------------- | | 描述 | 添加机器人状态数据订阅 | | 请求参数 | topicTypes : [RobotTopicType](./../3-struct/#3-23) \[\] 机器人主题类型列表 frequency : int 订阅频率(单位 Hz,默认 200) | | 返回值 | Task:异步订阅操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.4 添加寄存器订阅 [​](#4-13-4) | 方法名 | **SubPub.SubscribeRegister**(RegTopicType regType , int\[\] regIds , int frequency \= 200) | | ---------- | ------------------------------------------------------------------------------------------------------------------ | | 描述 | 添加寄存器数据订阅 | | 请求参数 | regType : [RegTopicType](./../3-struct/#3-24) 寄存器类型 regIds : int \[\] 寄存器 ID 列表 frequency : int 订阅频率(单位 Hz,默认 200) | | 返回值 | Task:异步订阅操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.5 添加 IO 订阅 [​](#4-13-5) | 方法名 | **SubPub.SubscribeIO**((IOTopicType, int)\[\] ioList , int frequency \= 200) | | ---------- | ---------------------------------------------------------------------------------------------------------------------- | | 描述 | 订阅 IO 信号数据,包括数字输入 / 输出等 | | 请求参数 | ioList : ([IOTopicType](./../3-struct/#3-25), int)\[\] IO 列表(每个元素为 (IO 类型, IO ID) ) frequency : int 订阅频率(单位 Hz,默认 200) | | 返回值 | Task:异步订阅操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.6 开始接收消息 [​](#4-13-6) | 方法名 | **SubPub.StartReceiving**(Func, Task> onMessageReceived ) | | ---------- | ------------------------------------------------------------------------------------ | | 描述 | 开始接收订阅消息,并通过回调函数处理接收到的数据 | | 请求参数 | onMessageReceived : Func, Task> 消息接收回调函数 | | 返回值 | Task:异步接收任务 | | 备注 | 若回调函数抛出异常,接收循环会终止。建议在回调内部自行捕获异常并记录日志 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | 示例代码 SubPub/CallbackReceiving.cs ```cs using Agilebot.IR; using Agilebot.IR.SubPub; using Agilebot.IR.Types; public class CallbackReceiving { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); // [ZH] 初始化捷勃特机器人SubPub // [EN] Initialize the Agilebot robot SubPub var subPub = controller.SubPub; try { Console.WriteLine("开始回调方式接收消息测试/Starting Callback Receiving Test"); // [ZH] 连接到WebSocket服务器 // [EN] Connect to WebSocket server subPub.Connect().Wait(); Console.WriteLine("WebSocket连接成功/WebSocket Connected Successfully"); // [ZH] 订阅机器人状态 // [EN] Subscribe to robot status var topicTypes = new RobotTopicType[] { RobotTopicType.TopicCurrentJoint, RobotTopicType.TopicRobotStatus }; subPub.SubscribeStatus(topicTypes, frequency: 100).Wait(); Console.WriteLine("机器人状态订阅成功/Robot Status Subscription Successful"); // [ZH] 订阅寄存器 // [EN] Subscribe to registers var regIds = new int[] { 1, 2, 3 }; subPub.SubscribeRegister(RegTopicType.R, regIds, frequency: 100).Wait(); Console.WriteLine("寄存器订阅成功/Register Subscription Successful"); // [ZH] 订阅IO // [EN] Subscribe to IO var ioList = new (IOTopicType, int)[] { (IOTopicType.DI, 0), (IOTopicType.DO, 1) }; subPub.SubscribeIO(ioList, frequency: 100).Wait(); Console.WriteLine("IO订阅成功/IO Subscription Successful"); int messageCount = 0; int maxMessages = 10; // 接收10条消息后停止 Console.WriteLine("开始接收消息/Starting to receive messages..."); // [ZH] 开始接收消息(回调方式) // [EN] Start receiving messages (callback method) subPub .StartReceiving(async message => { messageCount++; Console.WriteLine($"\n=== 收到第{messageCount}条消息/Received Message #{messageCount} ==="); foreach (var kv in message) { Console.WriteLine($"{kv.Key}: {kv.Value}"); } // [ZH] 接收指定数量消息后主动断开 // [EN] Disconnect after receiving specified number of messages if (messageCount >= maxMessages) { Console.WriteLine( $"已接收{maxMessages}条消息,准备断开连接/Received {maxMessages} messages, preparing to disconnect" ); subPub.Disconnect().Wait(); Console.WriteLine("WebSocket断开成功/WebSocket Disconnected Successfully"); } await Task.CompletedTask; }) .Wait(); Console.WriteLine("回调方式接收消息测试完成/Callback Receiving Test Completed"); return StatusCode.OK; } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); return StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } } } ``` ## 4.13.7 接收下一条消息 [​](#4-13-7) | 方法名 | **SubPub.Receive**() | | ---------- | ---------------------------------------------- | | 描述 | 阻塞接收下一条消息并返回 | | 请求参数 | 无 | | 返回值 | Task>:接收到的消息字典 | | 备注 | 连接未建立、连接被关闭或消息格式异常时会抛出异常 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | 示例代码 SubPub/PollingReceiving.cs ```cs using Agilebot.IR; using Agilebot.IR.SubPub; using Agilebot.IR.Types; public class PollingReceiving { public static StatusCode Run(string controllerIP, bool useLocalProxy = true) { // [ZH] 初始化捷勃特机器人 // [EN] Initialize the Agilebot robot Arm controller = new Arm(controllerIP, useLocalProxy); // [ZH] 连接捷勃特机器人 // [EN] Connect to the Agilebot robot StatusCode code = controller.ConnectSync(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected."); // [ZH] 初始化捷勃特机器人SubPub // [EN] Initialize the Agilebot robot SubPub var subPub = controller.SubPub; try { Console.WriteLine("开始轮询方式接收消息测试/Starting Polling Receiving Test"); // [ZH] 连接到WebSocket服务器 // [EN] Connect to WebSocket server subPub.Connect().Wait(); Console.WriteLine("WebSocket连接成功/WebSocket Connected Successfully"); // [ZH] 订阅机器人状态 // [EN] Subscribe to robot status var topicTypes = new RobotTopicType[] { RobotTopicType.TopicCurrentJoint, RobotTopicType.TopicRobotStatus }; subPub.SubscribeStatus(topicTypes, frequency: 100).Wait(); Console.WriteLine("机器人状态订阅成功/Robot Status Subscription Successful"); // [ZH] 订阅寄存器 // [EN] Subscribe to registers var regIds = new int[] { 1, 2, 3 }; subPub.SubscribeRegister(RegTopicType.R, regIds, frequency: 100).Wait(); Console.WriteLine("寄存器订阅成功/Register Subscription Successful"); // [ZH] 订阅IO // [EN] Subscribe to IO var ioList = new (IOTopicType, int)[] { (IOTopicType.DI, 0), (IOTopicType.DO, 1) }; subPub.SubscribeIO(ioList, frequency: 100).Wait(); Console.WriteLine("IO订阅成功/IO Subscription Successful"); int messageCount = 0; int maxMessages = 10; // 接收10条消息后停止 Console.WriteLine("开始轮询接收消息/Starting to poll messages..."); // [ZH] 循环接收消息直到达到期望数量 // [EN] Loop to receive messages until reaching desired count do { messageCount++; try { // [ZH] 接收单条消息 // [EN] Receive single message var message = subPub.Receive().Result; Console.WriteLine($"\n=== 收到第{messageCount}条消息/Received Message #{messageCount} ==="); foreach (var kv in message) { Console.WriteLine($"{kv.Key}: {kv.Value}"); } } catch (Exception ex) { Console.WriteLine($"接收消息时发生异常/Exception while receiving message: {ex.Message}"); break; } } while (messageCount < maxMessages); // [ZH] 断开连接 // [EN] Disconnect subPub.Disconnect().Wait(); Console.WriteLine("WebSocket断开成功/WebSocket Disconnected Successfully"); Console.WriteLine("轮询方式接收消息测试完成/Polling Receiving Test Completed"); return StatusCode.OK; } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); return StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } } } ``` --- url: /zh/2-csharp/Agilebot_Robot_CSharp_SDK_ChangeLog.html title: 捷勃特机器人 C# SDK 更新说明 --- # 捷勃特机器人 C# SDK 更新说明 [​](#捷勃特机器人-c-sdk-更新说明) ## 2.1.0.\* 更新(2026/4/9) [​](#210更新202649) 1. 添加 UDP 反馈配置相关接口 2. `Motion.SetPositionTrajectoryParams` 指定 UDP 位置控制的相关参数接口添加 `filterLayer` 参数 3. `Motion.Payload.GetPayloadIdentifyState` 获取负载测定状态接口更新消息解析 4. 添加 `TerminatePayloadIdentify` 终止负载测定接口 5. 添加轨迹表和路径表相关接口 6. 添加轨迹整形器相关接口 7. 添加路径规划参数相关接口 ## 2.0.3.\* 更新(2025/12/17) [​](#203更新20251217) 1. Arm 构造函数增加 teachPanelIP 参数 2. 去除 System.Text.Json 依赖 3. 增加同步连接接口 ConnectSync ## 2.0.2.\* 更新(2025/12/12) [​](#202更新20251212) 1. 修复 PR 寄存器结构体中数据读写顺序错误 ## 2.0.1.\* 更新(2025/10/21) [​](#201更新20251021) 1. 修复 jogging 持续运动时卡顿的问题 2. 修复构建项目时可能会报 proxy 执行文件无法复制的问题 ## 2.0.0.\* 更新(2025/9/10) [​](#200更新2025910) 1. 修改底层请求模式,添加本地控制器代理服务 2. 添加订阅功能 3. 调整 BasScript 类结构 4. 全面支持 .NET Framework 和 .NET ## 1.0.1.0 更新(2025/7/7) [​](#1010更新202577) 1. 增加旧的寄存器接口类 RegistersOld 兼容 7.6.0.0 以前的机器人版本 2. 增加 Estop 紧急制动接口 3. 修复文档中的示例程序 ## 1.0.0.0 更新(2025/5/30) [​](#1000更新2025530) 1. 改用 RPC 方式实现 2. 所有接口定义同步 Python 版本 --- url: /zh/3-help/agent-skills.html title: Agent Skills --- # Agent Skills [​](#agent-skills) Agent Skills 旨在为各类 AI 智能体(如 Codex、Claude Code 等)提供能力扩展,使其在特定工业或开发场景中具备标准化的执行流程与工具链。 ## 兼容的 Agent 类型 [​](#兼容的-agent-类型) 目前 Agent Skills 已实现对以下主流 AI 开发工具和 CLI 的自动识别与支持: * **IDE / 编辑器**:Cursor、Windsurf、Trae、Trae CN、VS Code(通过 Copilot / Continue)、Neovate、Pochi * **命令行工具(CLI)**:Claude Code、Kimi Code CLI、Gemini CLI、iFlow CLI、Kiro CLI、Mistral Vibe * **开发框架 / 平台**:OpenHands、Replit、Cline、Roo Code、Codex、Amp、Antigravity、Augment、OpenClaw * **其他**:CodeBuddy、Command Code、Droid、Junie、Kilo Code、Kode、MCPJam、Mux、OpenCode、Pi、Qoder、Qwen Code、Zencoder、AdaL ## 快速开始 [​](#快速开始) ### 1\. 环境准备 [​](#1-环境准备) 安装前请确保本地已配置 Node.js 环境。教程参考:[Node.js 下载与安装指南](https://dev.svfactory.com/docs/extension/zh/02-development/01-environment.html#nodejs%E4%B8%8B%E8%BD%BD-%E5%AE%89%E8%A3%85) ### 2\. 执行安装命令 [​](#2-执行安装命令) 在终端运行以下命令,进入交互式安装界面: ```bash npx skills add https://dev.svfactory.com -g ``` :::tip 安装说明:执行后,工具会自动扫描本地已安装的 Agent。您可以根据终端提示选择要注入技能的特定 Agent(如 Cursor、Claude Code 等)。 ::: ## 已提供的 Skills 列表 [​](#已提供的-skills-列表) ### agilebot-nlu-control(捷勃特机器人自然语言控制) [​](#agilebot-nlu-control捷勃特机器人自然语言控制) 该技能专为捷勃特机器人(Agilebot)设计。通过 NLU(自然语言理解)技术,让 Agent 能够直接解析并执行控制指令。 * 环境要求:必须确保系统 Python 可用且已安装 Conda。Skill 会自动检查必需依赖,若缺失会提示并引导安装。 * 触发场景:在对话中提到 “捷勃特机器人” 或 “Agilebot” 并给出具体控制意图时。 * 核心功能:自然语言指令解析与执行、机器人状态查询、基础动作控制、参数化运动指令(如距离 / 角度 / 速度)。 :::warning 警告 安装后的技能将以 Agent 的完整权限运行,请在正式使用前确保已在受信任的环境中完成配置。 **机器人运动存在风险,可能造成人身或设备伤害,请确保在安全的环境下使用,我们不负责由此带来的任何风险或损失。** ::: ## 使用示例 [​](#使用示例) 以 Codex 为例,安装成功后,直接在对话框输入指令即可: ![](/docs/sdk/images/nlu_agent_example.png) --- url: /zh/3-help/ai-coding.html title: AI 编程支持 --- # AI 编程支持 [​](#ai-编程支持) 本文档介绍如何使用 AI 辅助工具(如 CodeBuddy、Codex、Cursor 等)快速开发机器人控制程序。 ## 准备工作 [​](#准备工作) 使用 AI 编程前,需要准备参考文档: * **SDK 文档**: > **提示**:如果您使用的 AI Agent 无法很好地读取 URL,建议将以上 txt 文档下载到本地项目目录中,然后在 prompt 中引用本地文件路径。 ## 示例 Prompt [​](#示例-prompt) 以下是一个完整的示例,用于创建一个读取机器人状态的 Python 程序: ``` 阅读以下文档,写一个Python程序,用于读取机器人的当前位置、坐标系编号、伺服状态等信息。 参考资料: SDK文档:https://dev.svfactory.com/docs/sdk/knowledge/docs.txt ``` 如果使用本地文档,可以修改为: ``` 阅读以下文档,写一个Python程序,用于读取机器人的当前位置、坐标系编号、伺服状态等信息。 参考资料: SDK文档:./docs/sdk_docs.txt ``` ## 使用技巧 [​](#使用技巧) 1. **明确需求**:清晰描述要实现的功能 2. **提供上下文**:引用相关文档和示例 3. **分步实现**:复杂功能可以分步骤让 AI 生成 ## 注意事项 [​](#注意事项) 1. AI 生成的代码需要经过验证和测试 2. 确保代码符合项目编码规范 3. 涉及机器人控制的代码必须进行安全审查 --- url: /zh/1-python/0-prologue/ title: 序章 --- # 序章 [​](#序章) --- url: /zh/1-python/1-intro/ title: 1 简介与部署 --- # 1 简介与部署 [​](#1) --- url: /zh/1-python/4-methods/ title: 4 方法与示例 --- # 4 方法与示例 [​](#4) --- url: /zh/1-python/ title: Python SDK --- # Python SDK [​](#python-sdk) --- url: /zh/2-csharp/0-prologue/ title: 序章 --- # 序章 [​](#序章) --- url: /zh/2-csharp/1-intro/ title: 1 简介与部署 --- # 1 简介与部署 [​](#1) --- url: /zh/2-csharp/4-methods/ title: 4 方法与示例 --- # 4 方法与示例 [​](#4) --- url: /zh/2-csharp/ title: C# SDK --- # C# SDK [​](#c-sdk) --- url: /zh/3-help/ title: 帮助 --- # 帮助 [​](#帮助) --- url: /zh/ title: Agilebot Robot SDK --- # Agilebot Robot SDK捷勃特机器人 SDK [![](/docs/sdk/images/python.svg)Python SDK基于 Python 的高性能机器人控制开发套件,提供简洁优雅的 API 设计,助力快速构建智能机器人应用。了解更多 ](./1-python/0-prologue/0.1-version.html) [![](/docs/sdk/images/csharp.svg)C# SDK面向 .NET 生态的企业级机器人控制解决方案,提供类型安全的强类型 API,轻松集成至工业自动化系统。了解更多 ](./2-csharp/0-prologue/0.1-version.html)