📦 Universal Robots — 机器人仿真控制

v1.0.1

一站式控制Universal Robots机械臂:Docker内URSim仿真、URScript指令下发、RTDE实时数据通信,支持关节与笛卡尔空间运动,可在虚拟或真实硬件上快速验证轨迹与IO逻辑。

0· 71·0 当前·0 累计
qujingyang28 头像by @qujingyang28 (Robot_Qu)
下载技能包
最后更新
2026/4/2
0
安全扫描
VirusTotal
无害
查看报告
OpenClaw
安全
medium confidence
该包功能与描述一致(URSim+URScript+RTDE控制);文件、文档与运行指令连贯,但存在运行时pip安装、网络/真机动作、缺失上游主页等操作风险,需在真机运行前知晓。
评估建议
本技能包及其文档与UR机器人控制SDK及仿真工作流一致。安装或运行前: - 视其为会打开机器人IP网络套接字并可发送运动命令的软件——除非有认证操作员在场、急停可用且低速运行,否则勿对真机执行“真实”测试脚本。遵循内置safety_check.py及SKILL.md真机警告。 - 审查并控制依赖安装时机:部分辅助脚本会在运行时执行pip install。建议手动在隔离环境(virtualenv/容器)中安装依赖,以控制网络与包源。 - 先用URSim(Docker)测试,最好在隔离VM或网络命名空间内,避免意外扫描/命令影响其他设备。引用的Docker镜像(universalrobots/ursim_e-series)为官方上游镜像——仅从官方仓库拉取。 - 清单中无发布主页或仓库URL,所有者ID为不透明字符串,降低可追溯性。若需更高保障,请向发布者索取源码仓库或签名制品。 - 若要在真机运行,请审计拟执行的测试脚本(含运动序列与IO切换)并在real_robot_config.json中确认安全限位(工作空间、速度、急停)。 如需,我可:(a)指出代码中所有创建网络套接...
详细分析 ▾
用途与能力
名称/描述与所含文件及指令一致:Python SDK、RTDE/URScript示例、URSim Docker指引与测试脚本。所需能力(对机器人IP的网络套接字、Docker镜像universalrobots/ursim_e-series、ur_rtde Python包)符合预期。
指令范围
SKILL.md及脚本明确指示代理/用户运行Docker、打开机器人IP套接字(localhost/192.168.x.x)、编辑real_robot_config.json并运行大量发送URScript/RTDE消息的测试脚本。此为预期行为,但意味着技能将在LAN上打开网络连接并可能移动机器人——若无安全检查及认证监督,切勿对真机运行“真实”测试。
安装机制
无正式安装规范,但部分脚本(如check_ur_rtde.py)会在运行时通过pip安装依赖(subprocess.check_call调用pip)。即使pip目标(ur_rtde)合法,运行时才网络拉取并安装包仍属中等风险。
凭证需求
技能未请求环境变量、凭证或除自身real_robot_config.json外的配置路径,与机器人控制库相称。未出现意外的密钥或跨服务凭证请求。
持久化与权限
技能元数据未请求always:true,不修改其他技能。所含脚本可能写入test_reports并更新技能目录下的本地文件(属预期行为)。允许自主模型调用(平台默认),但未与其他风险标记组合。
安全有层次,运行前请审查代码。

运行时依赖

无特殊依赖

版本

latestv1.0.12026/4/2

- 初始发布版本 1.0.1。 - 与上一版本相比未检测到文件变更。 - 技能功能、用法与文档与 v1.0.0 保持一致。

无害

安装命令

点击复制
官方npx clawhub@latest install ur-robot
镜像加速npx clawhub@latest install ur-robot --registry https://cn.longxiaskill.com

技能文档

技能版本: v1.0.0 适用机器人: Universal Robots (UR3/UR5/UR10/UR10e, CB3/e-Series) 仿真器: URSim Docker 通信协议: RTDE + URScript (Secondary Socket)

---

💡 Windows 用户须知

为符合 ClawHub 平台要求,已移除 2 个 PowerShell 脚本 (.ps1)

| 移除的脚本 | 替代方案 | 位置 | |-----------|----------|------| | fix-and-test.ps1 | Python 测试脚本 | test_.py | | setup-docker-d-drive.ps1 | 手动配置 Docker | 见 WINDOWS_SCRIPTS_NOTE.md |

