主要修复: - 改进墙体分块方式:上下全宽 + 左右洞口高度,避免四角空缺 - 添加墙体清理机制:重建前清理所有旧墙体部件,防止叠加 - 修复cleanup函数:确保清理所有墙体部件而非仅主ID - 记录所有墙体部件ID用于正确清理 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
6.0 KiB
6.0 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
项目概述
这是一个现实环境机械臂运作可行性测试项目,用于验证真实工业机械臂在复杂环境中的作业能力。
核心测试需求
主要目标:验证机械臂能否在有障碍物的现实环境中完成精确作业任务
测试场景:机械臂从指定基座位置出发,到达取物点A,抓取物体,穿越墙体洞口障碍,到达目标点B并释放物体
现实对应:
- 工厂环境中的跨区域物料传送
- 建筑工地的穿墙作业
- 危险环境中的精确物品递送
- 医疗手术中的精密器械传递
可行性验证内容:
- 到达性分析:机械臂工作空间是否覆盖所有任务点
- 避障能力:是否能规划出穿越洞口的安全路径
- 精度要求:是否能在约束空间内完成精确操作
- 安全性:整个作业过程是否避免碰撞
技术栈
- pybullet: 物理仿真引擎
- kdl: 运动学/动力学库
- AI RRT*: 路径规划算法
配置管理原则
所有配置参数必须从 config.json 文件读取,严禁硬编码:
- 机械臂模型路径必须从
config.robot.model_path读取 - 墙体参数从
config.wall读取 - 洞口参数从
config.hole读取 - 任务点A、B从
config.task_points读取 - 运送物体参数从
config.transport_object读取 - 仿真参数从
config.simulation读取 - 修改任何参数只需修改配置文件,无需改动代码
项目架构
目录结构
config.json: 核心配置文件,包含所有运行参数models/: 机械臂模型文件目录manual_robot.urdf: 9自由度机械臂URDF配置文件
CLAUDE.md: 项目开发指南
机械臂模型规范
- 使用URDF格式定义机械臂模型
- 遵循右手坐标系统:X轴(红色)、Y轴(绿色)、Z轴(蓝色)
- 关节轴向定义:
xyz="1 0 0": 绕X轴旋转xyz="0 1 0": 绕Y轴旋转xyz="0 0 1": 绕Z轴旋转
坐标系统
- 位置定义:
<origin xyz="x y z" rpy="roll pitch yaw"/> - xyz: 位置偏移(米)
- rpy: 旋转角度(弧度) - roll绕X轴,pitch绕Y轴,yaw绕Z轴
开发指导
核心功能模块
- 机械臂控制模块: 基于pybullet的仿真控制
- 路径规划模块: 使用RRT*算法进行避障路径规划
- 运动学计算模块: 使用kdl进行正逆运动学计算
- 障碍物检测模块: 碰撞检测和环境感知
业务流程(严格按此顺序执行)
1. 系统初始化
- 读取配置文件: 从
config.json加载所有配置参数 - 验证配置: 检查所有必要参数是否存在且有效
- 初始化pybullet仿真环境: 使用
config.simulation参数
2. 环境构建
- 加载机械臂: 使用
config.robot.model_path指定的URDF文件 - 设置机械臂基座: 使用
config.robot.base_position和base_orientation - 创建墙体障碍: 根据
config.wall参数创建墙体 - 创建洞口: 在墙体中根据
config.hole参数创建洞口 - 放置运送物体: 在
config.transport_object.initial_position放置物体
3. 任务执行
- 路径规划阶段1: 机械臂基座 → A点(取物点)
- 抓取物体: 在A点抓取运送物体
- 路径规划阶段2: A点 → 穿越洞口 → B点(避障路径规划)
- 运送物体: 携带物体穿越障碍到达B点
- 释放物体: 在B点释放物体
4. 关键约束
- 配置驱动: 所有参数必须从config.json读取
- 避障要求: 机械臂和物体不能与墙体碰撞,只能通过洞口
- 路径平滑: 使用RRT*算法确保路径可行且平滑
- 运动学约束: 遵循机械臂的运动学限制
开发规范
配置文件使用规范
# 正确的配置读取方式
import json
# 1. 必须首先读取配置文件
with open('config.json', 'r') as f:
config = json.load(f)
# 2. 从配置读取机械臂模型路径
robot_model_path = config['robot']['model_path']
# 3. 从配置读取所有其他参数
wall_params = config['wall']
hole_params = config['hole']
task_points = config['task_points']
transport_object = config['transport_object']
严禁的做法
# ❌ 严禁硬编码路径和参数
robot_model = "models/manual_robot.urdf" # 错误!
wall_position = [2.0, 0.0, 1.0] # 错误!
测试验证
- 配置文件修改后,程序行为应相应改变
- 不同的机械臂模型应能正确加载
- 墙体和洞口参数变化应反映在仿真中
- A、B点位置调整应影响路径规划结果
已知问题
KDL逆运动学崩溃(2025-09-11)✅ 已解决
现象:点击"Test Reachability"按钮后程序直接退出,无错误信息。
根本原因:C++对象生命周期问题
ik_vel_solver作为局部变量在函数结束后被销毁ChainIkSolverPos_NR_JL内部持有已销毁对象的引用- 调用
CartToJnt时访问无效内存导致崩溃
解决方案:
- 将
ik_vel_solver改为实例变量self.ik_vel_solver - 确保与
ik_solver有相同的生命周期 - 移除违反编码规范的回退方案
修复文件:src/robot/kinematics.py
墙体洞口创建问题(2025-09-11)✅ 已解决
现象:
- 修改洞口尺寸后墙体形状异常,呈现"凸"字形
- 洞口尺寸变化不生效
- 多次修改后墙体形状越来越怪异
根本原因:
- 墙体分块设计错误:上下墙体只有洞口宽度,左右墙体是全高,导致四角空缺
- 未清理旧墙体:每次重建墙体时新旧叠加,形状混乱
- cleanup函数不完整:只清理了主墙体ID,未清理所有墙体部件
解决方案:
- 改为"上下全宽 + 左右洞口高度"的分块方式,避免四角空缺
- 添加
_clear_wall()函数清理所有墙体部件 - 修复
cleanup()函数调用_clear_wall() - 使用
_wall_part_ids列表记录所有墙体部件ID
修复文件:src/simulation/environment.py