## 8cbf Thu Jul 23 13:05:24 2026 +0800
refactor: 碰撞检测重构, AABB包围盒+静态动作快速比较+窗口扫描+有序剪枝


## c051 Tue Jul 21 16:47:46 2026 +0800
fix: popDiverseCandidate 可能返回 nil
feat: 添加多样性超参数 PLANNER_DIVERSITY_TOP_N=10, PLANNER_DIVERSITY_MIN_NOVELTY=0.25
feat: 新增 /api/v1/debug-paths, 提供点到点路径查询
refactor: 路径缓存存储压缩路径以大幅降低内存占用


## d109 Mon Jul 20 22:43:08 2026 +0800
refactor: SceneModel核心字段封装私有化，新增公开访问器方法


## dd49 Mon Jul 20 22:06:52 2026 +0800
refactor: dijkstraTo升级A*组合优化 + Point2PointPathSet改造为LRU缓存


## 8693 Mon Jul 20 21:18:50 2026 +0800
refactor: SceneModel距离计算改为实时Dijkstra+LRU+永久distMap，移除全源预计算矩阵


## 2a62 Sun Jul 19 22:16:12 2026 +0800
feat: map_point 新增 allowed_vehicle_types 字段，支持点级别车型兼容性过滤
    - schema.sql: map_point 表添加 allowed_vehicle_types 字段
    - models.go: MapPoint 结构体新增 AllowedVehicleTypes 字段
    - point.sql.go: GetPointByID/ListPointsBySceneID 查询同步新字段
    - scene.go: PointModel 新增 AllowedModels 属性及 Allow 方法
    - loader.go: 新增 tMapPointWithModels，加载时解析车型并按车型过滤点


## d248 Thu Jul 16 17:24:43 2026 +0800
fix: NewMovingPlan2末尾STAY积累问题
    - best/v3/MovingPlan.go: 当末位已是MOVING_WAIT时直接延长TimeTo
      而非追加新STAY，避免旧规划复用场景下moves线性增长


## e7ff Thu Jul 16 13:08:37 2026 +0800
fix: 移动/旋转状态无绑定规划时由Panic改为容错恢复
    - best/v3/api/solve_v2.go: log.Panicf改为log.Printf，清理规划并设Status_Error
    - .qoder/repowiki: 知识文档结构重组


## 8531 Tue Jul 14 17:20:40 2026 +0800
fix: 泊车点可用性判断加强安全保守策略
    - best/v3/api/parkable_v1.go: parkingPoint为nil时改为return false
    - best/v3/api/parkable_v1.go: 友车目标距泊车点过近改为return false（原continue跳过）
    - best/v3/common.go: IsParkingPointAvailable同步改为return false
    - best/v3/api/parkable_v1.go: 增加详细日志便于问题排查
    - .qoder/repowiki: 泊车点选择文档重组


## 13f1 Tue Jul 14 08:46:40 2026 +0800
refactor: 统一Parkable与PickParkingPoint的泊车点可用性判断逻辑
    - best/v3/common.go: 新增collectParkedPeersForAgents/IsParkingPointAvailable共享函数
    - best/v3/common.go: PickParkingPoint改为调用IsParkingPointAvailable替换内联逻辑
    - best/v3/common.go: collectParkedPeersForAgents增加移动中友车跳过逻辑
    - best/v3/api/parkable_v1.go: Parkable新增友车目标距离太近跳过逻辑
    - best/v3/api/parkable_v1.go: Parkable检查2增加最近阻挡者判断避免误拦
    - .qoder/repowiki: 更新知识文档索引与版本历史


## 772a Mon Jul 13 22:56:02 2026 +0800
fix: collectParkedPeers, sceneID参数错误


## 4552 Mon Jul 13 20:17:42 2026 +0800
fix: 修复Parkable集体阻挡死锁检测
    - best/v3/api/parkable_v1.go:
      ParkableRequest新增Position字段用于自可达性检查
      FriendAgent移除未使用的ModelID字段
      修复collectParkedPeers错误调用GetScene的bug
      Parkable新增集体阻挡检查(检查2)和自可达性检查(检查3)
    - best/v3/common.go:
      新增pathBlockedBySet和IsParkingPointCollectivelyBlocksAgent
      解决巷道两端多车泊车时检测不到死锁的问题


## e5c5 Mon Jul 13 11:41:52 2026 +0800
refactor: idle agent 发呆超时检测与环境变量提取
    - best/v3/api/solve_v2.go: 增加 idle agent 发呆超时检测逻辑（MovingAction 过期超 3 秒时清除失效规划）
    - common/env.go: 新增 IdleActionTimeout 环境变量配置（PLANNER_IDLE_ACTION_TIMEOUT，默认 3.0 秒）
    - best/v3/api/solve_v2.go: 魔法数字 3.0 替换为 common.IdleActionTimeout


## 42b6 Mon Jul 13 11:23:54 2026 +0800
fix: PointModel.CheckpointFlag, CheckpointAngles 未赋值
    - service/loader/loader.go: CheckpointFlag、CheckpointAngles 字段加载时正确赋值
    - best/v3/MovingPlan.go: 首段终点的检查点判定改用 ChecksAngle 替代直接检查 CheckpointFlag


