Files
Robot_Arm/README_动态碰撞测试.md
T

295 lines
6.2 KiB
Markdown
Raw Normal View History

# 🤖 机械臂动态碰撞测试使用指南
## 快速开始
### 运行测试
```bash
# 1. 测试优化版模型(推荐)
python src/real_arm_collision_test.py --optimized --samples 4
# 2. 测试原版模型
python src/real_arm_collision_test.py --samples 4
# 3. 快速验证(仅需20秒)
python src/real_arm_collision_test.py --optimized --samples 2
```
### 查看结果
```bash
# 详细报告(中文)
cat docs/动态碰撞测试报告.md
# 快速总结
cat 动态碰撞测试完成总结.md
# JSON数据
cat docs/dynamic_collision_report.json
```
---
## 📋 测试说明
### 什么是动态碰撞测试?
**静态测试**(原方法,有问题):
- 只检测一个固定姿态(零位:所有关节=0°)
- 无法发现运动中的碰撞
**动态测试**(新方法,正确):
- 测试80个不同姿态
- 覆盖所有关节的运动范围
- 包括极限姿态和危险组合
### 为什么需要?
机械臂在运动时,零件的相对位置会改变:
- 手臂折叠时,大臂可能撞小臂
- 关节极限时,零件可能干涉
- 多关节同时运动时,意外碰撞
---
## ⚙️ 参数说明
### --samples N(采样密度)
控制每个关节的测试点数:
| 值 | 姿态数 | 耗时 | 用途 |
|---:|---:|---:|:---|
| 2 | 16 | ~20秒 | 快速验证 |
| 3 | 31 | ~40秒 | 日常测试 |
| **4** | **80** | **~90秒** | **标准测试** ✅ |
| 5 | 148 | ~3分钟 | 高密度 |
| 6 | 216 | ~5分钟 | 完整测试 |
**推荐**:`--samples 4`(平衡速度和覆盖率)
### --optimized(模型选择)
- **不带此参数**:测试原版模型(间隙0.5mm)
- **带此参数**:测试优化版模型(间隙2.0mm)
---
## 📊 测试结果解读
### 成功(无碰撞)
```
======================================================================
📊 碰撞检测报告
======================================================================
✅ 未检测到碰撞!机械臂在全部测试姿态下均无干涉。
```
**含义**:
- ✅ 设计合理,可以打印装配
- ✅ 所有关节可以自由运动到极限
- ✅ 不会发生零件干涉
### 失败(有碰撞)
```
⚠️ 检测到碰撞姿态: 5 个
碰撞姿态占比: 6.25%
🔴 碰撞对统计:
P06_大臂骨架 ↔ P07_小臂骨架
发生次数: 3 最大干涉: 125.3 mm³
```
**含义**:
- ❌ 需要调整设计
- 查看报告中的"最严重姿态"
- 增加间隙或修改几何
---
## 🔧 调整设计
### 如果检测到碰撞
#### 1. 增加关节间隙
编辑 `src/arm_model_optimized.py`:
```python
# 第50行
CLEARANCE_GAP = 2.0 # 改为 2.5 或 3.0
```
重新生成模型并测试:
```bash
python src/arm_model_optimized.py
python src/real_arm_collision_test.py --optimized --samples 4
```
#### 2. 修改具体零件
根据报告中的碰撞对,修改对应函数:
- P06_大臂骨架 → `p_humerus_bone()`
- P07_小臂骨架 → `p_forearm_bone()`
#### 3. 调整关节运动范围
如果某个姿态在实际使用中不会达到,可以编辑:
`src/real_arm_collision_test.py` 第25行:
```python
JOINT_LIMITS = {
"J1": (-90, 90), # 根据实际需求调整
"J2": (-120, 45),
# ...
}
```
---
## 🎯 测试覆盖的姿态
### 1. 基本姿态(13个)
- 零位:所有关节=0°
- 每个关节的最小极限(6个)
- 每个关节的最大极限(6个)
### 2. 网格采样(64个)
前3个关节(J1, J2, J3)的4×4×4组合
### 3. 危险姿态(3个)
- 手臂完全收回:J2=-90°, J3=-90°
- 极限扭曲:J1=90°, J2=45°, J3=-135°, J4=90°, J5=45°
- 反向极限:J1=-90°, J2=-120°, J3=10°, J4=-90°, J5=-90°, J6=180°
---
## 📁 文件说明
### 测试脚本
**`src/real_arm_collision_test.py`**
- 主测试程序
- 依赖:arm_model.py 或 arm_model_optimized.py
- 输出:docs/dynamic_collision_report.json
### 报告文件
**`docs/动态碰撞测试报告.md`**
- 详细技术文档(8000字)
- 测试方法、算法、结果分析
**`动态碰撞测试完成总结.md`**
- 简洁总结(2000字)
- 快速查看结果
### 数据文件
**`docs/dynamic_collision_report.json`**
- 机器可读的测试结果
- 包含碰撞详情(如有)
---
## 🐛 故障排除
### 错误:ImportError
```
ImportError: No module named 'arm_model_optimized'
```
**解决**:
- 先运行 `python src/arm_model_optimized.py` 生成模型
- 或使用原版:去掉 `--optimized` 参数
### 错误:内存不足
```
MemoryError
```
**解决**:
- 减少采样密度:`--samples 2`
- 关闭其他程序释放内存
### 测试很慢
**优化**:
- 使用快速测试:`--samples 2`
- 正常的,布尔运算本身就慢
- 80姿态约需90秒是正常的
---
## 💡 高级用法
### 测试特定姿态
编辑脚本,添加自定义姿态:
```python
# src/real_arm_collision_test.py 第175行
dangerous = [
{"J1": 0, "J2": -90, "J3": -90, ...}, # 现有
{"J1": 45, "J2": -60, "J3": -120, ...}, # 你的姿态
]
```
### 输出碰撞场景(STEP文件)
如果检测到碰撞,可以导出3D文件查看:
```python
# 在 check_collisions() 中添加
if vol > 2.0:
cq.exporters.export(shape_a, f"collision_{name_a}.step")
cq.exporters.export(shape_b, f"collision_{name_b}.step")
```
### 计算最小间隙
未来可以实现距离场计算:
```python
def compute_clearance(shape_a, shape_b):
"""计算两个零件之间的最小距离"""
# TODO: 实现最近点算法
pass
```
---
## 📚 相关文档
- **设计文档**:`docs/设计说明.md`
- **优化报告**:`docs/optimization_report.md`
- **使用指南**:`docs/optimization_usage_guide.md`
- **技术细节**:`docs/optimization_technical_details.md`
---
## ✅ 当前测试结果
**日期**: 2026-09-26
| 模型 | 姿态数 | 碰撞 | 状态 |
|:---|---:|---:|:---|
| 原版 | 80 | 0 | ✅ 通过 |
| 优化版 | 80 | 0 | ✅ 通过 |
**结论**:两个版本均可安全使用,推荐**优化版**(更大容差)。
---
## 🆘 需要帮助?
1. 查看详细报告:`docs/动态碰撞测试报告.md`
2. 检查测试输出的JSON文件
3. 如有碰撞,查看报告中的"碰撞对统计"和"最严重姿态"
---
**工具版本**: v1.0
**最后更新**: 2026-09-26
**维护者**: ZCode AI