核心功能不受影响 - 所有 Python 脚本和文档保留 ✅ 详细说明:WINDOWS_SCRIPTS_NOTE.md

---

⚠️ 重要安全声明

🧪 测试状态

| 项目 | 状态 | 说明 | |------|------|------| | URSim 仿真 | ✅ 已验证 | 所有功能在 URSim e-Series 中测试通过 | | 真机验证 | ❌ 未验证 | 尚未在真实机器人上测试 |

⚠️ 真机使用警告

本技能包仅在 URSim 仿真器中完成测试,未在真实机器人上验证! 在真机使用前必须:
  • 重新验证所有命令 - 仿真与真机可能存在差异
  • 低速测试 - 首次运行使用最低速度 (v=0.1)
  • 安全检查 - 确认急停按钮、工作范围、碰撞检测
  • 专业人员监督 - 必须由持证机器人操作员监督
  • 风险评估 - 进行全面的风险评估和安全分析

因直接使用本技能包于真机导致的任何损失,作者不承担责任!

---

📋 功能概览

| 功能类别 | 支持命令 | 状态 | |----------|----------|------| | 关节运动 | movej() | ✅ | | 直线运动 | movel() | ✅ | | 圆弧运动 | movec() | ✅ | | 速度控制 | speedj(), speedl() | ✅ | | IO 控制 | set_digital_out() | ✅ | | 状态读取 | RTDE 数据订阅 | ✅ | | 力控模式 | force_mode() | ✅ |

---

🔄 仿真 → 真机迁移指南

配置修改

``python # 仿真配置 (当前默认) ROBOT_HOST = "localhost" # 真机配置 (需要修改) ROBOT_HOST = "192.168.1.100" # 机器人实际 IP `

安全参数调整

| 参数 | 仿真值 | 真机建议值 | |------|--------|------------| | 速度 (v) | 0.5 m/s | 0.1-0.3 m/s | | 加速度 (a) | 0.2 m/s² | 0.1-0.2 m/s² | | 工作范围检查 | 不需要 | 必须 | | 急停确认 | 不需要 | 必须 |

真机使用流程

`bash # 1. 网络连接确认 ping 192.168.1.100 # 2. 修改配置文件 # 编辑 robot_config.json 设置真机 IP # 3. 低速测试 python skills/ur-robot/examples/real_robot_test.py # 4. 确认安全后正式运行 `

推荐添加的安全检查

`python # 真机专用安全检查脚本 def safety_check_before_move(): """真机运动前安全检查""" # 1. 确认机器人状态 # 2. 确认工作范围 # 3. 确认急停按钮可用 # 4. 确认人员安全距离 # 5. 人工确认签字 pass `

---

🚀 快速开始

1. 启动 URSim 仿真器

`bash docker run -d --name ursim \ -p 6080:6080 -p 5900:5900 \ -p 30001:30001 -p 30002:30002 \ -p 30003:30003 -p 30004:30004 \ universalrobots/ursim_e-series `

2. 访问 URSim Web 界面

` http://localhost:6080/vnc.html `

3. 初始化机器人

  • 点击 ON 按钮(启动电源)
  • 点击 START 按钮(启动程序)
  • 点击 ProgramEmpty Program
  • 点击 Play (▶) 按钮

4. 运行测试脚本

`bash # 关节运动测试 python skills/ur-robot/test_motion_simple.py # RTDE 数据读取 python skills/ur-robot/test_rtde_official.py # 连续运动测试 python skills/ur-robot/test_continuous_motion.py `

---

📚 URScript 命令参考

运动控制

movej() - 关节空间运动

`python # 语法 movej(q, a=1.4, v=1.05, t=0, r=0) # 参数 # q - 关节角度 [J1, J2, J3, J4, J5, J6] (弧度) # a - 关节加速度 (rad/s²) # v - 关节速度 (rad/s) # t - 时间 (s),为 0 表示不限制 # r - blends 半径 (m)

# 示例:移动到 Home 位置 movej([0, -1.57, 1.57, -1.57, -1.57, 0], a=0.5, v=0.5) # 示例:J1 旋转 30 度 movej([0.52, 0, 0, 0, 0, 0], a=0.3, v=0.3) `

movel() - 笛卡尔空间直线运动

