Files
ParkingRobot/README.md
T

265 lines
11 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.
# MyParking 停车机器人
[简体中文](README.md) | [English](README_en.md)
## 重写路线与当前状态
本仓库是停车机器人控制软件的重写版本,研发顺序保持为:
1. 先实现单台停车机器人小车的基本功能;
2. 在单车闭环稳定后逐步增加停车作业功能;
3. 基于仿真、台架和实车数据优化轨迹跟踪方法;
4. 最后再考虑多车通信、编队和协同控制。
当前工作仍以**单车**为主,已经从基础框架搭建进入底盘联调、功能补充和跟踪实验阶段。多车配置仍位于 `PilotConfig.cs``#if false` 区域,`Shared/FleetKinematics.cs` 仍是占位文件,不能视为多车能力已经实现。
| 阶段 | 当前状态 | 说明 |
| --- | --- | --- |
| 1. 单车基本功能 | 联调中 | 已接入运动控制、MCU 通信、轮组反馈、急停 IO、电池、灯光、遥控和诊断代码,仍需持续实车验证 |
| 2. 增加停车功能 | 部分开展 | 已提供夹臂控制、限位、报警和测试入口;轮胎识别、钻车和完整停车流程尚未实现 |
| 3. 优化跟踪方法 | 已启动 | 已加入直线、圆弧、S 型、蟹行测试、实验 CSV 记录和 Python 绘图工具 |
| 4. 多车场景 | 暂不实施 | 多车参数和预研内容未参与当前编译,当前版本不提供多车联动 |
## 项目简介
MyParking 是一个面向多轮停车机器人底盘的 C# 工程,覆盖上层运动动作、共享运动学、底层硬件适配、离线 Web 仿真和实验数据分析。
核心代码分为:
- `ClumsyPilot`:Clumsy 上层动作、轨迹跟踪和人工测试;
- `MedullaAdapter`Medulla 下层 MCU、CAN、串口、轮组、夹臂、遥控和报警适配;
- `Shared`:统一的二维坐标、底盘命令、坐标变换和多轮底盘适配;
- `CommonUsage-MultiVehicleSync/commonusage`:仓库内的 `CommonUsage` 底盘公共库源码;
- `Simulation`:基于 ASP.NET Core 的单车 Web 仿真器;
- `data_process`:轨迹实验 CSV 的 Python 分析工具。
仓库中没有 ROS/ROS 2 或 Docker 配置。
## 当前已接入能力
| 模块 | 当前代码能力 |
| --- | --- |
| 单车运动 | 直线、圆弧、S 型轨迹,前进、蟹行和原地旋转 |
| 底盘命令 | `SendMotion``SendXYThSpeed` 和虚拟阿克曼测试后端 |
| 模式切换 | 正常、蟹行、自转模式;切换时先停车、预转舵轮并等待到位 |
| 跟踪控制 | 终点跟踪、直线跟踪、基于 Detour 的直线跟踪和蟹行运动坐标系跟踪 |
| 夹臂 | 左右夹臂速度命令、位置反馈、软限位、驱动报警、实体/虚拟遥控和目标位置动作 |
| MCU 通信 | 串口桥打开、复位、版本/状态查询、数字 IO、CAN/串口同步收发和异步回调 |
| 驱动与反馈 | 8 个驱动电机和 4 个舵轮的命令、速度/位置/舵角反馈及远程帧状态 |
| 车辆状态 | 急停、启停、抱闸、灯光、电池 SOC/SOH 和驱动使能状态 |
| 诊断 | CAN 轮速事件与周期快照 CSV、轨迹实验 CSV、控制命令和 Detour 位姿记录 |
| 仿真 | 浏览器二维车辆显示、模式按钮、手动控制、车辆配置、复位和 REST API |
以上表示代码和测试入口已经存在,不等同于所有工况均已完成实车验收。
## 软件架构
```text
Clumsy 宿主
ClumsyPilot ───────────────┐
│ │
▼ │ 实验 CSV
Shared / CommonUsage ├──────────► data_process
│ │
▼ │
Medulla 宿主 │
│ │
▼ │
MedullaAdapter │
│ P/Invoke │
▼ │
mcu_serial_bridge.dll │
│ │
▼ │
MCU ─► CAN / Serial / IO ──┘
Simulation ─► Shared 数据类型 ─► 浏览器仿真界面
```
`ClumsyPilot``MedullaAdapter` 生成插件类库,需要由对应宿主加载;`Simulation` 是可以独立启动的 ASP.NET Core Web 项目。
## 目录说明
```text
MyParking/
├── ParkingRobot.sln
├── ClumsyPilot/ # 上层动作、跟踪、测试和实验记录
├── MedullaAdapter/ # MCU、CAN、轮组、夹臂、遥控和报警
├── Shared/ # 共享命令、坐标变换和底盘适配
├── CommonUsage-MultiVehicleSync/
│ └── commonusage/ # CommonUsage 公共底盘库源码
├── Simulation/ # .NET 8 Web 仿真器
│ ├── Commands/ # 可由特性自动发现的仿真动作
│ ├── Core/ # 仿真车辆、舵轮、时钟和世界
│ ├── Models/ # Web API DTO
│ └── wwwroot/ # 浏览器界面
├── data_process/ # Python 实验绘图脚本
├── ref/ # 两个插件共同使用的 CommonUsage.dll
├── 测试方案.txt # 单车轨迹实验方案
├── 记录.txt # 项目调试记录
└── 电机记录.txt # 电机调试记录
```
根目录的 `ParkingRobot.sln` 当前只包含 `ClumsyPilot``MedullaAdapter``CommonUsage``Simulation` 需要分别构建。
## 开发环境与依赖
- Windows 开发/实机运行环境;
- Visual Studio 2022,或支持 .NET 8.0 和 .NET Standard 2.0 的 .NET SDK
- Python 环境,用于可选的实验数据绘图;
- Clumsy/Medulla 内部框架程序集,位于各项目的 `ref` 目录;
- 实机所需的 `mcu_serial_bridge.dll`,当前仓库中未包含该文件;
- 能够加载 `ClumsyPilot.dll``MedullaAdapter.dll` 的匹配版本宿主程序,当前仓库中未包含宿主。
主要 NuGet/Python 依赖:
- `ClumsyPilot``Newtonsoft.Json 13.0.3``System.Numerics.Vectors 4.6.1`
- `CommonUsage``MQTTnet 4.3.7.1207``Newtonsoft.Json 13.0.3` 等;
- `data_process`NumPy、pandas、Matplotlib、SciPy。
## 编译
### 1. 构建 CommonUsage
修改公共底盘库后,先执行:
```powershell
dotnet restore CommonUsage-MultiVehicleSync\commonusage\CommonUsage.csproj
dotnet build CommonUsage-MultiVehicleSync\commonusage\CommonUsage.csproj -c Debug
```
该项目的构建目标会把生成的 `CommonUsage.dll` 复制到根目录 `ref`
### 2. 构建实车插件
```powershell
dotnet restore ParkingRobot.sln
dotnet build ParkingRobot.sln -c Debug
```
主要输出:
```text
ClumsyPilot/build/Clumsy/ClumsyPilot.dll
MedullaAdapter/build/Medulla/plugins/MedullaAdapter.dll
```
### 3. 构建 Web 仿真器
```powershell
dotnet restore Simulation\MyParking.Simulation.csproj
dotnet build Simulation\MyParking.Simulation.csproj -c Debug
```
## 启动 Web 仿真
```powershell
dotnet run --project Simulation\MyParking.Simulation.csproj --launch-profile http
```
浏览器访问:
```text
http://localhost:5203
```
仿真界面提供正常、左蟹行、右蟹行、自转、前进、后退、左转、右转、停止和复位动作,并可修改车辆布局及手动控制输入。主要 API 包括:
- `GET /api/vehicles`
- `GET /api/actions`
- `GET/POST /api/configuration`
- `POST /api/vehicles/{vehicleId}/commands/{command}`
- `POST /api/vehicles/{vehicleId}/manual-control`
- `POST /api/reset`
`Simulation/Commands/MySimulationTests.cs` 给出了自定义仿真动作示例;为静态方法添加 `SimulationAction` 特性后,调度器会自动发现并在网页生成对应动作。
## 实车运行与 MCU 配置
实车插件不能通过 `dotnet run` 独立启动。需要由匹配版本的 Clumsy/Medulla 宿主加载两个 DLL。宿主版本、部署目录和完整启动步骤尚未随仓库提供,待补充。
当前源码中的 MCU 默认参数:
| 参数 | 默认值 |
| --- | --- |
| MCU 端口 | `COM4` |
| MCU 连接波特率 | `1000000` |
| CAN | 1 路,`500000 bit/s`,重试时间 `10 ms` |
| 串口 | 3 路,`9600 bit/s`,接收帧时间 `10 ms` |
| 电池通信端口索引 | `3` |
| 自转最大角速度 | `30 deg/s` |
| 轮速诊断目录 | `logs\wheel-speed` |
当前工作区存在 `chassis.json` 底盘参数样例,但源码中尚未发现自动加载该文件的入口;实车参数仍应以宿主实际配置为准。
实机测试前必须确认端口、车号、舵轮零位与限位、速度单位、驱动方向、夹臂限位和急停链路。建议先架空驱动轮或在隔离区域低速测试,并保留独立可靠的物理急停,不能只依赖软件停车。
## 单车测试入口
`ClumsyPilot/MovementTests.cs` 当前注册:
- `准备:四个舵轮与车头方向一致`
- `SendMotion:连续前进4m`
- `SendXYThSpeed:原地自转90°`
- `SendXYThSpeed:原地自转180°`
- `SendMotion:左转90°半径2m圆弧`
- `SendMotion:蟹行直线4m`
- `SendMotion:蟹行左转90°半径2m圆弧`
- `SendMotion4m S型曲线`
- `夹臂关闭测试`
- `夹臂启动测试`
这些测试由 Clumsy 宿主的测试界面执行,并不是 `dotnet test` 自动化测试。运动测试会按配置记录实验编号、参考轨迹、Detour 位姿和控制命令。
## 实验数据分析
轨迹记录器默认把 CSV 保存到宿主程序目录下的:
```text
TrackingExperiments/
```
Medulla 的轮速诊断可通过 `StartWheelSpeedDiagnostic` / `StopWheelSpeedDiagnostic` 操作按钮控制,默认输出到:
```text
logs/wheel-speed/
```
在自行管理的 Python 环境中安装依赖:
```powershell
python -m pip install -r data_process\requirements.txt
```
对一份或多份轨迹 CSV 同时生成轨迹对比、跟踪误差、速度响应和角速度命令图:
```powershell
python data_process\run_all_plots.py "路径\实验1.csv" "路径\实验2.csv" --output-dir "路径\plots"
```
不传 CSV 路径时,脚本会查找 `data_process` 目录中的 CSV。默认重采样频率为 `20 Hz`,滤波窗口为 `0.55 s`,可通过 `--frequency``--window` 调整。
## 尚未完成或需要继续验证
- 雷达点云、轮胎识别、自动钻车、车辆释放和完整停车作业状态机;
- 当前运动和夹臂功能的完整实车验收、故障注入及长期稳定性测试;
- 舵轮软限位预测和自动车身重定向;`SteeringConstraintManager.cs` 当前主要是设计记录;
- 自动化单元测试和持续集成;
- 多车通信、编队、同步和安全降级;`FleetKinematics.cs` 当前仅为占位;
- 宿主版本、插件部署目录、配置文件位置和发布流程。
## 参与开发
1. 当前改动优先服务于单车闭环、停车功能和跟踪质量,不提前启用多车代码;
2. 保持上层动作、共享运动学、底层硬件协议和仿真模块的边界;
3. 新增参数时注明坐标系、单位、默认值、车型和安全范围;
4. 提交前构建受影响的项目,并记录仿真、台架或实车验证条件;
5. 修改 `CommonUsage` 后同步更新根目录 `ref/CommonUsage.dll`
6. 分支、评审和发布流程待团队补充。
## 许可证
仓库中暂未提供许可证文件。使用和分发范围请遵循公司内部规定。