news 2026/6/10 14:33:20

ur_rtde连接机器人及其调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ur_rtde连接机器人及其调用

下载

# 稳定版(推荐) pip install ur-rtde # 开发版(包含最新功能,可能存在兼容性问题) pip install git+https://github.com/UniversalRobots/RTDE_Python_Client.git

例如:

rtde_c = rtde_control.RTDEControlInterface("192.168.1.102") rtde_r = rtde_receive.RTDEReceiveInterface("192.168.1.102")

那么:

测试

import rtde_control import rtde_receive import time # 1. 定义机器人 IP 地址 ROBOT_IP = "192.168.1.102" try: # 2. 初始化控制接口(发送指令) rtde_c = rtde_control.RTDEControlInterface(ROBOT_IP) # 3. 初始化接收接口(读取状态) rtde_r = rtde_receive.RTDEReceiveInterface(ROBOT_IP) print("✅ 机器人连接成功!") except Exception as e: print(f"❌ 机器人连接失败:{e}") exit(1)
# 读取当前关节角度(单位:弧度) joint_angles = rtde_r.getActualQ() print("当前关节角度:", joint_angles) # 读取当前工具位姿(x,y,z,rx,ry,rz,单位:m/弧度) tool_pose = rtde_r.getActualTCPPose() print("当前工具位姿:", tool_pose) # 读取当前工具末端速度(m/s) tool_velocity = rtde_r.getActualTCPSpeed() print("当前工具速度:", tool_velocity) # 读取数字输入信号(例如读取第 0 路数字输入) digital_in_0 = rtde_r.getDigitalInput(0) print("第 0 路数字输入状态:", digital_in_0) # 读取机器人运行模式(0=手动,1=自动,2=远程自动) robot_mode = rtde_r.getRobotMode() print("机器人运行模式:", robot_mode)
import rtde_control import rtde_receive import time # 机器人 IP 配置 ROBOT_IP = "192.168.1.100" def main(): # 初始化接口 try: rtde_c = rtde_control.RTDEControlInterface(ROBOT_IP) rtde_r = rtde_receive.RTDEReceiveInterface(ROBOT_IP) print("✅ 机器人连接成功!") except Exception as e: print(f"❌ 连接失败:{e}") return try: # 1. 读取初始状态 print("\n=== 初始状态 ===") print("初始关节角度:", rtde_r.getActualQ()) print("初始工具位姿:", rtde_r.getActualTCPPose()) # 2. 关节运动 print("\n=== 执行关节运动 ===") target_joints = [0, -1.57, 1.57, 0, 1.57, 0] rtde_c.moveJ(target_joints, 0.5, 0.5, False) print("关节运动完成,当前关节角度:", rtde_r.getActualQ()) time.sleep(1) # 3. 笛卡尔运动 print("\n=== 执行笛卡尔运动 ===") target_pose = [0.5, 0.0, 0.3, 0, 3.14, 0] rtde_c.moveL(target_pose, 0.2, 0.2, False) print("笛卡尔运动完成,当前工具位姿:", rtde_r.getActualTCPPose()) time.sleep(1) # 4. IO 控制 print("\n=== 执行 IO 控制 ===") rtde_c.setDigitalOutput(0, True) print("第 0 路数字输出已置高") time.sleep(1) rtde_c.setDigitalOutput(0, False) print("第 0 路数字输出已置低") time.sleep(1) except Exception as e: print(f"❌ 执行失败:{e}") finally: # 平滑停止并断开连接 rtde_c.servoStop() rtde_c.disconnect() rtde_r.disconnect() print("\n🔌 机器人连接已断开") if __name__ == "__main__": main()

拖动获取位姿和接触力:

