修改吊装路径通行空间空中段方向的问题

This commit is contained in:
tian 2026-02-04 11:54:39 +08:00
parent 5b6c8906aa
commit eeeaceacc4
3 changed files with 174 additions and 8 deletions

View File

@ -0,0 +1,142 @@
# 吊装路径通行空间设计
## 概述
吊装路径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);
}
```
### 渲染模式
使用 `VehicleSpace` 可视化模式显示吊装路径的通行空间:
- 起吊/下降段:垂直长方体,截面为物体宽度 × 物体长度
- 平移段(初始方向):水平长方体,截面为物体宽度 × 物体高度
- 平移段转折90度水平长方体截面为物体长度 × 物体高度
## 参考
- 门式起重机Gantry Crane运动学
- 无人物流吊装作业规范

View File

@ -6,11 +6,11 @@
1. [x] (优化)预计算高亮正确,结果高亮错误,高亮了很多不相干的同名物体
2. [ ] BUG预计算一个目标物体161帧碰撞机制有问题
3. [ ] BUG吊装路径终点前的一段拐弯通行空间方向不对
3. [x] BUG吊装路径终点前的一段拐弯通行空间方向不对
4. [x] BUG批处理时杀死程序重新打开有执行中的任务但删除选中没激活再运行批处理收到停止信号结束
5. [x] BUG碰撞检测历史列表不自动加载不自动刷新
6. [x] (优化)将通行空间透明度变成系统参数,可以修改
7. [ ] 优化ClashDetective检测中每执行100次打印一下日志
7. [x] 优化ClashDetective检测中每执行100次打印一下日志
8. [ ] (研究)如何利用剖面,过滤被隐藏的内容
9. [ ] (研究)根据路径高度范围,过滤几何体
10. [x] BUG批处理指定检测物体预计算时没有忽略空间缓存建立

View File

@ -1369,9 +1369,10 @@ namespace NavisworksTransport
/// <param name="visualization">路径可视化对象</param>
/// <param name="metersToModelUnits">米到模型单位的转换系数</param>
/// <param name="isVerticalSegment">是否是垂直段(仅用于吊装路径)</param>
/// <param name="isTurn90Horizontal">是否是与初始方向垂直的水平段吊装路径转折90度</param>
/// <returns>通行空间参数元组</returns>
private (double heightInModelUnits, double widthInModelUnits, Color lineColor, double lineOpacity, double verticalOffset)
CalculatePassageSpaceParameters(PathVisualization visualization, double metersToModelUnits, bool isVerticalSegment = false)
CalculatePassageSpaceParameters(PathVisualization visualization, double metersToModelUnits, bool isVerticalSegment = false, bool isTurn90Horizontal = false)
{
double heightInMeters;
double widthInMeters;
@ -1383,11 +1384,16 @@ namespace NavisworksTransport
// VehicleSpace 模式:根据路径类型和段类型计算通行空间尺寸
if (visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting)
{
// 吊装路径:根据段类型设置尺寸
// 水平段空中平移width=物体长度前进方向宽度height=物体高度
// 垂直段(起吊/下降width=物体宽度height=物体长度
widthInMeters = isVerticalSegment ? _passageAcrossPath : _objectLength;
// 吊装路径:根据段类型和方向设置尺寸
// 默认width=物体宽度垂直于路径height=物体高度/长度
widthInMeters = _passageAcrossPath;
heightInMeters = isVerticalSegment ? _objectLength : _objectHeight;
// 🔥 水平段转折90度特殊处理width改用物体长度
if (!isVerticalSegment && isTurn90Horizontal)
{
widthInMeters = _objectLength;
}
}
else
{
@ -1775,8 +1781,26 @@ namespace NavisworksTransport
}
// 计算通行空间参数(根据段类型)
// 对于吊装路径水平段检测是否转折90度
bool isTurn90Horizontal = false;
if (!isVerticalSegment && visualization.PathRoute.PathType == NavisworksTransport.PathType.Hoisting && horizontalDirection != null)
{
// 计算当前水平段方向
var currentDx = endPoint.Position.X - startPoint.Position.X;
var currentDy = endPoint.Position.Y - startPoint.Position.Y;
var currentLength = Math.Sqrt(currentDx * currentDx + currentDy * currentDy);
if (currentLength > 0.001)
{
var currentDirection = new Vector3D(currentDx / currentLength, currentDy / currentLength, 0);
// 计算与初始水平段方向的点积
double dotProduct = currentDirection.X * horizontalDirection.X + currentDirection.Y * horizontalDirection.Y;
// 点积接近0表示垂直90度转折
isTurn90Horizontal = Math.Abs(dotProduct) < 0.1;
}
}
var (heightInModelUnits, widthInModelUnits, lineColor, lineOpacity, verticalOffset) =
CalculatePassageSpaceParameters(visualization, metersToModelUnits, isVerticalSegment);
CalculatePassageSpaceParameters(visualization, metersToModelUnits, isVerticalSegment, isTurn90Horizontal);
// 计算长方体的轴向量right和up向量
var (right, up) = CalculateCuboidAxes(startPoint.Position, endPoint.Position, horizontalDirection);