下载
# 稳定版(推荐)
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]}")