## 9f9ee Thu Jul 09 23:28:43 2026 +0800
feat: 新增实时碰撞检测API /api/v1/detect 及导出 MapAgentState
    - best/v3/api/detect_v2.go: 新增 detectCollisions 纯函数（moving agent 成对时空碰撞检测）
    - best/v3/api/detect_v2.go: 新增 handleDetect HTTP handler
    - best/v3/api/listen.go: 注册 /api/v1/detect 路由
    - best/v3/api/plan.go: mapAgentState 改为导出方法 MapAgentState，加入 IPlanningService 接口


## 6ad3 Tue Jul 7 10:00:21 2026 +0800
feat: loader.go, 加载默认车型0


## f492 Wed Jul 2 23:45:10 2026 +0800
feat: 老规划复用优化与 NewMovingPlan2 守卫条件
    - solve_v2: 优先检查老规划是否仍可走，通过 HasConflict 验证后直接复用
    - solve_v2: 裁剪已完成动作，提取剩余步骤生成 oldPlan
    - solve_v2: 新规划和泊车规划加 plan==nil||!ok 守卫，避免覆盖有效规划
    - MovingPlan: 追加 WAIT 动作前检查 finalMove.TimeTo < MaxTimeTick


## bd88 Thu Jul 2 16:57:06 2026 +0800
refactor: handlePlan迁移至plan.go，放宽ModelID校验
    - best/v3/api/listen.go: 移除handlePlan函数及冗余import
    - best/v3/api/plan.go: 新增handlePlan函数，补充所需import
    - best/v3/api/cancel_v1.go: ModelID校验从<=0改为<0，允许默认车型0
    - best/v3/api/parkable_v1.go: ModelID校验从<=0改为<0，允许默认车型0

    
## f302 Tue Jun 30 23:26:29 2026 +0800
refactor: 提取Agent构造函数NewAgent
    - best/v3/agent.go: 新增 NewAgent(id int) 构造函数
    - best/v3/api/plan.go: mapAgentState 改用 NewAgent 创建实例


## c9e1 Tue Jun 30 23:18:07 2026 +0800
refactor: 从全局速度常量迁移至按路径/车型细粒度速度控制
    - common/env.go: 新增 ModelAccSpeeds map 及 ParseModelAccSpeeds/GetAccSpeedByModelID
    - best/v3/agent.go: 移除 MaxSpeed 字段，废弃旧 Action 引用
    - best/v3/action.go: 彻底删除废弃的旧 Action 类型体系（~300行）
    - best/v3/ActionString.go: MovingAction 新增 Speed JSON 字段
    - best/v3/MovingPlan.go: MovingAction 新增 Speed，时间计算从 agent.MaxSpeed 迁移至 moving.Speed
    - best/scene.go: PathModel 新增 Speed float64 字段
    - service/loader/loader.go: 从数据库加载 HeadSpeed/BackSpeed 设置到 PathModel.Speed
    - best/v3/moving.go: GetMovingPosition/GetMovingDuration/GetMovingTimeCost 增加 a<=0||maxv<=0 防护
    - 测试文件适配 Agent MaxSpeed 字段移除

    
## ff36 Tue Jun 30 22:01:36 2026 +0800
feat(loader): 增强场景加载时的车型过滤功能
    - 提前收集所有车型ID到modelSet，同时从locations和paths提取
    - Fill方法增加空字符串检查，避免解析空AllowedVehicleTypes
    - AllowModel方法增加modelID==0判断，0表示允许所有车型
    - charging-area/replacing-area点根据车型兼容性过滤
    - parking-area的ParkingFlag跟随车型兼容性结果
    - 增加调试日志方便排查问题

    
## 9f85 Mon Jun 29 21:10:20 2026 +0800
feat: 添加检查点(Checkpoint)支持，路径在检查点处切分
    - PointModel 新增 CheckpointFlag / CheckpointAngles 字段
    - 新增 ChecksAngle 方法判断指定朝向是否需要停车检查
    - PathModel 新增 PointingAngle 方法计算路径朝向角度
    - MergePathsToActions 重构，在检查点处自动切分 MOVE 动作
    - 新增 NormalizeAngle180 工具函数（common包 float64版 / v3包 int版）


## e091 Mon Jun 29 20:06:31 2026 +0800
重构场景加载服务，统一类型并封装车型过滤逻辑
    - sqlc(location.sql.go): JOIN查询增加allowed_vehicle_types字段，支持车型过滤
    - schema: 新增allowed_vehicle_types列定义
    - loader: AllowedVehicleTypes解析提取为Fill()/AllowModel()方法，消除重复解析
    - loader: sceneID/modelID类型从int64统一为int，减少类型转换
    - loader: db.MapPath/db.ListLocationsBySceneIDRow替换为本地包装类型
    - api: 适配GetScene签名变更(cancel_v1, parkable_v1, solve_v2)


## 8fb3 Fri Jun 26 22:08:31 2026 +0800
refactor: 使用对角线半径替代 ChassisLength/2 作为旋转半径
    - Agent 新增 ChassisRadius 字段和 GetChassisRadius() 方法
    - 旋转半径按 sqrt(L²+W²)/2 计算，覆盖更准确的车辆包络
    - GetTimedSpaces 和 GetRotateRectangle 统一调用 GetChassisRadius()

    