import rtde_control import rtde_receive import time import sys # 配置机器人 IP 地址 ROBOT_IP = "192.168.1.100" # 替换为你的机器人实际 IP def main(): # 初始化 RTDE 控制接口和接收接口 try: rtde_c = rtde_control.RTDEControlInterface(ROBOT_IP) rtde_r = rtde_receive.RTDEReceiveInterface(ROBOT_IP) print("✅ 机器人连接成功!") except Exception as e: print(f"❌ 机器人连接失败:{e}") sys.exit(1) try: # 1. 开启自由拖动(示教)模式 rtde_c.teachMode() print("📢 自由拖动模式已开启!") print("提示:可手动拖动机器人末端,按 Ctrl+C 退出拖动模式") print("-" * 80) # 2. 循环实时获取位姿与接触力 while True: # 获取工具末端当前位姿(x,y,z,rx,ry,rz:单位 m/弧度) current_pose = rtde_r.getActualTCPPose() # 获取工具末端 6 维力/力矩(x,y,z 力:N;rx,ry,rz 力矩:Nm) current_force_torque = rtde_r.getActualTCPForce() # 打印数据(格式化输出,便于查看) print(f"【当前位姿】") print(f" x: {current_pose[0]:.4f} m, y: {current_pose[1]:.4f} m, z: {current_pose[2]:.4f} m") print(f" rx: {current_pose[3]:.4f} rad, ry: {current_pose[4]:.4f} rad, rz: {current_pose[5]:.4f} rad") print(f"【接触力/力矩】") print(f" Fx: {current_force_torque[0]:.2f} N, Fy: {current_force_torque[1]:.2f} N, Fz: {current_force_torque[2]:.2f} N") print(f" Tx: {current_force_torque[3]:.2f} Nm, Ty: {current_force_torque[4]:.2f} Nm, Tz: {current_force_torque[5]:.2f} Nm") print("-" * 80) # 延时 0.1 秒,避免数据打印过快(可根据需求调整) time.sleep(0.1) except KeyboardInterrupt: # 捕获 Ctrl+C 中断信号,优雅退出 print("\n📢 检测到退出指令,正在停止自由拖动模式...") except Exception as e: print(f"\n❌ 程序执行异常:{e}") finally: # 3. 停止自由拖动模式 rtde_c.endTeachMode() # 4. 断开连接,释放资源 rtde_c.disconnect() rtde_r.disconnect() print("✅ 自由拖动模式已停止,机器人连接已断开") if __name__ == "__main__": main()

笛卡尔空间速度模式下的机器人运动

# 导入必要的库 import rtde_control import rtde_receive import time import sys # ===================== 核心参数配置(新手只需改这里)===================== ROBOT_IP = "192.168.1.100" # 你的机器人IP地址 TOTAL_MOTION_TIME = 5.0 # 总运动时间(秒),比如5秒 # 笛卡尔速度指令:[x,y,z,rx,ry,rz],单位:m/s(平移)/rad/s(旋转) # 示例:沿x轴正向以0.1m/s运动,其他轴不动 CARTESIAN_VELOCITY = [0.1, 0.0, 0.0, 0.0, 0.0, 0.0] CONTROL_FREQUENCY = 100 # 控制频率(固定100Hz即可,新手无需修改) CYCLE_TIME = 1 / CONTROL_FREQUENCY # 单次循环时间(自动计算) # ===================== 第一步:连接机器人 ===================== print("正在连接机器人...") # 初始化控制接口(发送运动指令)和接收接口(读取状态) rtde_c = None rtde_r = None try: rtde_c = rtde_control.RTDEControlInterface(ROBOT_IP, CYCLE_TIME) rtde_r = rtde_receive.RTDEReceiveInterface(ROBOT_IP) print("✅ 机器人连接成功!") except Exception as e: print(f"❌ 连接失败:{e},请检查IP和网络") sys.exit(1) # 连接失败直接退出程序 # ===================== 第二步:初始化计时和运动参数 ===================== start_time = time.perf_counter() # 记录运动开始时间(高精度计时) elapsed_time = 0 # 已运动时间 # 伺服控制参数(新手固定即可,不用修改) LOOKAHEAD_TIME = 0.05 GAIN = 300 MAX_LINEAR_SPEED = 0.2 MAX_ANGULAR_SPEED = 0.5 print(f"即将开始运动,总时长:{TOTAL_MOTION_TIME}秒") print("-" * 50) # ===================== 第三步:循环执行速度运动(核心逻辑)===================== try: while True: # 1. 计算已运动时间(定时器功能) elapsed_time = time.perf_counter() - start_time # 2. 判断是否达到总运动时间,达到则停止循环 if elapsed_time >= TOTAL_MOTION_TIME: break # 3. 计算目标位姿(速度 × 单次循环时间 = 位姿增量) current_pose = rtde_r.getActualTCPPose() # 获取当前工具位姿 pose_increment = [v * CYCLE_TIME for v in CARTESIAN_VELOCITY] # 计算位姿增量 target_pose = [current_pose[i] + pose_increment[i] for i in range(6)] # 目标位姿 # 4. 发送笛卡尔速度运动指令(核心) rtde_c.servoL( target_pose, # 目标位姿 MAX_LINEAR_SPEED, # 最大线速度 MAX_ANGULAR_SPEED, # 最大角速度 CYCLE_TIME, # 循环时间 LOOKAHEAD_TIME, # 前瞻时间 GAIN # 伺服增益 ) # 5. 简单打印状态(每0.5秒打印一次,避免刷屏) if int(elapsed_time * 2) % 1 == 0: print(f"⏱️ 已运动:{elapsed_time:.1f}s / {TOTAL_MOTION_TIME}s") print(f"📌 当前位姿:{[round(p, 4) for p in current_pose]}") print("-" * 50) # 6. 保证循环频率稳定 time.sleep(CYCLE_TIME) # ===================== 第四步:运动结束/异常处理 ===================== except KeyboardInterrupt: print("\n📢 你按下了Ctrl+C,停止运动") except Exception as e: print(f"\n❌ 运动出错:{e}") finally: # 无论正常结束还是异常,都要平滑停止并断开连接 if rtde_c is not None: rtde_c.servoStop() # 平滑停止机器人 rtde_c.disconnect() print("✅ 机器人已停止,控制接口已断开") if rtde_r is not None: rtde_r.disconnect() print("✅ 接收接口已断开") # ===================== 第五步:运动总结 ===================== final_pose = rtde_r.getActualTCPPose() if rtde_r else [] initial_pose = rtde_r.getActualTCPPose() if rtde_r else [] print("\n🛑 运动完全结束") print(f"📊 运动总结:") print(f" 实际总时长:{elapsed_time:.2f}秒") print(f" 初始位姿:{[round(p, 4) for p in initial_pose]}") print(f" 最终位姿:{[round(p, 4) for p in final_pose]}")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 14:33:06