`python # 语法 movel(pose, a=1.2, v=0.25, t=0, r=0) # 参数 # pose - TCP 位姿 [x, y, z, rx, ry, rz] (米和弧度) # a - 笛卡尔加速度 (m/s²) # v - 笛卡尔速度 (m/s)

# 示例:直线移动到目标位置 movel([0.3, 0.3, 0.5, 3.14, 0, 0], a=0.2, v=0.2) # 示例:相对当前位置移动 (+200mm X 轴) movel(pose_trans(get_actual_tcp_pose(), p[0.2, 0, 0, 0, 0, 0]), a=0.2, v=0.2) `

movec() - 圆弧运动

`python # 语法 movec(pose_via, pose_to, a=1.2, v=0.25, t=0, r=0) # 参数 # pose_via - 圆弧经过的中间点 # pose_to - 圆弧终点

# 示例:画圆弧 movec(p[0.5, 0, 0.3, 0, 3.14, 0], p[0.6, 0, 0.2, 0, 3.14, 0], a=0.2, v=0.2) `

speedj() - 关节速度控制

`python # 语法 speedj(qd, a=1.4, t=0) # 参数 # qd - 关节速度 [J1, J2, J3, J4, J5, J6] (rad/s) # a - 关节加速度 (rad/s²) # t - 持续时间 (s),为 0 表示持续运行

# 示例:J1 轴以 0.5 rad/s 旋转 3 秒 speedj([0.5, 0, 0, 0, 0, 0], a=0.5, t=3) # 示例:停止关节运动 stopj(a=0.5) `

speedl() - 笛卡尔速度控制

`python # 语法 speedl(xd, a=1.2, t=0) # 参数 # xd - TCP 速度 [xd, yd, zd, rxd, ryd, rzd] (m/s, rad/s)

# 示例:TCP 沿 X 轴以 0.1 m/s 移动 2 秒 speedl([0.1, 0, 0, 0, 0, 0], a=0.2, t=2) `

---

IO 控制

set_digital_out() - 设置数字输出

`python # 语法 set_digital_out(pin, state) # 参数 # pin - 引脚编号 (0-7 基础 IO, 8-15 工具 IO) # state - True (高电平) / False (低电平)

# 示例:设置数字输出 0 为高电平 set_digital_out(0, True) # 示例:关闭数字输出 0 set_digital_out(0, False) # 示例:控制工具端数字输出 set_tool_digital_out(0, True) `

get_digital_in() - 读取数字输入

`python # 语法 state = get_digital_in(pin)

# 示例:读取数字输入 0 input_state = get_digital_in(0) `

---

力控模式

force_mode() - 力控制

`python # 语法 force_mode(task_frame, selection_vector, wrench, type, limits) # 参数 # task_frame - 任务坐标系 [x, y, z, rx, ry, rz] # selection_vector - 选择向量 [x, y, z, rx, ry, rz] (1=力控,0=位置控) # wrench - 目标力/力矩 [Fx, Fy, Fz, Mx, My, Mz] (N, Nm) # type - 控制类型 (2=恒力模式) # limits - 速度/加速度限制

# 示例:Z 轴向下 5N 恒力 force_mode(p[0,0,0,0,0,0], [0,0,1,0,0,0], [0,0,-5,0,0,0], 2, [0.1,0.1,0.1,0.1,0.1,0.1]) # 退出力控模式 end_force_mode() `

---

状态读取

通过 RTDE 读取

`python import rtde.rtde as rtde

# 连接 con = rtde.RTDE("localhost", 30004) con.connect()

# 设置输出 con.send_output_setup(["actual_q", "actual_TCP_pose"], frequency=10)

# 开始同步 con.send_start()

# 读取数据 data = con.receive() print("关节角度:", data.actual_q) print("TCP 位姿:", data.actual_TCP_pose)

# 暂停/断开 con.send_pause() con.disconnect() `

通过 URScript 读取

`python # 获取当前 TCP 位姿 pose = get_actual_tcp_pose()

# 获取当前关节角度 angles = get_actual_q()

# 获取关节速度 speeds = get_speed_q()

# 获取关节电流 currents = get_current()

# 获取 TCP 受力 forces = get_tcp_force() `

---

🛠️ Python 工具函数

发送 URScript 命令