## 5d83 Fri Jun 26 14:18:49 2026 +0800
refactor(loader): 车型列表改为从 map_path.allowed_vehicle_types 提取，移除 agv_robot 依赖
    - loader.reloadScene: 不再查询 agv_robot 表，改为从 paths 的
      allowed_vehicle_types 字段聚合去重得到车型列表；无车型时加载
      默认车型(modelID=0)
    - loader.GetScene: 增加 fallback，先查指定车型缓存，未命中则
      回退到默认车型(modelID=0)缓存
    - api/cancel_v1: CancelRequest 字段类型 int→int64，新增 ModelID
      字段；handleCancel 增加 scene_id/model_id/agent_id 参数校验
    - api/parkable_v1: ParkableRequest/FriendAgent 字段类型 int→int64；
      handleParkable 增加参数校验
    - api/listen: handlePlan 增加 sce


## b26d Fri Jun 26 00:40:21 2026 +0800
feat: 新增 agv_robot 表及 sceneCache 多车型缓存支持
    
    数据库层
    - schema: map_path 新增 head_radar_length/back_radar_length/head_shelf_direction/back_shelf_direction/allowed_vehicle_types 字段
    - schema: 新增 agv_robot 表（机器人信息）
    - queries: 新增 robot.sql（GetRobotByID/GetRobotBySN/ListRobotsBySceneID/ListRobots/CountRobotsBySceneID）
    - models: MapPath 新增5字段，新增 AgvRobot 结构体
    - path.sql.go / robot.sql.go: sqlc 重新生成
    
    场景加载服务
    - loader: sceneCache key 由 int64(sceneID) 改为 string(sceneID:modelID)，支持按车型独立缓存场景模型
    - loader: GetScene 接口新增 modelID 参数，按 sceneID:modelID 精确获取对应车型的场景数据
    - loader: checkAndReloadScene 按 sceneID 前缀扫描缓存比对 UpdateTime
    
    API 层
    - PlanningRequest: 新增 ModelId 字段
    - ParkableRequest: 新增 ModelID 字段
    - solve_v2 / cancel_v1 / parkable_v1: GetScene 调用同步传入 modelID


## ccfa Mon Jun 22 16:49:48 2026 +0800
feat(api): 新增 /api/v1/cancel 取消规划接口
    - 新增 cancel_v1.go：实现 CancelRequest/CancelResponse 结构体、handleCancel HTTP 处理器及 Cancel 规划取消逻辑
    - listen.go：将 handleParkable/handleCancel 拆分至独立文件，仅保留 handlePlan 和路由注册
    - parkable_v1.go：补充 Parkable 请求/响应结构体及 handleParkable 实现
    - plan.go：补充相关注释

## 1675 Fri Jun 5 09:01:38 2026 +0800
refactor: PickParkingPoint 改用 DistanceTo 替代 GetMapDistance
    将距离检测从基于场景地图的 GetMapDistance 替换为点对点直接距离
    计算 DistanceTo，简化逻辑并提升性能

feat: SafeParkingDistance 提取为环境变量，pathContainsPoint 增加距离检测
    - common/env.go 新增 SafeParkingDistance 环境变量(默认1.8)
    - options.go SafeParkingDistance 改从 common 读取，移除硬编码
    - common.go pathContainsPoint 参数从 pointID 改为 PointModel，增加 SafeParkingDistance 距离检测
    - 更新相关文档

    
## 3af7 Thu Jun 4 16:41:46 2026 +0800
refactor: 优化 CalcHeading 方向判定逻辑并简化日志输出
    - CalcHeading 移除固定 miss 阈值，改用 dx/dy 直接比较判定方向，更加直观可靠
    - logging.go 移除 log.Lshortfile 标记，简化日志输出格式
    - 更新相关文档


## f0aa Wed Jun 3 16:35:11 2026 +0800
feat: 新增车型ID及路径车型兼容性支持
   - PathModel 新增 AllowedModels 字段及 Allow 方法，支持限制路径允许通过的车型
   - Agent / AgentState 新增 ModelID 字段，标记 AGV 车型
   - 废弃 BuildPoint2PointPathSet 函数（注释化处理）
   - 更新相关文档


## 3d68 Tue May 26 13:55:19 2026 +0800
refactor: 日志保留时间从天改为小时单位；路径排序后提取结果
- common/env.go: LogRetentionDays → LogRetentionHours，环境变量改为 PLANNER_LOG_RETENTION_HOURS(默认24)
- logging/logging.go: 适配 LogRetentionHours 直接使用，移除 *24 转换
- sceneFindPossiblePaths.go: 排序后通过 lo.Map 提取路径结果回填 pathList


## e604 Tue May 26 11:52:25 2026 +0800
feat: 添加路径旋转成本计算与排序功能
- Headings 新增 TurningCost 方法，计算两朝向间的旋转角度差(0-180°)
- sceneFindPossiblePaths 新增 SumPathWeightWithRotation 函数，计算路径综合权重(长度+旋转成本)
- GetCachedPaths 增加旋转成本排序，优先选择转弯少的路径
- 新增 PathWeightWithRotation 结构体及 gTurnCostFactor 旋转成本因子
- 更新相关文档


## 6404 Mon May 25 20:21:07 2026 +0800
feat: 新增避让级别4.0/5.0及MaxXYMiss环境变量配置
- 新增 PaddingLevel_4_0 和 PaddingLevel_5_0 避让级别
- 新增 PlanningPadding_4_0 和 PlanningPadding_5_0 配置项
- 调整规划避让级别和泊车避让级别的默认值
- 将 scene.go 中的 miss 容错值从 0.1 调整为 0.3 并提取为环境变量 MaxXYMiss
- 更新相关文档


