自駕車系統其實跟機器人系統的發展密不可分。而自駕車的未來,不僅取決於單一車輛的智慧,更在於能否進行大規模、協同的車隊運行,透過同時模擬、測試並部署多輛自駕車來實現。
今天,我們來探索一個結合三項強大技術的開源專案 CARLA 模擬器、Autoware 自駕平台,以及 基於 Zenoh 的 Fleet Management System (FMS): autoware_carla_launch。
CARLA (Car Learning to Act) 是開源自駕車模擬的黃金標準。它完全建立在 Unreal Engine 之上,提供擬真城市環境,如今已成為全球自駕車研發不可或缺的工具。
CARLA 不只是另一個模擬器,它是一個完整的平台,讓自駕車研發真正普及化。它的架構圍繞幾項核心原則,專為嚴肅的自駕研發所打造:
Autoware 是目前最完整的開源自駕軟體堆疊。基於 ROS 2,它提供將普通車輛轉化為自駕車所需的一切功能,從感測器整合到 AI 驅動的決策。
Autoware 的模組化設計,建立在四大核心之上:
Autoware 的最大優勢之一,是它對硬體的高度相容性。不像封閉式方案將使用者綁定於特定硬體,Autoware 幾乎能在任何 ECU、感測器組合與車輛上運行。加上全球最大的自駕開源社群,推動了共享與加速創新。
當 CARLA 提供模擬環境、Autoware 管理單車智慧時,Zenoh 負責將一切串連,為車隊提供高效、可擴展的通訊與協調能力,從根本上改變自駕車隊的運作模式。
與 DDS、MQTT 等傳統協定相比,Zenoh 帶來了顛覆性的突破:
zenoh_autoware_fms 專案展現了 Zenoh 如何改造車隊管理:
在這個整合的核心中,存在著 zenoh_carla_bridge —— 一個以 Rust 編寫的高階應用程式,作為 CARLA 模擬環境與 Autoware 自動駕駛堆疊之間的關鍵通訊層。這個橋接器展現了現代系統程式設計的實踐方式,也體現了 Rust 在建構可靠且高效能基礎設施方面的強大能力。
此橋接器的架構展示了多種重要的 Rust 程式設計模式以及針對汽車應用的特定優化:
#[derive(Debug, Clone, PartialEq, ValueEnum)]
enum Mode {
/// 使用 zenoh-bridge-dds
DDS,
/// 使用 zenoh-bridge-ros2dds
ROS2,
/// 使用 rmw_zenoh
RmwZenoh,
}
系統支援多種通訊模式,能與不同的 ROS 2 中介軟體實作無縫整合。這種彈性對於支援多樣化的部署場景與遷移路徑至關重要。
Actor Bridge 模式:該橋接器實作了一種進階的 actor 模式,用於處理不同類型的 CARLA 實體:
pub enum BridgeType {
Vehicle(String),
Sensor(String, SensorType, String),
TrafficLight,
TrafficSign,
Other,
}
pub trait ActorBridge {
fn step(&mut self, timestamp: f64) -> Result<()>;
}
這種設計讓系統能透過統一介面處理多樣的模擬實體,同時保持型別安全與高效能。
記憶體安全的並行處理:該橋接器善用 Rust 的所有權系統與進階並行原語:
use arc_swap::ArcSwap;
use atomic_float::AtomicF32;
pub struct VehicleBridge<'a> {
vehicle_name: String,
actor: Vehicle,
publisher_actuation: Publisher<'a>,
velocity: Arc<AtomicF32>,
current_actuation_cmd: Arc<ArcSwap<ActuationCommandStamped>>,
// ... 其他欄位
}
透過 Arc<ArcSwap<>>
與原子型別的使用,能在沒有傳統鎖機制的情況下,安全地跨執行緒共享資料,這對即時效能至關重要。
進階感測器處理:感測器橋接器展現了對不同感測器類型的進階處理能力:
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SensorType {
CameraRgb,
LidarRayCast,
LidarRayCastSemantic,
Imu,
Gnss,
Collision,
NotSupport,
}
每種感測器類型都具備專屬的處理邏輯,將 CARLA 的模擬資料轉換為對應的 ROS 2 訊息格式,從點雲資料到相機影像都能以最佳效能進行處理。
時鐘同步:橋接器實作了精確的模擬時間同步:
pub struct SimulatorClock<'a> {
publisher_clock: Publisher<'a>,
attachment: Vec<u8>,
mode: Mode,
}
impl<'a> SimulatorClock<'a> {
pub fn publish_clock(&self, timestamp: Option<f64>) -> Result<()> {
let time = if let Some(sec) = timestamp {
builtin_interfaces::Time {
sec: sec.floor() as i32,
nanosec: (sec.fract() * 1_000_000_000_f64) as u32,
}
} else {
// 回退至系統時間
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Unable to get current time");
builtin_interfaces::Time {
sec: now.as_secs() as i32,
nanosec: now.subsec_nanos(),
}
};
// ... 發布時鐘訊息
}
}
這確保了系統中的所有組件都能以同步時間運作,這對於協調多車輛模擬至關重要。
autoware_carla_launch 專案代表了將這三項強大技術整合成一個統一的開發與測試平台的成果。這套完整的解決方案針對多車輛自駕模擬與車隊管理中的複雜挑戰,提供了實用的工具與架構。
該系統能在 CARLA 的真實感環境中,同時測試多輛自駕車輛,每輛車皆運行其完整的 Autoware 堆疊。此功能對於測試車輛間互動、交通流量最佳化以及車隊協作演算法至關重要。
可擴展架構:系統架構支援從單車測試擴展到包含數十輛自駕車的複雜多車場景。每輛車皆維持自身的命名空間與通訊通道,同時參與車隊層級的協作。
真實互動建模:模擬中的車輛彼此互動,並與模擬交通、行人以及環境條件進行交互,提供了完整的測試環境,以驗證真實世界的部署情境。
整合採用了進階的多層式架構:
這種分層式設計確保了模組化、可維護性,以及隨著技術演進替換組件的能力。
這套整合方案解決了自駕車開發中的多項關鍵挑戰:
加速開發週期:開發者能在模擬中快速測試複雜場景,遠快於真實世界測試,大幅縮短開發時間與成本。
安全驗證:可在模擬中反覆測試關鍵安全場景,無需冒著人員或設備的風險,實現完整的安全系統驗證。
車隊演算法開發:能在模擬環境中開發與優化多車協作演算法,並在部署到真實車隊之前完成驗證。
邊界情境探索:系統可系統性地探索邊界案例與不尋常場景,這些情境在現實測試中可能困難或危險重現。
CARLA、Autoware 與 Zenoh 的整合,不僅是技術成就,憑藉開源精神,這些先進功能將持續向研究者、新創與產業開放,成為推動自駕革新的共同基礎,
讓我們一起更快、更安全地走向智慧交通的未來!