5. 架构设计

5.1 目标架构(规划)

        flowchart LR
    subgraph Stack["libautonomy"]
        MS[MapServer]
        PS[PlannerServer]
        CS[ControllerServer]
        SC[SensorCollator]
    end
    subgraph Viz["VisualizationServer(规划)"]
        VS[WebSocket :8765]
    end
    subgraph Client["外部客户端"]
        FG[Foxglove Studio]
        RV[RViz2 via ROS]
    end

    MS -->|OccupancyGrid| VS
    PS -->|Path| VS
    CS -->|Odometry| VS
    SC -->|LaserScan| VS
    VS --> FG
    Stack -->|autonomy_ros| RV
    

VisualizationServer 设计职责:

  1. 订阅 Autolink topic(或注册栈内回调)

  2. 将 commsgs 序列化转发到 Foxglove WebSocket

  3. 可选 MCAP 录制(install_mcap.sh 已提供依赖,C++ 未集成)

5.2 当前架构(已实现)

MapServer::PublishMap()
  → MapPublishCallback(Autonomy 注册)
    → ApplyMapToCostmap()
    → map_listeners_ 回调

PlannerServer::GetPlan()
  → 返回 Path(进程内 API,无 Writer)

Costmap2DWrapper::publishMap()
  → snapshotOccupancyGrid()(内存快照,不发布到 channel)

SensorCollator → feedLaserScan() → ObstacleLayer

关键事实:各 Server 以 C++ API + 回调 为主,统一的 Autolink Writer 将数据推到可视化 topic。

5.3 地图与 RViz 兼容性

autonomy/map/costmap_2d/costmap_2d_wrapper.cpp 在生成 OccupancyGrid 时,将 INSCRIBED_INFLATED_OBSTACLE 映射为 occupancy 值 99,与 Nav2 / RViz 调色板习惯一致。

Costmap2DPublishercostmap_2d_publisher.hpp)保留 Nav2 风格接口,ROS 发布代码已注释,未接 Autolink。

5.4 与 Bridge 的边界

模块

协议

用途

autonomy/bridge

gRPC / MQTT

远程导航、探索

foxglove_bridge(ROS 包)

WebSocket + ROS 2

Foxglove 可视化

VisualizationServer(规划)

WebSocket + commsgs

原生可视化

三者互不替代。详见 15 Bridge

5.5 各模块数据出口

模块

可视化相关输出

当前方式

Map

OccupancyGrid

回调 → costmap

Planning

Path

GetPlan() 返回值

Control

cmd_vel, odom

ControllerServer 内部

Localization

pose, odom

配置 topic 名(ROS 侧)

Perception

Detection2DArray

规划订阅(文档)

5.6 相关文档