## fae5 Thu May 21 16:44:51 2026 +0800
fix: RecalibrateMovingTimeline 以 reportTime 为锚点推算时间戳
- MovingPlan.go: elapsedTime 基于 reportTime 时的坐标推算，TimeFrom/To 锚定到 reportTime 而非 currentTime
- plan.go: 调用处传入 reportTime = state.Timestamp / 1000
- repowiki: 同步更新 API 接口文档


## e040 Wed May 20 11:40:22 2026 +0800
feat: 新增 ParkOnly 规划模式，支持仅泊车不规划移动路径
- plan.go: PlanningRequest 新增 ParkOnly 字段
- solve_v2.go: ParkOnly=true 时跳过移动路径规划，仅执行泊车逻辑


## 91d6 Wed May 20 10:26:31 2026 +0800
fix: 旋转动作耗时根据角度选择，注释旋转时间线校准代码
- NewMovingPlan2: 根据 HeadingFrom/HeadingTo 最小旋转角度(90°/180°)选择 RotateSeconds_90/_180
- RecalibrateRotatingTimeline: 注释旋转校准代码（旋转非线性过程导致校准不准确）


## 2f27 Mon May 18 08:50:13 2026 +0800
添加 env.LogRetentionDays 默认3天


## f1b6 Fri May 15 14:43:57 2026 +0800
新增 ggGarbleBuild.sh 使用 garble 安全发布


## 74cf Fri May 15 13:06:42 2026 +0800
refactor: 拆分旋转耗时配置，清理废弃代码，更新日志标签逻辑

- common/env.go: RotateSeconds 拆分为 RotateSeconds_90(6s)/_180(10s) 独立配置
- best/v3/MovingPlan.go: 旋转动作根据 HeadingFrom/To 最小角度选择对应耗时
- best/v3/api/plan.go: 移除废弃的 newMovingPlan 函数
- 废弃文件迁移为 .go.txt 归档（TestScene189.go, solve.go, step.go, upq.go）
- tests/goTaggedLogs_test.go: 中间日志行使用当前 Plan Input 的 agentId 标记
- docs: 更新碰撞案例文档（2026-05-15a, 2026-05-15b）


## 8ba0 Fri May 15 11:03:51 2026 +0800
debug: 启用 mapAgentState 日志输出，新增对头碰撞测试案例及日志标签工具
- best/v3/api/plan.go: 取消 mapAgentState 中 action/plan 调试日志注释
- docs: 新增 2026-05-15 天津万事场景 841/842 对头碰撞案例文档
- tests: 新增 goTaggedLogs_test.go 日志标签工具，支持按 agent 过滤日志行

## 56de Thu May 14 09:14:06 2026 +0800
feat: 新增 ParkNearGoal 泊车控制选项，支持就近泊车策略
- common/env.go: 新增 GetEnvBool 辅助函数，解析布尔型环境变量
- common/env.go: 新增 PLANNER_PARK_NEAR_GOAL 环境变量，默认 true
- best/v3/common.go: PickParkingPoint 根据 ParkNearGoal 控制泊车行为
- ParkNearGoal=true（默认）: 在目标点附近泊车，保留原逻辑
- ParkNearGoal=false: 在 AGV 当前位置附近就近泊车

## 5086 Tue May 12 19:37:24 2026 +0800
精简日志 减少io压力

## a536 Tue May 12 16:33:58 2026 +0800
优化寻路算法, 大幅提升查找效率

## 309f Mon May 11 22:52:30 2026 +0800
logging.go 改为按小时轮切,以便快速定位

## ed3a Mon May 11 22:35:48 2026 +0800
在 logging.go 中引入了异步 + 大缓冲区的日志写入方案

## 02cb Sun May 3 23:06:11 2026 +0800
参数化旋转耗时：新增RotateSeconds环境变量替代硬编码gRotateTicks

## d331 Mon Apr 27 21:09:08 2026 +0800
切换测试场景至563号：更新测试用例、WatchScenes配置及方向判断逻辑

## c71b Thu Apr 23 23:20:39 2026 +0800
优化友车等待状态处理：将MOVING_WAIT动作截止时间设为无穷大

## b920 Thu Apr 23 22:01:30 2026 +0800
添加GetCachedPaths性能监控日志：记录路径搜索耗时和结果数量
重构泊车阻塞检测逻辑：提取IsParkingPointBlocksAgent到公共模块并集成到PickParkingPoint

## f829 Thu Apr 23 17:42:56 2026 +0800
优化日志输出：精简请求日志格式，移除冗余日志打印

## 93dc Thu Apr 23 15:57:53 2026 +0800
新增泊车可行性判断API：实现Parkable函数与HTTP接口，参数化最大路径搜索数

## 416a Thu Apr 23 15:23:28 2026 +0800
参数化避障距离：将硬编码的雷达避障距离迁移到环境变量，启用空间碰撞调试日志，更新测试用例

## 4955 Mon Apr 20 23:36:07 2026 +0800
优化泊车规划：添加AGV已在目标点的等待逻辑，新增NewWaitingPlan方法

## 1d3b Mon Apr 20 22:55:46 2026 +0800
优化路径规划和泊车逻辑：改进点索引算法，增加AGV可移动状态检查，简化泊车点筛选

## 8a9c Mon Apr 20 18:41:25 2026 +0800
优化场景加载服务：改进时间戳比较逻辑，增加检查计数器日志，清理冗余调试输出

