161 lines
9.3 KiB
Markdown
161 lines
9.3 KiB
Markdown
# 系统架构
|
||
|
||
## 解决方案与依赖边界
|
||
|
||
`ParkingRobot.sln` 包含三个项目:
|
||
|
||
| 项目 | 目标框架 | 职责 |
|
||
| --- | --- | --- |
|
||
| `CommonUsage-MultiVehicleSync/commonusage/CommonUsage.csproj` | `netstandard2.0` | 通用底盘、轮子模型、`SendMotion`/`SendXYThSpeed`和四轮几何解算 |
|
||
| `MedullaAdapter/MedullaAdapter.csproj` | `net8.0` | Medulla M层插件、MCU/CAN/串口/IO、遥控、报警和硬件反馈 |
|
||
| `MultiWheelC/MultiWheelC.csproj` | `netstandard2.0` | Clumsy C层插件、动作、控制器、轨迹、状态估计、实验记录 |
|
||
|
||
`Shared/` 没有独立项目:`MultiWheelC` 链接全部 `Shared/**/*.cs`,`MedullaAdapter` 只链接其需要的模型、数学、校验和底盘适配文件。`CommonUsage` 是独立底盘库,不反向依赖 `Shared`、M层或C层。来源:三个 `.csproj`。
|
||
|
||
```text
|
||
Clumsy宿主
|
||
└─ MultiWheelC
|
||
├─ Trajectory / StateEstimation / Control / Movements
|
||
├─ Shared
|
||
└─ CommonUsage.dll
|
||
|
||
Medulla宿主
|
||
└─ MedullaAdapter
|
||
├─ Shared(链接的必要文件)
|
||
├─ CommonUsage.dll
|
||
└─ mcu_serial_bridge.dll → MCU → CAN / Serial / IO
|
||
```
|
||
|
||
## 目录职责
|
||
|
||
| 路径 | 当前职责 |
|
||
| --- | --- |
|
||
| `MultiWheelC/Configuration/` | 停车控制、状态估计、原地自转和完成条件的车辆级运行参数 |
|
||
| `MultiWheelC/Trajectory/` | 弧长参数化轨迹、插值、投影和进度窗口;`LegacyTrackAdapter.cs` 目前仅占位 |
|
||
| `MultiWheelC/StateEstimation/` | Detour位姿校验/差分速度、轮组反馈速度组合与低通滤波 |
|
||
| `MultiWheelC/Control/Abstractions/` | 横向、纵向控制器接口与周期输入/输出模型 |
|
||
| `MultiWheelC/Control/Lateral/` | 当前默认 `StanleyLateralController` |
|
||
| `MultiWheelC/Control/Longitudinal/` | 当前默认 `PidLongitudinalController` |
|
||
| `MultiWheelC/Control/Allocation/` | 横纵结果组合、GCP限幅及GCP与刚体速度的转换 |
|
||
| `MultiWheelC/Control/Execution/` | `PathTrackingCore` 共享纯控制周期、单车命令执行、终点策略和耗时诊断 |
|
||
| `MultiWheelC/Movements/` | 舵轮准备、轨迹跟踪、原地自转和组合动作计划 |
|
||
| `MultiWheelC/Experiments/` | Clumsy宿主人工测试、测试轨迹工厂和CSV记录 |
|
||
| `MultiWheelC/Old/` | 保留的旧实现;不能仅因仍参与编译就视为新版流程依赖 |
|
||
| `Shared/` | M/C共享的SI数据模型、坐标变换、数值校验和底盘适配 |
|
||
| `MedullaAdapter/` | 车型定义、LadderLogic、MCU桥、CAN/串口、遥控、诊断 |
|
||
| `CommonUsage-MultiVehicleSync/commonusage/Chassis/` | 实际轮子模型、GCP/ICR求解、舵角/轮速分配和机械约束 |
|
||
| `data_process/` | 离线实验数据处理;日常代码任务不扫描其中的实验日志 |
|
||
| `参考文档/` | 参数样例和历史设计资料;不等同于运行时配置 |
|
||
|
||
## 入口与宿主生命周期
|
||
|
||
### C层
|
||
|
||
- `PilotDefinition : MultiWheelPilotDefinition<PilotConfig, PilotDefinition>` 是Clumsy车型定义和M/C IO边界。
|
||
- `PilotDefinition.Conf` 是动作读取运行配置的统一入口;`PilotConfig` 字段提供元数据和默认值。
|
||
- `[MovementTest]` 类型由宿主发现并执行,例如 `NewControllerStraight4mTest`、`NewControllerReverseStraight4mTest`、`NewControllerCrab45Straight4mTest`、`TestRotateAngle` 和 `CompositeStopTurnGoTest`。
|
||
- `MovementDefinition.Get()` 以 `IEnumerable<bool>` 形式协作执行:`true` 表示继续,结束动作时返回/产生 `false` 或退出枚举。具体宿主调度细节来自外部程序集,仓库内不可完全确认。
|
||
|
||
### M层
|
||
|
||
- `DiverCartDefinition : MultiWheelCartDefinition` 是Medulla车型定义。
|
||
- `CommunicationInit()` 打开并配置MCU桥。
|
||
- `[UseLadderLogic]` 注册 `AlarmRoutine`(50ms)、`MotorRoutine`(50ms)和 `MCURoutine`(20ms);这些是声明的扫描间隔,不能直接等同于实测稳定周期。
|
||
- `[UseManualController]` 注册 `Remote`。
|
||
|
||
## 新版轨迹跟踪调用链
|
||
|
||
```text
|
||
MovementTest / MotionPlanExecutor
|
||
→ TrajectoryTrackingMovement.Get()
|
||
→ PrepareWheelsForward(DirectionRadians=β)
|
||
→ MultiWheelChassisAdapter.ActivateMotionFrame(β)
|
||
→ ParkingVehicleStateProviderFactory.Create()
|
||
→ ParkingGeometricController.Start()/ExecuteCycle()
|
||
→ IVehicleStateProvider.TryGetState()
|
||
→ PathTrackingCore.Compute()
|
||
→ TrajectoryProjector.Project()
|
||
→ ILateralController.Compute()
|
||
→ ILongitudinalController.ComputeSpeedMetersPerSecond()
|
||
→ GcpCommandAllocator.Allocate()
|
||
→ GcpCommandExecutor.Execute()
|
||
→ GcpKinematics.ToBodyTwist()
|
||
→ MultiWheelChassisAdapter.SendBodyTwist()
|
||
→ MultiWheelChassis.SendMotion()
|
||
→ 四个真实舵轮角度和速度
|
||
```
|
||
|
||
`PathTrackingCore` 只依赖受控刚体的 `Pose2D`、车体系 `Twist2D`、速度有效标志和控制周期,不依赖 `VehicleState`、`FleetState`、底盘或通信。`ParkingGeometricController` 负责把单车状态源和实体底盘接到该核心;横向、纵向控制算法仍通过接口组合注入,没有采用控制器继承层次。
|
||
|
||
`TrajectoryTrackingMovement` 默认从 `PilotDefinition.Conf` 读取车辆级参数,同时保留少量动作级覆盖字段;横向控制器可通过 `LateralControllerFactory` 替换,纵向控制器当前固定创建为 `PidLongitudinalController`。
|
||
|
||
## 车队组件与尚未贯通的执行链
|
||
|
||
```text
|
||
夹紧且静止时的成员世界位姿快照
|
||
→ FleetLayoutCapture.Capture()
|
||
→ 初始FleetPoseInWorld + 不可变FleetLayout
|
||
|
||
成员状态样本 FleetMemberStateSample[]
|
||
→ FleetStateEstimator.Estimate()
|
||
→ FleetState + FleetMemberLayoutError[]
|
||
→ FleetCoordinator.ExecuteCycle()
|
||
→ FleetController(虚拟中心轨迹闭环和固定β_fleet)
|
||
→ 相对布局误差统一速度缩放
|
||
→ FleetKinematics.Decompose()
|
||
→ FleetMemberCommandCorrector
|
||
→ FleetMemberCommand[]
|
||
|
||
车队动作主要滚动方向β_fleet
|
||
→ FleetPreparationCoordinator(换算每车β_i并等待全员Ready)
|
||
→ FleetMemberAgent(本车停车准备、舵轮到位、激活、Execute/Stop)
|
||
```
|
||
|
||
`FleetLayoutCapture` 只负责固定布局的几何计算:车队原点X/Y取成员车体中心的算术平均,车队Yaw取主车Yaw,再把各成员世界位姿反变换为 `VehicleLayout.PoseInFleet`。它不读取通信或Detour,也不负责静止/夹紧确认、时间对齐和布局激活。
|
||
|
||
上述类目前是可以独立构造和测试的组件,并没有正式的车队任务运行入口把两条链串起来。缺少的外层需要负责布局原子激活、成员状态实际采集与时间对齐、准备/激活状态机、每周期协调、安全门控、成员命令分发、任务完成与取消。`FleetCoordinator` 生成零速或故障结果不等于实车已经停车;只有运行层把结果送到各车 `FleetMemberAgent.Execute()` 或 `Stop()` 后才会影响底盘。
|
||
|
||
实际部署为每车独立电脑,因此主车还需要状态/命令通信,从车需要本地命令超时看门狗。无线串口初始化可以后接,但消息契约、任务号、心跳/有效期和本地失联停车语义必须在运行层接入前明确。
|
||
|
||
## 状态数据流
|
||
|
||
```text
|
||
DetourInterface.getCartLocation()
|
||
→ DetourVehicleStateProvider
|
||
├─ 位姿单位转换、重复帧处理、跳变/预测残差校验
|
||
└─ VelocityEstimator2D:Detour差分Vx/Vy/Omega
|
||
|
||
MultiWheelChassis.GetCarSpeed(true)
|
||
→ WheelFeedbackVehicleStateProvider
|
||
├─ Vx、Vy分别使用同一时间常数低通滤波
|
||
├─ 轮组估计有效后覆盖Detour的Vx、Vy和Omega
|
||
└─ 保留Detour位姿
|
||
|
||
→ VehicleState(世界位姿、世界Twist、车体Twist)
|
||
→ ParkingGeometricController
|
||
```
|
||
|
||
## 运动坐标系与四轮解算数据流
|
||
|
||
`MultiWheelChassisAdapter` 对外只接收真实车体系 `Twist2D`。滚动动作开始前先固定运动方向β:
|
||
|
||
1. `ActivateMotionFrame(β)` 调用 `MultiWheelChassis.SetOriginBias(0,0,-β)`。
|
||
2. 车体线速度通过 `R(-β)` 表达到运动坐标系。
|
||
3. 运动系中以 `±ControlPointRadius` 作为虚拟前后GCP,计算GCP方向。
|
||
4. `MultiWheelChassis.SendMotion` 由两个GCP方向求瞬时旋转中心ICR。
|
||
5. 每个真实轮子的 `PhysicalPosition` 被旋转成运动系 `Position`,再由ICR分别求切线角和速度半径比例。
|
||
6. `sTh - sw.ZeroDirection` 把运动系方向转成真实舵轮机械命令;距离和速度大小不因坐标旋转改变。
|
||
|
||
关键位置:`Shared/Chassis/MultiWheelChassisAdapter.cs`、`MultiWheelChassis.cs::SetOriginBias`、`SendMotion`、`CalculateAxes`。
|
||
|
||
## 动作组织
|
||
|
||
- `PrepareWheelsForward`:停车、下发任意固定方向β并等待稳定;名称保留“Forward”,但功能已支持非零方向。
|
||
- `TrajectoryTrackingMovement`:准备运动系、创建控制器、周期执行、失败停车,可选完成后回正。
|
||
- `MultiWheelRotateInPlace`:准备自转舵角、交接到XYTh解算、世界航向PID、完成后回正。
|
||
- `MotionPlanExecutor`:开始运动前预检全部段,顺序执行 `TrackMotionPlanSegment` 和 `RotateInPlaceMotionPlanSegment`,共享状态源。
|
||
|
||
## 构建与打包
|
||
|
||
`build-and-package.ps1` 顺序构建 `CommonUsage`、M层和C层,将新 `CommonUsage.dll` 复制到 `ref/`,最后生成 `output/M` 和 `output/C`。两个部署包必须使用同一份 `CommonUsage.dll`。构建产物目录不作为知识来源,也不直接编辑。
|