高效、安全、可控——anything-llm为何适合企业部署?

高效、安全、可控——Anything-LLM为何适合企业部署? 在当今企业数字化转型的浪潮中,知识不再是沉睡在PDF和共享盘里的静态文件,而是驱动决策、提升效率的核心资产。然而,当大语言模型(LLM)开始进入企业环境…

作者头像 李华
网站建设 2026/6/10 11:02:21

本地运行大模型有多简单?试试这个anything-llm镜像

本地运行大模型有多简单?试试这个 anything-llm 镜像 在企业知识库越来越庞杂、员工查找制度文件像“大海捞针”的今天,一个能秒级回答“年假怎么休”“报销流程是什么”的AI助手,已经不再是科幻场景。更关键的是——很多人还在依赖公有云大模…

作者头像 李华
网站建设 2026/6/9 22:46:22

vivado2018.3安装步骤图解说明:直观展示每一步操作

vivado2018.3安装全攻略:从零开始,一次搞定开发环境部署 你是不是也经历过这样的场景? 刚下定决心学习FPGA,兴致勃勃地打开Xilinx官网准备安装Vivado,结果还没进主界面就卡在了第一步——安装器打不开;或…

作者头像 李华
网站建设 2026/6/4 6:41:52

24、XML数据处理:从复杂结构到高效应用

XML数据处理:从复杂结构到高效应用 1. 复杂结构的XML表示 XML具备在单个文件中表示层次结构的能力,相较于在FoxPro中使用单个表进行JOIN操作,它能更节省空间,且在方法学上更为优雅。 假设存在两个文件: - INVOICES.DBF : | 字段名 | 类型 | | — | — | | InvNu…

作者头像 李华
网站建设 2026/6/9 21:28:52

35、报表生成与管理全攻略

报表生成与管理全攻略 1. 互联网报表发布方式 在互联网上发布报表有多种方式,下面为大家详细介绍几种常见的方法及其特点。 - 使用 SET TEXTMERGE TO :这是一种简单的构建互联网报表页面的方式,相较于 REPORT FORM 和 SAVE AS HTML,它能让你对报表格式有更多的控制。不…

作者头像 李华
网站建设 2026/5/24 19:46:32

短视频矩阵号安全运营指南:浏览器指纹隔离与检测工具应用

今天跟大家聊一个干货话题:抖音矩阵账号的浏览器指纹隔离设置。很多朋友做多账号运营,尤其是抖音矩阵号运营,总是被一个问题困扰——同一台设备登录多个账号容易被平台识别,导致封号、降权。其实,这背后的关键就是浏览…

作者头像 李华