## db44 Mon Apr 20 17:13:20 2026 +0800
优化泊车点查找：添加排除列表过滤和空值检查，增强健壮性

## 6ece Mon Apr 20 17:00:44 2026 +0800
重构泊车点管理：将可泊车点从全局配置迁移到场景模型，优化泊车点查找逻辑

## 357b Mon Apr 20 16:49:16 2026 +0800
优化路径规划逻辑：简化Heading转向判断，移除冗余的ChasHeading字段，改进移动动作合并算法


## 1fb0 Mon Apr 20 16:32:53 2026 +0800
fix: correct heading direction at 270 degrees; add scene 559 to watch list; add debug logging


## bc1e Mon Apr 20 15:49:56 2026 +0800
feat: add path direction flags (HeadFlag/BackFlag) to scene model


## 58e2 Mon Apr 20 13:45:21 2026 +0800
feat: 优化路径规划和求解器实现


## a243 Mon Apr 20 12:50:17 2026 +0800
docs: 更新场景加载服务文档


## 9f39 Mon Apr 20 11:58:39 2026 +0800
feat: 添加ListenPort环境变量配置支持
   - common/env.go: 新增 PLANNER_LISTEN_PORT 环境变量配置（默认8080）
   - main.go: 使用 common.ListenPort 作为监听端口
   - service/loader/loader.go: 使用 common.ListenPort


## 320b Mon Apr 20 11:09:43 2026 +0800
feat: 添加环境变量配置模块，支持数据库连接和场景热更新
   - 新增 common/env.go 模块，提供 GetEnv/GetEnvInt 函数
   - 添加数据库连接相关环境变量：DB_HOST, DB_PORT, DB_USER, DB_PASS, DB_NAME
   - 添加场景观察功能：PLANNER_WATCH_SCENES
   - 更新 db/connect.go 使用环境变量配置
   - 更新 versions/versions.go 添加环境变量文档


## 9775 Mon Apr 20 10:56:22 2026 +0800
fix: 修复rotatelogs错误检查顺序并完善loader服务测试
   - 修复SA5001警告：在defer之前检查rotatelogs.New()的错误
   - 完善测试用例：更新测试场景点和路径查找逻辑
   - 添加详细的日志输出便于调试
   - 添加环境变量：
      - PLANNER_WATCH_SCENES
      - PLANNER_DB_HOST
      - PLANNER_DB_PORT
      - PLANNER_DB_USER
      - PLANNER_DB_PASS
      - PLANNER_DB_NAME


## 1d5a Sun Feb 15 23:32:47 2026 +0800
fix(solve): Wait状态判断改用TimeFrom+1s


## df12 Sun Feb 15 17:08:04 2026 +0800
feat(api): 标记SolveV1废弃，完善注释，实现急停逻辑


## 2eb3 Sun Feb 15 13:51:00 2026 +0800
feat(test): 日志输出改为按小时滚动,保留7天


## 2034 Tue Feb 10 15:46:05 2026 +0800
fix(api): 修复软急停碰撞检测使用错误字段，改用MovingAction


## 20a5 Tue Feb 10 12:34:58 2026 +0800
refactor(v3): 优化Padding策略和泊车点选择逻辑
- solve_v2.go: 移动规划增加2.5s中等避让级别，泊车规划降为2.0s
- common.go: 泊车点选择优先基于当前位置而非目标位置


## f75a Tue Feb 10 12:20:34 2026 +0800
refactor(api): 简化碰撞检测逻辑并重命名Stops字段

主要变更：
1. solve_v2.go: 注释掉Action碰撞复核逻辑
   - 移除首次移动时的额外碰撞检测（第110-132行）
   - 简化规划流程，依赖主路径规划阶段的碰撞检测

2. plan.go & solve_v2.go: 重命名字段
   - SoftStops → Stops (更简洁的命名)
   - 保持原有功能：规划失败时返回需要急停的友车列表

技术背景：
- 移除重复的碰撞检测逻辑，避免过度保守的规划策略
- 主路径规划阶段(GenMovingPlan/GenParkingPlan)已包含充分的碰撞检测
- 首动作碰撞复核可能导致过多的规划失败，影响系统流畅性

影响范围：
- 规划成功率可能提升
- 需要通过实际测试验证安全性

## 2d61 Tue Feb 10 11:01:31 2026 +0800
fix(planning): 规划失败时增加友车碰撞检测和软急停机制

主要变更：
- solve_v2.go: 路径规划失败时检测2秒内可能发生碰撞的Moving友车
- solve_v2.go: 新增NewWaitWithStopsResponse函数，支持返回SoftStops列表
- plan.go: PlanningResponse新增SoftStops字段用于软急停控制
- TimedRectangle.go: 新增Overlaps方法用于空间碰撞检测
- 优化日志输出，添加code=128/158/169错误码标识便于问题定位

问题修复：
- 解决760旋转发呆时761从上方下来撞击的问题
- 当AGV规划失败时，主动检测并停止可能碰撞的友车

测试：
- 更新V3_plan_conflict_test.go测试用例

文档：
- 新增260208c案例文档记录问题现象和解决方案


## f771 Sun Feb 8 17:09:22 2026 +0800
refactor(planning): 优化padding级别配置策略并添加新碰撞案例

