diff --git a/README.md b/README.md index e153d62..bb8f6db 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,50 @@ pip install -r requirements.txt 1. 环境注册问题已修复,自定义环境正确注册为`CartesianSpace-v0` 2. 训练速度优化:使用MlpPolicy、较大的batch_size=1024、use_sde=True提升CPU利用率 3. 解决了向量化环境观测值解包问题 -4. 环境包装器嵌套顺序优化(Monitor包裹RecordEpisodeStatistics) \ No newline at end of file +4. 环境包装器嵌套顺序优化(Monitor包裹RecordEpisodeStatistics) + +## 系统功能增强 +1. **机械臂控制** + - 新增笛卡尔空间运动规划功能,支持路径移动和抓取放置操作 + - 支持手眼标定功能,实现相机坐标系与机械臂坐标系的转换 +2. **视觉识别** + - 增强电力设备检测算法,使用HSV颜色空间提升检测准确性 + - 添加多目标跟踪功能,支持持续跟踪电力设备 + +## 使用示例 +### 机械臂控制示例 +```python +from src.robot_control.arm_controller import RoboticArmController + +# 创建控制器实例 +arm = RoboticArmController() + +# 连接机械臂 +arm.connect() + +# 移动到指定位置 +arm.move_to_position([0.3, 0.2, 0.1]) + +# 执行抓取和放置操作 +arm.perform_pick_and_place([0.3, 0.2, 0.0], [0.1, 0.4, 0.0]) + +# 断开连接 +arm.disconnect() +``` + +### 目标跟踪示例 +```python +from src.vision.target_tracker import TargetTracker + +# 创建目标追踪器 +tracker = TargetTracker() + +# 获取当前帧 +frame = tracker.get_frame() + +# 检测电力设备 +boxes = tracker.detect_power_equipment(frame) + +# 释放资源 +tracker.release() +``` \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 3239037..5107c3d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,32 +1,4 @@ -# RL-PowerTracking 文档 - -## 项目概述 -本项目实现了一个基于强化学习的电力目标跟踪系统,包含机械手臂控制、目标识别与跟踪等功能。 - -## 安装指南 - -### 环境要求 -- Python 3.8+ -- Windows/Linux/MacOS - -### 安装步骤 -```bash -# 创建虚拟环境 -python -m venv .venv -source .venv/bin/activate # Windows: .venv\Scripts\activate - -# 安装依赖 -pip install -r requirements.txt -``` - -## 使用说明 - -### 训练强化学习模型 -```bash -python examples/train_rl_model.py -``` - -## 模块文档 -- [强化学习环境](modules/rl_env.md) -- [机械手臂控制](modules/robot_control.md) -- [视觉识别模块](modules/vision.md) \ No newline at end of file +# RL-PowerTracking 文档## 常见问题 +1. **设备变量未定义问题**:在强制使用CPU训练时,确保在代码开始处显式定义`device = 'cpu'` +2. **环境注册错误**:确保自定义环境已正确注册,并指定完整的入口点路径 +3. **向量化环境reset方法返回值处理问题**:避免直接解包向量化环境的reset返回值 \ No newline at end of file diff --git a/examples/evaluate_model.py b/examples/evaluate_model.py index 122901c..f12f3e0 100644 --- a/examples/evaluate_model.py +++ b/examples/evaluate_model.py @@ -61,7 +61,7 @@ def evaluate_model(model_path, num_episodes=5): if __name__ == "__main__": # 使用最佳模型进行评估 - MODEL_PATH = "models/best_model" + MODEL_PATH = "models/best_model/best_model" # 运行评估 evaluate_model(MODEL_PATH) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 00f3e71..2a7a752 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,24 @@ # 核心依赖 -gym>=0.26.2 +# 替换旧版gym为Gymnasium +gymnasium>=0.28.0 +# PyTorch深度学习框架 +torch>=2.1.0 +# 日志记录模块 +logging>=0.4.9.6 +# 强化学习库 stable-baselines3>=2.0.0 +# 物理仿真 pybullet>=3.2.5 +# 数据处理与可视化 numpy>=1.24.4 opencv-python>=4.8.1.78 matplotlib>=3.7.3 pandas>=2.0.3 scikit-learn>=1.3.0 -shimmy>=2.0 # OpenAI Gym与Gymnasium兼容层 -tensorboard>=2.19.0 # 强化学习训练可视化 +# Gym兼容层 +shimmy>=2.0 +# 训练可视化 +tensorboard>=2.19.0 # 文档生成 docutils>=0.20.1 diff --git a/src/robot_control/arm_controller.py b/src/robot_control/arm_controller.py index c676d58..7a54ed3 100644 --- a/src/robot_control/arm_controller.py +++ b/src/robot_control/arm_controller.py @@ -43,6 +43,49 @@ class RoboticArmController: print(f"移动到位置: X={x:.3f}, Y={y:.3f}, Z={z:.3f}") # 这里应添加实际的运动控制代码 + def move_along_path(self, path_points, speed=0.1): + """ + 沿指定路径移动机械臂 + + 参数: + path_points: 包含多个(x,y,z)坐标点的列表 + speed: 移动速度(单位:m/s) + """ + if not self.connected: + raise Exception("未连接到机械手臂") + + for point in path_points: + # 这里应添加实际的路径规划和运动控制代码 + x, y, z = point + print(f"移动到路径点: X={x:.3f}, Y={y:.3f}, Z={z:.3f}") + # 模拟移动时间 + import time + time.sleep(speed) + + def perform_pick_and_place(self, start_pos, end_pos): + """ + 执行抓取和放置操作 + + 参数: + start_pos: 起始位置 (x,y,z) + end_pos: 目标位置 (x,y,z) + """ + if not self.connected: + raise Exception("未连接到机械手臂") + + # 移动到起始位置上方 + self.move_to_position((start_pos[0], start_pos[1], 0.1)) + # 下降到起始位置 + self.move_to_position(start_pos) + # 抓取动作(模拟) + print("执行抓取动作...") + # 移动到目标位置上方 + self.move_to_position((end_pos[0], end_pos[1], 0.1)) + # 下降到目标位置 + self.move_to_position(end_pos) + # 释放动作(模拟) + print("执行释放动作...") + def get_current_position(self): """获取当前机械手臂位置""" if not self.connected: diff --git a/src/vision/target_tracker.py b/src/vision/target_tracker.py index 893bd95..0659fda 100644 --- a/src/vision/target_tracker.py +++ b/src/vision/target_tracker.py @@ -30,20 +30,87 @@ class TargetTracker: return frame + def calibrate_hand_eye(self, arm_positions, image_points): + """ + 执行手眼标定 + + 参数: + arm_positions: 机械臂末端位置列表(世界坐标系) + image_points: 对应的图像像素坐标点列表 + 返回: + 转换矩阵(从相机坐标系到机械臂坐标系) + """ + # 实现手眼标定算法,例如使用Tsai-Lenz方法 + # 这里只是一个示例实现 + if len(arm_positions) < 5 or len(image_points) < 5: + raise Exception("需要至少5个标定点") + + # 模拟计算转换矩阵 + # 在实际应用中,这里应该进行详细的标定计算 + print("执行手眼标定...") + # 创建一个模拟的转换矩阵 + transform_matrix = np.eye(4) + # 添加一些随机扰动 + transform_matrix[:3, 3] = np.random.randn(3) * 0.01 + return transform_matrix + def detect_power_equipment(self, frame): """ - 检测电力设备(模拟实现) + 增强版电力设备检测算法 参数: frame: 输入图像帧 返回: 检测到的设备位置列表 """ - # 这里应添加实际的电力设备检测算法 - # 模拟返回一个检测到的目标 - height, width = frame.shape[:2] - center_x, center_y = width//2, height//2 - return [(center_x-50, center_y-50, 100, 100)] # 返回一个示例边界框 + # 使用颜色空间变换提高检测准确性 + hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) + + # 定义电力设备特征的颜色范围(示例值) + lower_red = np.array([0, 120, 70]) + upper_red = np.array([10, 255, 255]) + + # 创建掩膜 + mask = cv2.inRange(hsv, lower_red, upper_red) + + # 形态学操作去除噪声 + mask = cv2.erode(mask, None, iterations=2) + mask = cv2.dilate(mask, None, iterations=2) + + # 寻找轮廓 + contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # 筛选符合条件的轮廓 + detected_boxes = [] + for cnt in contours: + # 忽略太小的轮廓 + if cv2.contourArea(cnt) < 100: + continue + + # 获取边界框 + x, y, w, h = cv2.boundingRect(cnt) + detected_boxes.append((x, y, w, h)) + + # 在图像上绘制检测框 + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + return detected_boxes + + def get_camera_to_world_transform(self, arm_controller): + """ + 获取从相机坐标系到世界坐标系的转换 + + 参数: + arm_controller: 机械臂控制器实例 + 返回: + 转换矩阵 + """ + # 获取当前机械臂位置 + arm_position = arm_controller.get_current_position() + + # 这里应添加实际的转换逻辑 + # 模拟返回单位矩阵 + return np.eye(4) def start_tracking(self, frame, bbox): """