# vla_ws **Repository Path**: rogers34/vla_ws ## Basic Information - **Project Name**: vla_ws - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-21 - **Last Updated**: 2026-08-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # VLA Workspace ROS2 工作空间,面向自主作业机械的 Vision-Language-Action (VLA) 流水线。 完整链路:相机 YUV → H.265 编解码 + 重采样 → RGB Image → OpenVLA-OFT 推理 → 动作指令; 同时支持离线录制 rosbag 并切分为 RLDS 训练数据集。 ## 包一览 ``` src/ ├── vision_codec/ # H.265 编解码节点(含 resize) ├── data_recorder/ # ros2 bag 数采封装 ├── vla_bridge/ # OpenVLA-OFT 推理 + RLDS 构建 + 下游控制 ├── shm_msgs/ # 共享内存图像/视频消息(含 CompressedVideo) ├── geosun_msgs/ # 车辆/底盘状态消息(VCU2HEE 等) └── vla_msgs/ # VLA 动作接口(预留,尚未接入) ``` ## 各包功能 ### vision_codec — H.265 编解码 FFmpeg 软编软解,支持 6 路相机并行,每路独立解码器实例。 - `h265_encoder` — 订阅 `*/yuv`(YUV422),经硬件编码库(`libvideoenc.so` + `libyuv.so`)发布 `*/h265`(`shm_msgs/CompressedVideo`)。 - `h265_decoder` — 订阅 `*/h265`,解码后经 sws_scale 重采样到目标分辨率,发布 `*/image`(`sensor_msgs/Image`,rgb8)。 - 一条 CompressedVideo = 一帧 Annex-B;经 FFmpeg HEVC parser → `avcodec_send_packet` → drain。 - 首帧等待 IDR 同步;bag 循环回绕时 `avcodec_flush_buffers` 重置。 - QoS:订阅 `reliable KeepLast(512)`,发布 `reliable KeepLast(10)`;每路 `MutuallyExclusive` 回调组保证帧序。 - `h265_pipeline.launch.py` — 一键启动解码(+ 可选编码,`enable_encoder:=true` 时相机发的是原始 YUV 才需要)。 配置:`config/encoder.yaml`、`config/decoder.yaml`(分辨率/线程数/编码格式)。 ### data_recorder — 数据采集 ros2 bag 录制封装,配置驱动,改 yaml 无需重编。 - `record.sh`(工作区根的软链接)— source 环境 → `ros2 launch data_recorder record.launch.py` → Ctrl+C 落盘,前台运行 + 后台 1s 刷新已录时长。 - `record.launch.py` — 读 `config/record_config.yaml`,按 `bag_name_<时间戳>` 建目录,调 `ros2 bag record`。 - 录制话题:6 路 H.265 + 动臂/铲斗角度 + 先导阀状态。 ### vla_bridge — VLA 桥接 连接视觉流与 OpenVLA-OFT,含在线推理与离线训练数据两条路径。 - `online_inference` — 订阅 `*/image`(best-effort,取最新帧),独立线程跑推理,发布 `/vla/action`(7-DoF)。模型加载隔离在 `load_model`,当前为 stub,接入真实权重即用。 - `build_rlds` — 离线工具:读 rosbag → PyAV 解码 → 同 online 的预处理 → 按 episode 切分 → 写 RLDS(tfds)训练集。 - `slicer` — 按 `/dataset/episode_trigger` 触发时间戳把 rosbag 切成 episode。 - `controller` — 下游控制骨架:把 `/vla/action` 转成底盘指令(速率限制/饱和/急停),项目相关逻辑待填。 - `vla_online.launch.py` — 启动在线推理(+ 可选控制器 `enable_controller:=true`)。 配置:`config/vla.yaml`(模型路径/prompt/最大推理 fps/action topic)。 ### 消息包 - **shm_msgs** — 共享内存图像与视频消息,核心是 `CompressedVideo`(H.265 Annex-B 载荷 + frame_sequence + key_frame 标志)。另有 `Image6m` 等多档共享内存图像类型。 - **geosun_msgs** — 车辆/底盘状态消息(VCU2HEE、各类 IMU/角度传感器/制动/档位等),用于回放旧 bag。 - **vla_msgs** — 项目规范的 VLA 动作接口(`ActionChunk`),预留;控制接口定稿后从 stub controller 切换过来。 > shm_msgs / geosun_msgs / vla_msgs 目前仅为回放与接口预留所需的消息定义子集,命名后续统一。 ## 快速上手 ```bash # 编译 colcon build --symlink-install # 1. 实时流水线(解码 → 推理) ros2 launch vision_codec h265_pipeline.launch.py # 终端 1 ros2 launch vla_bridge vla_online.launch.py # 终端 2 # 2. 采集数据(录制到 config/record_config.yaml 的 output_dir) ./record.sh # Ctrl+C 停止并落盘 # 3. 离线训练数据构建 ros2 run vla_bridge build_rlds --help ``` ## 依赖 - ROS2 humble - FFmpeg (libavcodec/libavutil/libswscale) - 硬件编码库:`libvideoenc.so`、`libyuv.so`(仅编码路径需要) - Python: rclpy, numpy, PyAV(离线解码), tfds(RLDS 构建), transformers/PyTorch(真实模型推理)