- 重构solve_v2.go中的padding配置方法：
  * 将GetPlanningPaddings拆分为GetMovingPaddings和GetParkingPaddings
  * 简化移动规划padding级别为[3.0, 2.0]
  * 泊车规划使用专用的3.0s padding级别
- 添加260208b碰撞案例文档和相关图片
- 记录761因规划耗时1秒导致调度器卡顿，760状态更新滞后的碰撞问题

此变更优化了padding配置的精细化管理，提高了规划算法的适应性

## 2eb8 Sun Feb 8 15:55:32 2026 +0800
feat(planning): 优化padding级别配置并完善碰撞案例文档

- 在solve_v2.go中新增GetPlanningPaddings()和GetFirstMovePadding()配置方法
- 将硬编码的padding级别替换为可配置的服务方法调用
- 优化首次移动碰撞复核逻辑，添加break语句提高效率
- 增强日志信息，使用WARNING级别标识规划失败情况
- 添加260208a碰撞案例的完整文档和相关图片
- 记录并分析760因padding配置不当导致路径规划失败的问题

该变更解决了761撞击760的碰撞问题，优化了规划算法的鲁棒性


## 4eb4 Sun Feb 8 11:48:56 2026 +0800
refactor(v3): 重构Action系统为MovingAction并修复碰撞检测bug
主要变更：
- 将agent.Action完全替换为agent.MovingAction
- 修复solve_v2.go中碰撞检测逻辑错误，正确使用MovingAction
- 为MovingAction添加完整的RecalibrateMovingTimeline和RecalibrateRotatingTimeline方法
- 重构PaddingLevel系统，新增3.0s/2.5s级别，移除0.5s/0.3s级别
- 标准化MOVING_NONE枚举值字符串表示为"None"

修复的关键bug：
- solve_v2.go第98行：碰撞检测过滤条件从it.Action改为it.MovingAction
- 确保MovingAction与旧Action系统的兼容性和平滑过渡

此次重构提升了系统的准确性和稳定性，解决了潜在的碰撞检测失效问题。


## 5c18 Sun Feb 8 10:47:30 2026 +0800
- fix(planning): 修复761旋转延迟导致的碰撞问题并完善案例文档
    - 修正plan.go中旋转动作的时间线校准函数调用错误
    - 注释掉solve_v2.go中基于友车状态的parking策略优化逻辑
    - 添加260207a碰撞案例的详细文档和相关图片
    - 包含完整的调试日志和问题根因分析
   
    该变更解决了760提前出发撞击正在旋转的761的问题


## d706 Sat Feb 7 11:58:53 2026 +0800
refactor: 优化 Padding 配置体系并增强状态一致性检测

主要变更内容：
1. Padding 配置重构 (Padding Configuration):
   - 修改 'best/v3/options.go'：
     - 将原有的 Max/Medium/Min 三级命名改为基于时间值的命名（2.0s/1.5s/1.0s/0.5s），更加直观和语义化。
     - 新增 'PlanningPadding_1_5' 配置（1.5秒，0.5米空间边距）。
     - 统一空间边距为 0.5 米，简化参数调优。
     - 移除 'CheckingPadding' 配置，统一使用 'PlanningPadding_0_5' 替代。
   - 修改 'best/v3/api/PaddingLevel.go'：
     - 将枚举常量从 'PaddingLevelMax/Medium/Min' 重命名为 'PaddingLevel_2_0/1_5/1_0/0_5'。
     - 更新 'AllPaddingLevels()' 返回顺序为从大到小（2.0 → 1.5 → 1.0 → 0.5）。
     - 'String()' 方法返回更直观的时间表示（如 "2.0s"）。
   - 修改 'best/v3/step.go'：将冲突检测统一使用 'PlanningPadding_2_0'。
   - 修改 'best/v3/solve.go'：将碰撞检测从 'CheckingPadding' 迁移到 'PlanningPadding_0_5'。

2. 动态 Padding 选择策略 (Dynamic Padding Strategy):
   - 修改 'best/v3/api/solve_v2.go'：
     - 新增友车运动状态检测逻辑：判断是否有友车处于 'Status_Moving' 或 'Status_Rotating' 状态。
     - 当有友车在移动时，只使用较大的 Padding（>= 1.0s），确保安全性。
     - 当所有友车都空闲时，允许使用全部 Padding 级别（包括 0.5s），提升规划灵活性。

3. 状态一致性修复 (State Consistency Fix):
   - 修改 'best/v3/api/plan.go'：
     - 在 'mapAgentState' 中新增状态矫正逻辑：当 AGV 报告状态为 IDLE，但在过去 1 秒内曾下发过 MOVE/ROTATE 指令时，主动将状态矫正为 Moving/Rotating。
     - 解决了 AGV 上报状态滞后导致的规划过于激进的问题（见案例 260206c）。
     - 增加注释说明坐标获取逻辑。

4. 案例文档更新 (Documentation):
   - 修改 'docs/cases/260206c/readme.md'：补充了问题原因分析和解决措施说明。

相关文件：
- best/v3/options.go
- best/v3/api/PaddingLevel.go
- best/v3/api/plan.go
- best/v3/api/solve_v2.go
- best/v3/step.go
- best/v3/solve.go
- docs/cases/260206c/readme.md

