OpenClawPi agx-arm-codegen
引导 OpenClaw 根据用户自然语言生成基于 pyAgxArm 的机械臂控制代码。当用户用提示词描述机械臂动作且现有脚本无法直接满足时,根据本技能提供的 API 与示例自动组织并生成可执行的 Python 脚本。
install
source · Clone the upstream repo
git clone https://github.com/vanstrong12138/OpenClawPi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/vanstrong12138/OpenClawPi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/agx-arm-codegen" ~/.claude/skills/vanstrong12138-openclawpi-agx-arm-codegen && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/vanstrong12138/OpenClawPi "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/agx-arm-codegen" ~/.openclaw/skills/vanstrong12138-openclawpi-agx-arm-codegen && rm -rf "$T"
manifest:
skills/agx-arm-codegen/SKILL.mdsource content
功能概览
- 本技能用于根据用户自然语言描述,引导 OpenClaw 生成可执行的 pyAgxArm 控制代码(Python 脚本),而不是仅调用现成 CLI。
- 参考 SDK:pyAgxArm(GitHub);参考示例:
。pyAgxArm/demos/nero/test1.py
何时使用本技能
- 用户说「写一段代码控制机械臂」「根据我的描述生成控制脚本」「让机械臂按顺序做多个动作」等。
- 用户明确要求「生成 Python 代码」或「给我可运行的脚本」来控制 Nero/Piper 等 AgileX 机械臂。
使用本技能生成代码
- 根据用户提示词,结合本技能的
中的 API 与模板,生成一段完整、可运行的 Python 脚本。references/pyagxarm-api.md - 生成后说明:脚本需在已安装 pyAgxArm 和 python-can 的环境中运行,且需 CAN 已激活、机械臂上电;提醒用户注意安全(工作区域无人、可先小幅度测试)。
生成代码时的规则
-
连接与配置
- 使用
创建配置(Nero 示例;Piper 可用create_agx_arm_config(robot="nero", comm="can", channel="can0", interface="socketcan")
/robot="piper"
/robot="piper_h"
/robot="piper_l"
)。robot="piper_x" - 使用
创建机械臂实例,再AgxArmFactory.create_arm(robot_cfg)
建立连接。robot.connect()
- 使用
-
使能与运动前
- CRITICAL: The robot MUST BE ENABLED before switching modes. If the robot is in a disabled state, you cannot switch modes.
- 运动前需切换为普通模式,让后使能:
,然后轮询robot.set_normal_mode()
直到成功;可设robot.enable()
。robot.set_speed_percent(100) - 运动模式:每当需要使用move_时或需要切换为模式时候,需要显式的设置
(关节)、robot.set_motion_mode(robot.MOTION_MODE.J)
(点到点)、P
(直线)、L
(圆弧)、C
(关节快速响应,慎用)。JS - 备注(与旧规则兼容):SDK 通常在调用
时会自动切换到对应运动模式;若你已按旧规则显式调用move_*
,保持即可。robot.set_motion_mode(...)
-
运动接口与单位
- 关节运动:
,单位为弧度,Nero 为 7 关节。robot.move_j([j1, j2, ..., j7]) - 若用户目标是
(六轴),则piper/piper_h/piper_l/piper_x
/robot.move_j
的关节数组长度应为 6(单位仍为弧度)。robot.move_js - 笛卡尔:
/robot.move_p(pose)
,pose 为robot.move_l(pose)
,位置单位米,姿态弧度。[x, y, z, roll, pitch, yaw] - 圆弧:
,每个 pose 为 6 个浮点数。robot.move_c(start_pose, mid_pose, end_pose) - CRITICAL: All movement commands (move_j, move_js, move_mit, move_c, move_l, move_p) must be used in normal mode
- 运动完成后应轮询
或封装robot.get_arm_status().msg.motion_status == 0
再执行下一步。wait_motion_done(robot, timeout=...)
- 关节运动:
-
模式切换
- Switching modes (master, slave, normal) requires 1s delay before and after the mode switch
- Use
to set normal moderobot.set_normal_mode() - Use
to set master moderobot.set_master_mode() - Use
to set slave moderobot.set_slave_mode() - CRITICAL: Enable the robot FIRST with
BEFORE switching modesrobot.enable()
-
安全与结尾
- 在生成脚本中可注明:执行前确认工作区域安全;首次建议小幅度移动;紧急时使用物理急停或
/robot.electronic_emergency_stop()
。robot.disable() - 若用户要求「完成后失能」,在脚本末尾调用
。robot.disable()
- 在生成脚本中可注明:执行前确认工作区域安全;首次建议小幅度移动;紧急时使用物理急停或
-
实现细节
- When waiting for motion to complete, use shorter timeout (2-3 seconds)
- After each mechanical arm operation, add a small sleep (0.01 seconds)
- Motion completion detection:
(not == 1)robot.get_arm_status().msg.motion_status == 0
-
针对 Piper 六轴机械臂(
)piper/piper_h/piper_l/piper_x- 关节向量:
/move_j([j1..j6])
;若 joints 数不对,必须先用move_js([j1..j6])
校验并修正。robot.joint_nums - 使能/失能(可选):若用户指定“只使能某一关节”,则
只允许joint_index
;不指定时直接用1..6
/robot.enable()
(通常=255=全部)。robot.disable() - 回零:优先用通用写法
;Piper 机型则等价为长度 6 的robot.move_j([0] * robot.joint_nums)
。[0]*6
- 关节向量:
-
针对 Nero 七轴机械臂(
)nero- 关节向量:
/move_j([j1..j7])
;必须严格使用长度 7,且“关节1..7”按顺序映射到move_js([j1..j7])
。j1..j7
:除非用户明确要求“快速响应/跟随/JS 控制”,否则默认使用move_js
;并在脚本注释中标注move_j
风险(冲击/振荡/失稳、无平滑)。move_js- 若用户只给出部分关节目标:建议获取当前关节角
,未指定的关节保持当前值,避免其它关节发生突变回跳。robot.get_joint_angles().msg
- 关节向量:
-
读取机械臂参数(可选,推荐用于调试/自检)
- 读取接口优先级:
(motion_status/异常)→robot.get_arm_status()
→robot.get_joint_angles()
。robot.get_flange_pose()
用于处理 6/7 轴差异,电机/驱动器/使能列表建议用robot.joint_nums
循环,并传入 1-based 的for i in range(1, robot.joint_nums + 1)
。joint_index- 可选扩展读取:
/robot.is_ok()
:数据接收监控。robot.get_fps()
或robot.get_joints_enable_status_list()
:关节使能状态。robot.get_joint_enable_status(i)
/robot.get_motor_states(i)
:电机/驱动反馈(单关节)。robot.get_driver_states(i)
:TCP 位姿(若你之前调用过robot.get_tcp_pose()
)。robot.set_tcp_offset(...)
- 读取接口优先级:
参考文件
- API 与最小可运行模板:
references/pyagxarm-api.md
生成代码时请结合该文件中的接口说明与代码片段,保证与 pyAgxArm 及 test1.py 用法一致。
安全注意事项
- 生成的代码会驱动真实机械臂,必须提醒用户:执行前确认工作区域内无人员和障碍物;建议先小幅度、低速度测试。
- 高风险模式(如
、move_js
)应在代码注释或对用户说明中标注风险,并建议仅在了解后果后使用。move_mit - 本技能只负责「引导生成代码」,不直接执行运动;实际运行环境、CAN 激活、pyAgxArm 安装由用户自行准备(可参考 agx-arm 技能中的环境准备)。