| name | human-robot-collaboration |
| description | 人机协作技能 - 直接示教、安全监控、力限接触、协作空间、ROS2 CSR |
| argument-hint | 人机协作 OR HRC OR direct teaching OR collaborative OR human-robot |
| user-invocable | true |
人机协作控制技能
人机协作控制与安全
何时使用
当需要以下帮助时使用此技能:
- 直接示教
- 安全监控
- 力限接触
- 协作空间 (CSPACE)
- ROS2 协作接口
核心实现
直接示教
import numpy as np
class DirectTeaching:
def __init__(self, robot_model):
self.robot = robot_model
self.gravity_compensation = True
def compute_teaching_torque(self, q, q_dot, F_ext):
"""
直接示教力矩
仅需要重力补偿 + 外力跟踪
"""
if self.gravity_compensation:
tau_gravity = self.robot.compute_gravity(q)
else:
tau_gravity = np.zeros_like(q)
J = self.robot.get_jacobian(q)
tau_ext = J.T @ F_ext * 0.1
return tau_gravity + tau_ext
def gravity_compensation(self, q):
"""重力补偿"""
g = 9.81
tau_g = np.zeros_like(q)
for i in range(len(q)):
m_i = self.robot.link_mass[i]
com_i = self.robot.link_com[i]
tau_g[i] = m_i * g * com_i[1]
return tau_g
安全监控
class SafetyMonitor:
def __init__(self):
self.velocity_limit = 0.5
self.force_limit = 150.0
self.power_limit = 200.0
self.safety_state = 'normal'
def check_safety(self, robot_state):
"""
检查安全状态
返回: 'normal', 'warning', 'stop'
"""
if np.any(np.abs(robot_state.ee_velocity) > self.velocity_limit):
return 'warning'
if np.any(np.abs(robot_state.ee_force) > self.force_limit):
return 'stop'
power = np.abs(robot_state.motor_power).sum()
if power > self.power_limit:
return 'warning'
return 'normal'
def generate_safety_response(self, safety_state):
"""生成安全响应"""
safety_state == :
{: , : }
safety_state == :
{: , : }
:
{: }
力限接触
class ForceLimitedContact:
def __init__(self):
self.force_threshold = 50.0
def compute_safe_velocity(self, direction, F_contact):
"""
根据接触力计算安全速度
"""
F_mag = np.linalg.norm(F_contact)
if F_mag > self.force_threshold:
scale = min(1.0, F_threshold / F_mag)
else:
scale = 1.0
return direction * scale
协作空间 (CSPACE)
class CollaborativeSpace:
def __init__(self):
self.safety_distance = 0.5
self.warning_distance = 1.0
def get_cspace_status(self, human_pos, robot_pos, robot_velocity):
"""
获取协作空间状态
"""
distance = np.linalg.norm(human_pos - robot_pos)
if distance < self.safety_distance:
return 'stop'
elif distance < self.warning_distance:
min_safe_velocity = self.compute_safe_velocity(
distance, robot_velocity)
return {'type': 'speed_limit', 'velocity': min_safe_velocity}
else:
return 'normal'
def compute_safe_velocity(self, distance, current_velocity):
"""计算安全速度"""
z_max = 2.0
d = max(0.5, distance)
v_max = z_max * (d - self.safety_distance) / (self.warning_distance - self.safety_distance)
(v_max, current_velocity)