## 350bc6ed12b86e24f3d6078aec6f610cc46c2765 (HEAD -> master)
Author: ioly <794565796@qq.com>
Date:   Fri Feb 6 19:49:06 2026 +0800

    feat: 实现动作序号跟踪与旋转时间线校准功能
    
    主要变更内容：
    
    1. 动作序号机制 (Action Numbering):
       - 修改 'best/v3/action.go'：在 'Action' 结构体中新增 'ActionNO' 字段，用于标识动作在规划序列中的位置。
       - 修改 'best/v3/MovingPlan.go'：
         - 在 'MovingAction' 结构体中新增 'ActionNO' 字段。
         - 在 'NewMovingPlan2' 中自动为每个动作分配序号（从 0 开始递增）。
       - 修改 'best/v3/ActionString.go'：
         - 在 'ActionString' 结构体中新增 'ActionNO' 字段，支持动作序号的序列化与反序列化。
         - 在 'FillAction'、'FillMovingAction'、'ToAction' 和 'ToMovingAction' 方法中同步 'ActionNO' 字段。
    
    2. 时间线校准优化 (Timeline Recalibration):
       - 修改 'best/v3/action.go'：
         - 将 'RecalibrateTimeline' 重命名为 'RecalibrateMovingTimeline'，明确其仅用于移动动作的时间校准。
         - 新增 'RecalibrateRotatingTimeline' 方法，实现旋转动作的时间校准逻辑：
           - 角度差值标准化到 [-180°, 180°] 区间。
           - 根据当前角度与目标角度计算旋转进度比例。
           - 基于旋转进度重新计算时间戳（TimeFrom 和 TimeTo）。
       - 修改 'best/v3/MovingPlan.go'：
         - 优化 'RecalibrateTimeline' 方法，通过 'ActionNO' 精确定位需要校准的动作，而非依赖起点和终点匹配。
         - 修正时间戳调整逻辑：从匹配到的动作开始，依次校准后续所有动作的时间线。
         - 增加边界检查：如果 Plan 没有动作，则输出警告并退出。
    
    3. API 层集成 (API Integration):
       - 修改 'best/v3/api/plan.go'：
         - 在 'mapAgentState' 中调用重命名后的 'RecalibrateMovingTimeline' 方法。
         - 新增旋转状态的时间校准逻辑：当 AGV 处于 'Status_Rotating' 状态时，调用 'RecalibrateRotatingTimeline' 进行角度校准。
         - 简化校准触发条件：只要完成了 Action 的时间校准（无论移动还是旋转），就会同步校准 MovingPlan。
    
    4. 案例文档 (Documentation):
       - 新增 'docs/cases/260206b/readme.md' 及相关截图（img.png ~ img_6.png），记录测试案例。
    
    相关文件：
    - best/v3/action.go
    - best/v3/MovingPlan.go
    - best/v3/ActionString.go
    - best/v3/api/plan.go
    - docs/cases/260206b/readme.md (及 7 张图片)

## 68ed8221a0d3973511d2b42fc2d6ea3eb9857cb5 (HEAD -> master)
Author: ioly <794565796@qq.com>
Date:   Fri Feb 6 12:02:56 2026 +0800

    refactor: 统一动作命名并优化规划失败处理逻辑
    
    主要变更内容：
    
    1. 命名规范化 (Naming Convention):
       - 修改 'best/MovingFlags.go'：将 'MOVING_STAY' 重命名为 'MOVING_WAIT'，使命名更语义化，与 'Action_Wait' 保持一致。
       - 同步更新了 'String()' 和 'ParseMovingFlags()' 方法中的相关字符串映射（"Stay" -> "Wait"）。
       - 修改 'best/v3/agent.go'：在 'ToMovingAction()' 方法中，将 'Action_Wait' 映射到 'MOVING_WAIT'。
       - 修改 'best/v3/MovingPlan.go'：全面替换所有使用 'MOVING_STAY' 的地方为 'MOVING_WAIT'（包括 'NewMovingPlan2'、'GetTotalCost'、'GetTimedSpaces' 等方法）。
    
    2. 代码规范化 (Code Standardization):
       - 修改 'best/v3/ActionString.go'：新增 'NewActionString(agentID int)' 构造函数，统一 ActionString 的创建方式。
       - 修改 'best/v3/action.go'：在 'Action.String()' 中使用新的构造函数 'NewActionString()'。
       - 修改 'best/v3/MovingPlan.go'：在 'MovingAction.String()' 和 'MovingPlan.String()' 中统一使用 'NewActionString()' 构造函数。
    
    3. 规划失败处理优化 (Planning Failure Handling):
       - 修改 'best/v3/api/solve_v2.go'：
         - 当路径规划失败或无法找到合法动作时，不再返回错误响应，而是主动生成并缓存一个 Wait 动作，保证系统继续运行。
         - 新增 'NewWaitResponse()' 辅助函数，用于生成统一的等待响应（Code=0，包含 1 秒等待动作）。
         - 新增 'NewWaitingAction()' 方法，用于创建一个在当前位置等待的默认动作。
         - 统一使用 'NewActionString()' 构造函数进行动作序列化。
    
    4. 案例文档 (Documentation):
       - 新增 'docs/cases/260206a/readme.md' 及相关截图（img.png ~ img_4.png），记录测试案例。

## af06 Thu Feb 5 20:29:05 2026 +0800
refactor: 优化 API 规划逻辑并调整旋转时间参数

主要变更内容：

1. 参数调整 (Parameters):
   - 修改 best/v3/options.go：将 gRotateTicks（旋转 tick 数）从 4.1 调整为 4.5，以匹配最新的运动学测试结果。