`python import socket

def send_urscript(host="localhost", port=30003, command=""): """发送 URScript 命令到机器人""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5.0) try: sock.connect((host, port)) full_command = command + "\n" sock.sendall(full_command.encode('utf-8')) time.sleep(0.1) response = sock.recv(1024).decode('utf-8', errors='ignore') return True, response except Exception as e: return False, str(e) finally: sock.close()

# 使用示例 success, response = send_urscript(command="movej([0, -1.57, 1.57, -1.57, -1.57, 0], a=0.5, v=0.5)") `

关节运动封装

`python def move_to_home(): """移动到 Home 位置""" send_urscript("movej([0, -1.57, 1.57, -1.57, -1.57, 0], a=0.5, v=0.5)")

def move_joints(j1, j2, j3, j4, j5, j6, a=0.5, v=0.5): """关节空间运动""" cmd = "movej([{}, {}, {}, {}, {}, {}], a={}, v={})".format( j1, j2, j3, j4, j5, j6, a, v ) send_urscript(cmd)

def move_linear(x, y, z, rx, ry, rz, a=0.2, v=0.2): """笛卡尔空间直线运动""" cmd = "movel([{}, {}, {}, {}, {}, {}], a={}, v={})".format( x, y, z, rx, ry, rz, a, v ) send_urscript(cmd) `

---

📊 端口说明

| 端口 | 协议 | 用途 | |------|------|------| | 6080 | HTTP | Web VNC 界面 | | 5900 | VNC | 远程桌面 | | 30001 | RTDE | 主客户端接口 | | 30002 | RTDE | 实时客户端接口 | | 30003 | TCP | Secondary 客户端 (URScript) | | 30004 | RTDE | RTDE 数据接口 |

---

⚠️ 注意事项

安全

  • 测试前确保在仿真环境 - 真机操作需要额外的安全措施
  • 运动范围限制 - 确保目标位置在机器人工作范围内
  • 速度设置 - 测试时使用较低速度 (v=0.2-0.5)
  • 急停准备 - 随时准备点击 URSim 的停止按钮

URSim 使用

  • 程序模式 - 必须点击 Play 按钮启动程序
  • 外部命令 - 通过 30003 端口发送 URScript
  • 程序停止 - 每次命令执行后程序可能停止,需要重新启动
  • 持续运行程序 - 创建 endless + wait(0.1) 循环程序可避免频繁重启

常见问题

| 问题 | 原因 | 解决方法 | |------|------|----------| | 机器人不动 | 程序未运行 | 点击 Play 按钮 | | 连接失败 | 端口未映射 | 检查 Docker 端口配置 | | 命令不执行 | 保护状态 | 重置安全状态 | | 运动异常 | 奇异点 | 避开奇异点位置 |

---

📁 文件结构

` skills/ur-robot/ ├── SKILL.md # 技能文档 (本文件) ├── README.md # 快速入门 ├── URSIM_TEST_GUIDE.md # URSim 测试指南 ├── URSCRIPT_FEATURES.md # URScript 功能清单 ├── test_motion_simple.py # 简单运动测试 ├── test_rtde_official.py # RTDE 数据读取测试 ├── test_continuous_motion.py # 连续运动测试 ├── test_ur_real.py # 真机测试 (待开发) ├── ur_robot.py # Python 封装库 └── examples/ ├── basic_move.py # 基础运动示例 └── io_control.py # IO 控制示例 `

---

🔗 相关资源

  • UR 官方文档: https://www.universal-robots.com/articles/ur/programming/
  • URScript 手册: https://sdurobotics.gitlab.io/ur_rtde/
  • RTDE 库: https://github.com/UniversalRobots/RTDE_Python_Client_Library
  • URSim 下载: https://www.universal-robots.com/download/

---

📝 更新日志

v1.0.0 (2026-04-02)

  • ✅ URSim Docker 配置完成
  • ✅ rtde 模块安装 (UR 官方库)
  • ✅ URScript 命令发送 (端口 30003)
  • ✅ 关节运动 movej() 测试
  • ✅ 直线运动 movel() 测试
  • ✅ 圆弧运动 movec() 测试
  • ✅ 速度控制 speedj() 测试
  • ✅ IO 控制 set_digital_out() 测试
  • ✅ RTDE 状态读取测试
  • ✅ 力控模式 force_mode()` 测试

--- Created: 2026-04-02 Author: 小橙 (Little Orange) 🍊*

数据来源ClawHub ↗ · 中文优化:龙虾技能库