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]}")
相关推荐
科士威传动3 小时前
精密仪器中的微型导轨如何选对润滑脂?
大数据·运维·人工智能·科技·机器人·自动化
ZPC82104 小时前
PPO算法训练机器人时,如何定义状态/动作/奖励
人工智能·算法·机器人
八月瓜科技6 小时前
工业和信息化部国际经济技术合作中心第五党支部与八月瓜科技党支部开展主题党日活动暨联学联建活动
大数据·人工智能·科技·深度学习·机器人·娱乐
天使奇迹8 小时前
自变量机器人“翻车”罗生门 RoboChallenge辟谣,具身智能需要更多耐心
机器人
派葛穆8 小时前
机器人-六轴机械臂的逆运动学
算法·机器学习·机器人
RPA机器人就选八爪鱼10 小时前
RPA批量采集抖音评论高效攻略:精准获取用户反馈与市场洞察
大数据·人工智能·机器人·rpa
Robot侠10 小时前
ROS1从入门到精通 20:性能优化与最佳实践
图像处理·人工智能·计算机视觉·性能优化·机器人·ros
沫儿笙10 小时前
安川焊接机器人混合气节约方案
机器人
汽车仪器仪表相关领域10 小时前
ZRT-V 机器人减速器寿命测试系统:精准破解 “寿命焦虑” 的核心测试方案
人工智能·功能测试·机器学习·单元测试·机器人·可用性测试·安全性测试