2. API 规划流程优化 (API Optimization):
   - 修改 best/v3/api/solve_v2.go：
     - 在 SolveV2 尝试多级 Padding 规划时，增加了详细的日志记录（显示具体的 Padding Level），便于追踪规划决策过程。
     - 优化了 GenParkingPlan 逻辑：在寻找泊车点时，将 denyList（黑名单）的更新时机提前，并增加了更多关键步骤的日志输出，避免无效尝试。
   - 修改 best/v3/api/plan.go：删除了 clearMovingPlan 中多余的互斥锁（Mutex）调用，因为其调用的子函数已包含锁逻辑，减少了锁竞争风险。

3. 辅助功能完善 (Helpers):
   - 修改 best/v3/api/PaddingLevel.go：为 PaddingLevel 枚举类型新增了 String() 方法，支持将分级状态直接输出为可读文本（Max, Medium, Min）。

相关文件：
- best/v3/api/PaddingLevel.go
- best/v3/api/plan.go
- best/v3/api/solve_v2.go
- best/v3/options.go


## 9a27 Thu Feb 5 11:57:43 2026 +0800
- solve_v2.go: 碰撞分级


## 8b80 Wed Feb 4 15:55:44 2026 +0800
- solve_v2.go: 修复 MovingPlan 缓存; 先 GenMovingPlan 再 GenParkingPlan
- plan.go: + solve_v2.go, 各 Agent 独自规划线路
- rule101: 只允许变更当前规划agv的Goal


## 145a Tue Feb 3 23:30:46 2026 +0800
- step.go: 每个 step 不再执行 agent.Plan.Copy()，而是默认重新规划
- 测试场景 189 添加 rule51，防止 agv 临时修改作业目的地，导致行为与规划不一致


## a61e Tue Feb 3 12:50:01 2026 +0800
- pathset.go：按路径成本排序; step.go: IDLE状态的旧Plan过滤
- plan.go: 并发规划时 需要考虑IDLE状态小车可能已经刚刚规划完成


## 8510 Mon Feb 2 23:53:05 2026 +0800
- plan.go: 始终从缓存读取 agent.PlanString; MovingPlan.go: 修复 OverlapsSpace 静态车辆的碰撞轮廓计算


## 0852 Mon Feb 2 17:09:38 2026 +0800
- MovingPlan.go: NewMovingPlan2 应当计算动作时间, 并更新 MovingAction.TimeFrom/TimeTo
- plang.go: NewMovingPlan2, 某些 move 的时间戳可能未对齐


## 7684 Sat Jan 31 15:22:46 2026 +0800
- MovingPlan.go: OverlapsSpace 函数，考虑前碰撞区
- action.go/MovingPlan.go 根据移动方向 添加前避障区
- plan.go: 如果中途有  parking 点，newMovingPlan 方法错误合并为长的 Move 动作，导致提前碰撞


## 0680 Fri Jan 30 13:00:21 2026 +0800
- v3: + NewActionFromString, NewMovingActionFromString
- plan.go: 使用 ActionString 持久化 Action 状态
- plan.go: 修复 返回的MovingPlan和MovingAction 可能不一致


## 72d0 Fri Jan 23 09:34:34 2026 +0800
- plan.go 如末次返回Wait，则TimeTo之前不再重新规划; options.go 按二次幂分级容差


## 8d33- Sat Jan 17 15:53:28 2026 +0800
- step.go,options.go: 修复挑选泊车点的逻辑
- rules.go: 添加 rule101 注册


## b9e4 Thu Jan 15 20:48:52 2026 +0800
- options.go: 修复 MaxTimeTick=1_999_999_999.0; plan.go: 自动修复时间戳
- tests.v3_http_test: 修复 启动 http 服务前 应对调用 api.PlanningServiceSingleton.SetScene(scene)
- v3: 修复 state.ActionString,PlanString 的反序列化


## dd62 Tue Dec 16 17:00:40 2025 +0800
- v3: 使用离线规划预先计算所有可能路径 然后在启动时并发加载
- v3: 添加 scene.GetCachedPaths 从内存中直接获取离线规划路径


## 32b7 Mon Dec 1 21:05:47 2025 +0800
- v3 step.go: 末次plan可能是前往泊车点; plan.go: GetTotalCost应当剔除 MOVING_STAY


## d554 Thu Nov 20 22:56:56 2025 +0800
- moving.go: 修复边界情况的位移及耗时对齐;
- step.go: 修复Rotatable()判断;
- MovingPlan.go: 添加末尾动作MOVING_STAY


## 052f Wed Nov 19 17:44:10 2025 +0800
- v3: +MovingPlan.go


## 967d Fri Nov 14 15:48:52 2025 +0800
- step.go: GetWeight +深度权重


## 92ee Thu Nov 13 21:32:52 2025 +0800
- solve.go: 多线程求解; step.go: 纠正地图距离的比较


## 3c9d Wed Nov 12 17:45:44 2025 +0800
- solve.go: Headings合并：Right和Left合并　Up和Down合并


## 2c18 Wed Jul 30 01:43:07 2025 +0000
- new GIFContext.go


## 5dcb Tue Jul 29 12:23:03 2025 +0000
- new TestScene402
- fix agent.RectangleTo


## 4bcf Fri Apr 18 09:36:54 2025 +0000
- initial commit