2025-05-27 15:46:31 +08:00

262 lines
12 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
import os
# # 获取当前文件的绝对路径
# current_dir = os.path.dirname(os.path.abspath(__file__))
# # 获取项目根目录的绝对路径
# project_root = os.path.abspath(os.path.join(current_dir, os.pardir))
# sys.path.append(project_root)
import pyaubo_sdk
# from tools.Rate import Rate
from scipy.spatial.transform import Rotation as R
# from tools.log import CustomLogger
# from tools.yaml_operator import read_yaml
import threading
# from tools.bytes_transform import *
# from aubo_message import *
import socket
import numpy as np
import atexit
import time
import requests
import copy
# 定义机器人模式字典
robot_mode_types = {
-1: "NoController: 提供给示教器使用的, 如果aubo_control进程崩溃则会显示为NoController",
0: "Disconnected: 没有连接到机械臂本体(控制器与接口板断开连接或是 EtherCAT 等总线断开)",
1: "ConfirmSafety: 正在进行安全配置, 断电状态下进行",
2: "Booting: 机械臂本体正在上电初始化",
3: "PowerOff: 机械臂本体处于断电状态",
4: "PowerOn: 机械臂本体上电成功, 刹车暂未松开(抱死), 关节初始状态未获取",
5: "Idle: 机械臂上电成功, 刹车暂未松开(抱死), 电机不通电, 关节初始状态获取完成",
6: "BrakeReleasing: 机械臂上电成功, 刹车正在松开",
7: "BackDrive: 反向驱动:刹车松开, 电机不通电",
8: "Running: 机械臂刹车松开, 运行模式, 控制权由硬件移交给软件",
9: "Maintaince: 维护模式: 包括固件升级、参数写入等",
10: "Error: ",
11: "PowerOffing: 机械臂本体处于断电过程中"
}
# 定义安全模式字典
safety_mode_types = {
0: "Undefined: 安全状态待定",
1: "Normal: 正常运行模式",
2: "ReducedMode: 缩减运行模式",
3: "Recovery: 启动时如果在安全限制之外, 机器人将进入recovery模式",
4: "Violation: 超出安全限制(根据安全配置, 例如速度超限等)",
5: "ProtectiveStop: 软件触发的停机(保持轨迹, 不抱闸, 不断电)",
6: "SafeguardStop: IO触发的防护停机不保持轨迹, 抱闸, 不断电)",
7: "SystemEmergencyStop: 系统急停:急停信号由外部输入(可配置输入), 不对外输出急停信号",
8: "RobotEmergencyStop: 机器人急停:控制柜急停输入或者示教器急停按键触发, 对外输出急停信号",
9: "Fault: 机械臂硬件故障或者系统故障"
}
class AuboC5():
def __init__(self, arm_ip = "192.168.100.20", arm_port = 30004):
self.arm_ip = arm_ip
self.arm_port = arm_port
# self.logger = CustomLogger('aubo_C5',True)
self.robot_rpc_client = pyaubo_sdk.RpcClient()
self.robot_rpc_client.setRequestTimeout(1000) # 接口调用: 设置 RPC 超时
self.robot_rpc_client.connect(self.arm_ip, self.arm_port) # 连接 RPC 服务
if self.robot_rpc_client.hasConnected():
print("Robot rpc_client connected successfully!")
self.robot_rpc_client.login("aubo", "123456") # 登录机械臂
if self.robot_rpc_client.hasLogined():
print("Robot rpc_client logged in successfully!")
self.robot_name = self.robot_rpc_client.getRobotNames()[0] # 接口调用: 获取机器人的名字
self.robot = self.robot_rpc_client.getRobotInterface(self.robot_name)
self.robot_config = self.robot.getRobotConfig()
# 获取状态
robot_mode_type, safety_mode_type = self.getModelType()
if safety_mode_type == 8:
requests.post(
"http://127.0.0.1:5000/on_message", data={"message": "机械臂处于锁定状态<br>请解除锁定后再使用"}
)
instruction = {
"is_massaging": False,
"massage_service_started": False
}
requests.post(
"http://127.0.0.1:5000/update_massage_status", data=instruction
)
sys.exit(0)
if safety_mode_type == 5:
self.robot.getRobotManage().setUnlockProtectiveStop() # 接口调用: 解除保护停止
if safety_mode_type in [3,4]:
self.power_off()
time.sleep(1)
if safety_mode_type == 9:
self.robot.getRobotManage().restartInterfaceBoard()
# 启动
self.start_up()
# 接口调用: 设置工具中心点TCP相对于法兰盘中心的偏移
tcp_offset = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
self.robot_config.setTcpOffset(tcp_offset)
self.mc = self.robot.getMotionControl()
# 接口调用: 设置机械臂的速度比率
self.mc.setSpeedFraction(1)
self.robot_name = self.robot_rpc_client.getRobotNames()[0]
self.robot_rpc_client.getRuntimeMachine().stop()
self.robot_rpc_client.getRuntimeMachine().start()
self.is_exit = False
# 退出任务
atexit.register(self.exit_task)
self.standby_pos = [90 * (np.pi / 180), 30 * (np.pi / 180), 90 * (np.pi / 180),
0 * (np.pi / 180), 90 * (np.pi / 180), 0.0 * (np.pi / 180)
]
self.init_pos = [90 * (np.pi / 180), 70 * (np.pi / 180), 130 * (np.pi / 180),
0 * (np.pi / 180), 90 * (np.pi / 180), 0.0 * (np.pi / 180)
]
self.off_pos = [90 * (np.pi / 180), 90 * (np.pi / 180), 150 * (np.pi / 180),
0 * (np.pi / 180), 90 * (np.pi / 180), 0.0 * (np.pi / 180)
]
self.pack_pos = [90 * (np.pi / 180), 90 * (np.pi / 180), 150 * (np.pi / 180),
0 * (np.pi / 180), 90 * (np.pi / 180), -90 * (np.pi / 180)
]
def init(self):
self.is_exit = False
time.sleep(2)
self.is_standby = True
def exit_task(self):
self.is_exit = True
def pack(self):
print("运动到打包位置")
self.move_joint(self.pack_pos,wait=True)
def getModelType(self):
robot_mode_type = self.robot.getRobotState().getRobotModeType()
print("机器人的模式状态:", robot_mode_type)
if robot_mode_type.value == 8:
self.power_off()
time.sleep(1)
robot_mode_type = self.robot.getRobotState().getRobotModeType()
print("机器人的模式状态:", robot_mode_type)
print(robot_mode_types.get(robot_mode_type.value, "未知模式"))
# 接口调用: 获取安全模式
safety_mode_type = self.robot.getRobotState().getSafetyModeType()
print("安全模式:", safety_mode_type)
print(safety_mode_types.get(safety_mode_type.value, "未知模式"))
return robot_mode_type.value, safety_mode_type.value
def start_up(self):
if 0 == self.robot_rpc_client.getRobotInterface(self.robot_name).getRobotConfig().setCollisionLevel(0):
time.sleep(0.2)
print("The robot is requesting turn off collision detection!")
print("self.robot_rpc_client.getRobotInterface(self.robot_name).getRobotConfig().getCollisionLevel()",self.robot_rpc_client.getRobotInterface(self.robot_name).getRobotConfig().getCollisionLevel())
if 0 == self.robot_rpc_client.getRobotInterface(
self.robot_name).getRobotManage().poweron(): # 接口调用: 发起机器人上电请求
print("The robot is requesting power-on!")
if 0 == self.robot_rpc_client.getRobotInterface(
self.robot_name).getRobotManage().startup(): # 接口调用: 发起机器人启动请求
print("The robot is requesting startup!")
# 循环直至机械臂松刹车成功
while 1:
robot_mode = self.robot_rpc_client.getRobotInterface(self.robot_name) \
.getRobotState().getRobotModeType() # 接口调用: 获取机器人的模式类型
print("Robot current mode: %s" % (robot_mode.name))
if robot_mode == pyaubo_sdk.RobotModeType.Running:
break
time.sleep(1)
def power_off(self):
robot_name = self.robot_rpc_client.getRobotNames()[0] # 接口调用: 获取机器人的名字
if 0 == self.robot_rpc_client.getRobotInterface(
robot_name).getRobotManage().poweroff(): # 接口调用: 机械臂断电
print("The robot is requesting power-off!")
def move_joint(self, q ,max_retry_count = 3, wait = False):
cnt = 0
while not self.is_exit or wait:
cnt += 1
if cnt > max_retry_count:
print(f'Failed to arrive at the joint position: {q}')
return -1
# self.mc.moveJoint(q, 1.4, 1.04, 0, 0)
self.mc.moveJoint(q, 0.5, 0.42, 0, 0)
is_arrived = self.waitArrival()
if is_arrived == -1:
self.robot_rpc_client.getRuntimeMachine().stop()
self.robot_rpc_client.getRuntimeMachine().start()
time.sleep(0.1)
continue
elif is_arrived == -2:
print(f'Failed to arrive at the joint position: {q}')
return -1
else:
print(f'Arrived at the joint position: {q}')
return 0
print(f'Failed to arrive at the joint position: {q}')
def waitArrival(self,max_retry_count = 3):
cnt = 0
while self.mc.getExecId() == -1:
cnt += 1
if cnt > max_retry_count:
print("Motion fail!")
return -1
time.sleep(0.05)
print("getExecId: ", self.mc.getExecId())
id = self.mc.getExecId()
while True:
id1 = self.mc.getExecId()
# 获取机械臂的模式类型
robot_mode_type = self.robot.getRobotState().getRobotModeType()
# print("robot_mode_type: ", type(robot_mode_type))
# 获取安全模式类型
safety_mode_type = self.robot.getRobotState().getSafetyModeType()
# print("safety_mode_type: ", type(safety_mode_type))
# 假设 pyaubo_sdk.RobotModeType 和 pyaubo_sdk.SafetyModeType 是枚举类型
# 将错误的模式类型代码列出来进行比较
# 修改判断方式以符合枚举类型
if robot_mode_type in [pyaubo_sdk.RobotModeType.Disconnected,
pyaubo_sdk.RobotModeType.PowerOff,
pyaubo_sdk.RobotModeType.BackDrive,
pyaubo_sdk.RobotModeType.Error]:
print(f"机械臂模式错误: code = {robot_mode_type}")
self.power_off()
return -2
if safety_mode_type in [pyaubo_sdk.SafetyModeType.Undefined,
pyaubo_sdk.SafetyModeType.Recovery,
pyaubo_sdk.SafetyModeType.Violation,
pyaubo_sdk.SafetyModeType.ProtectiveStop,
pyaubo_sdk.SafetyModeType.SafeguardStop,
pyaubo_sdk.SafetyModeType.SystemEmergencyStop,
pyaubo_sdk.SafetyModeType.RobotEmergencyStop,
pyaubo_sdk.SafetyModeType.Fault]:
print(f"机械臂安全模式错误: code = {safety_mode_type}")
self.power_off()
return -2
if id != id1:
break
time.sleep(0.05)
return 0
if __name__ == '__main__':
auboC5 = AuboC5()
auboC5.power_off()