NavisworksTransport/doc/design/2026/吊装路径通行空间设计.md

172 lines
6.1 KiB
Markdown
Raw 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.

# 吊装路径通行空间设计
## 概述
吊装路径Hoisting Path采用门式起重机Gantry Crane的运动方式与物体沿地面路径行驶不同物体在平移过程中**不发生旋转**。
## 运动阶段
吊装路径由三个明确的阶段组成:
```
起吊段(垂直) → 平移段(水平) → 下降段(垂直)
↑ ↓
地面 地面
```
### 1. 起吊段
- **方向**:垂直向上
- **通行空间截面**:宽度 × 长度(水平方向)
- **特点**:物体从地面垂直起升到安全高度
### 2. 平移段
- **方向**:水平移动(可直角转折)
- **特点**:物体姿态保持不变,仅做平移运动
- **方向处理**
- 初始方向:通行空间正面(物体宽度方向)垂直于路径
- 转折90度通行空间侧面物体长度方向垂直于路径
### 3. 下降段
- **方向**:垂直向下
- **通行空间截面**:宽度 × 长度(水平方向)
- **特点**:物体从安全高度下降到目标地面位置
## 通行空间尺寸设计
### 关键设计原则
由于吊装过程中**物体不旋转**当路径水平转折90度时相对于路径方向的物体朝向发生了变化
- 初始方向:物体正面朝向路径垂直方向
- 转折90度物体侧面朝向路径垂直方向
因此需要检测水平段是否转折90度并相应调整通行空间尺寸。
### 尺寸计算
| 段类型 | 路径方向 | 与初始方向关系 | 通行空间 width垂直于路径 | 通行空间 height |
|--------|----------|--------------|---------------------------|----------------|
| 起吊/下降段 | 垂直 | - | 物体宽度 | 物体长度 |
| 平移段 | 水平 | 相同0度 | **物体宽度**(正面) | 物体高度 |
| 平移段 | 水平 | 垂直90度转折 | **物体长度**(侧面) | 物体高度 |
### 代码实现
`BuildDirectPathLines` 方法中检测90度转折
```csharp
// 对于吊装路径水平段检测是否转折90度
bool isTurn90Horizontal = false;
if (!isVerticalSegment && visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting && horizontalDirection != null)
{
// 计算当前水平段方向与初始水平段方向的点积
double dotProduct = currentDirection.X * horizontalDirection.X + currentDirection.Y * horizontalDirection.Y;
// 点积接近0表示垂直90度转折
isTurn90Horizontal = Math.Abs(dotProduct) < 0.1;
}
```
`CalculatePassageSpaceParameters` 方法中:
```csharp
if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting)
{
// 吊装路径:根据段类型和方向设置尺寸
// 默认width=物体宽度垂直于路径height=物体高度/长度
widthInMeters = _passageAcrossPath;
heightInMeters = isVerticalSegment ? _objectLength : _objectHeight;
// 🔥 水平段转折90度特殊处理width改用物体长度
if (!isVerticalSegment && isTurn90Horizontal)
{
widthInMeters = _objectLength;
}
}
else
{
// 其他路径类型
widthInMeters = _passageAcrossPath;
heightInMeters = _passageNormalToPath;
}
```
### 关键变更说明
**2025-02-01 修正**
- **问题**吊装路径平移段转折90度后通行空间方向与物体实际方向不符物体不旋转但通行空间尺寸未跟随路径方向变化
- **修正**
- 检测水平段是否与初始方向垂直90度转折
- 初始方向width = 物体宽度(正面朝向路径垂直方向)
- 转折90度width = 物体长度(侧面朝向路径垂直方向)
- **原因**门式起重机平移时物体不旋转路径转折90度后物体相对于路径的朝向发生变化通行空间需要相应调整以准确描述物体占据的空间
## 与物体路径的区别
| 特性 | 物体路径(地面) | 吊装路径(空中) |
|------|----------------|----------------|
| 运动方式 | 沿路径行驶,随路径转向 | 平移,姿态保持不变 |
| 转向行为 | 物体旋转以适应路径 | 物体不旋转 |
| 通行空间方向 | 跟随路径方向 | 保持物体固有方向 |
| 适用场景 | 地面物流运输 | 空中吊装作业 |
## 可视化渲染
### 方向计算
在渲染通行空间时,使用 `horizontalDirection` 参数确保方向一致性:
```csharp
// 吊装路径特殊处理:物体平移不旋转,通行空间方向保持一致
if (horizontalDirection != null)
{
// 垂直段的 right 向量应该垂直于水平段的方向向量
right = new Vector3D(horizontalDirection.Y, -horizontalDirection.X, 0);
}
```
### 起点终点延伸
为了确保通行空间完全包裹物体,所有水平段的起点和终点都需要向路径方向延伸半个物体尺寸:
```csharp
// 通行空间包裹调整:水平段起点向反方向、终点向正方向各延伸半个物体尺寸
if (_visualizationMode == PathVisualizationMode.ObjectSpace && !isVerticalSegment)
{
double offset = alongPathSize / 2.0; // 沿路径方向的物体尺寸的一半
// 起点向反方向延伸
adjustedStartPoint = new Point3D(
adjustedStartPoint.X - dirX * offset,
adjustedStartPoint.Y - dirY * offset,
adjustedStartPoint.Z - dirZ * offset
);
// 终点向正方向延伸
adjustedEndPoint = new Point3D(
adjustedEndPoint.X + dirX * offset,
adjustedEndPoint.Y + dirY * offset,
adjustedEndPoint.Z + dirZ * offset
);
}
```
**原因**:路径点使用物体中心坐标,如果不延伸,起点和终点处只会包裹物体的一半。
### 渲染模式
使用 `ObjectSpace` 可视化模式显示吊装路径的通行空间:
- 起吊/下降段:垂直长方体,截面为物体宽度 × 物体长度
- 平移段(初始方向):水平长方体,截面为物体宽度 × 物体高度
- 平移段转折90度水平长方体截面为物体长度 × 物体高度
- **所有水平段**:起点和终点向路径方向延伸半个物体尺寸,确保完全包裹
## 参考
- 门式起重机Gantry Crane运动学
- 无人物流吊装作业规范