本系列探討 Zenoh 在機器人領域的變革潛力,本文作爲開頭,我們將檢視 zenoh-plugin-ros1 如何通過先進網路架構與尖端的 Rust 實作,橋接傳統機器人系統與現代資料導向通訊範式。
2007 年,Willow Garage 推出 ROS 1,徹底改變機器人軟體的構思、開發與共享方式。它不僅是一套中介軟體,而是一場開放協作的宣言,串連全球研究者、工程師和愛好者。
ROS 1 的巧妙之處在於其開源社群的開發方式。廣泛套件生態系允許研究生寫的導航演算法無縫被工業機器人使用。發布/訂閱的通訊模式直覺易用,中央 Master 協調服務讓系統“即插即用”。
可惜的是,ROS 1 如今已經不再維護,官方最新版本 ROS 1 Noetic 已於 2025 年 5 月 31 日達生命週期終點。
ROS 1 影響廣泛且。從全球大學普遍使用的標誌性 PR2 研究平台,到教導新一代的 TurtleBots,ROS 1 成為機器人社群的通用語言。其影響跨足:
ROS 1 社群是機器人史上首度出現的全球性合作共生。
當年革命設計,今則成瓶頸。ROS 1 網路架構基於關鍵假設,隨機器人發展成為限制:
zenoh-plugin-ros1 實作分散式發現系統,消除 ROS 1 的單點故障。發現協定運行於層級化 key-value namespace:
// discovery.rs
kedefine!(
pub discovery_format: "ros1_discovery_info/${discovery_namespace:*}/${resource_class:*}/${data_type:*}/${md5:*}/${bridge_namespace:*}/${topic:**}",
);
產生類似
ros1_discovery_info/*/pub/std_msgs%2FString/hash123/*/robot1/sensors/camera
的探測鍵。
多層級發現架構:
採用啟發自 ALOHA 協定 的廣播協調,避免大規模部署時beancon風暴:
// aloha_declaration.rs
while monitor_running.load(std::sync::atomic::Ordering::Relaxed) {
match remote_beacons.fetch_and(0, std::sync::atomic::Ordering::SeqCst) {
0 => {
if !sending_beacons {
// Exponential backoff with randomization
let period_ns = beacon_period.as_nanos();
let aloha_wait: u128 = rand::random::<u128>() % period_ns;
tokio::time::sleep(Duration::from_nanos(aloha_wait.try_into().unwrap())).await;
ALOHA 優勢:
ZenohClient 實作高度 QoS 控制,ROS 1 難以達成:
// zenoh_client.rs
self.session
.declare_publisher(key_expr)
.reliability(Reliability::Reliable)
.allowed_destination(Locality::Remote)
.congestion_control(CongestionControl::Block)
.await
QoS 高階功能:
// lib.rs
static ref TOKIO_RUNTIME: tokio::runtime::Runtime = tokio::runtime::Builder::new_multi_thread()
.worker_threads(WORK_THREAD_NUM.load(Ordering::SeqCst))
.max_blocking_threads(MAX_BLOCK_THREAD_NUM.load(Ordering::SeqCst))
.enable_all()
.build()
.expect("Unable to create runtime");
執行架構特色:
// abstract_bridge.rs
match zenoh_client.make_query_sync(key, query.0).await {
Ok(reply) => match reply.recv_async().await {
Ok(r) => match r.result() {
Ok(sample) => {
let data = sample.payload().to_bytes().into_owned();
Ok(rosrust::RawMessage(data))
}
Err(e) => {
error!("ROS1 -> Zenoh Client: received Zenoh Query with error: {:?}", e);
Err(format!("{:?}", e))
}
},
Err(e) => Err(e.to_string())
},
Err(e) => Err(e.to_string())
}
錯誤處理優點:
?
操作符鏈式傳播錯誤// aloha_subscription.rs
struct AlohaResource {
activity: AtomicBool,
}
impl AlohaResource {
pub fn update(&mut self) {
self.activity.store(true, Relaxed);
}
pub fn is_active(&self) -> bool {
self.activity.load(Relaxed)
}
}
無鎖好處:
// discovery.rs:36-38
kedefine!(
pub discovery_format: "ros1_discovery_info/${discovery_namespace:*}/${resource_class:*}/${data_type:*}/${md5:*}/${bridge_namespace:*}/${topic:**}",
);
巨集於編譯期產生類型安全的 key 處理代碼,杜絕大量執行時字串錯誤。
zenoh-plugin-ros1 建立無縫橋接,讓 ROS 1 生態系統透過 Zenoh 網路互連。橋接保留 ROS 1 通訊的語意完整性:
安裝必要依賴:
# 安裝 Rust 開發環境
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
# 安裝 ROS 1(Ubuntu/Debian)
sudo apt update
sudo apt install ros-noetic-desktop-full
# 安裝開發工具
sudo apt install llvm-dev libclang-dev build-essential
# Clone the repository
git clone https://github.com/eclipse-zenoh/zenoh-plugin-ros1.git
cd zenoh-plugin-ros1
# Build the bridge
cargo build --release
# The binaries will be available in target/release/
ls target/release/zenoh-bridge-ros1
Debian/Ubuntu:
# Add Eclipse Zenoh repository
echo "deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list
sudo apt update
# Install the bridge
sudo apt install zenoh-bridge-ros1
Docker 部署:
# Pull the latest image
docker pull eclipse/zenoh-bridge-ros1:latest
# Run with host networking
docker run --init --net host eclipse/zenoh-bridge-ros1
# Terminal 1: Start ROS Master
roscore
# Terminal 2: Start the bridge
zenoh-bridge-ros1
# Terminal 3: Publish to a topic
rostopic pub /test_topic std_msgs/String "data: 'Hello Zenoh!'" -r 1
# Terminal 4: Subscribe to the topic
rostopic echo /test_topic
# Terminal 1: Start first ROS Master
rosmaster -p 10000
# Terminal 2: Start second ROS Master
rosmaster -p 10001
# Terminal 3: Bridge first ROS system
zenoh-bridge-ros1 --ros_master_uri http://localhost:10000
# Terminal 4: Bridge second ROS system
zenoh-bridge-ros1 --ros_master_uri http://localhost:10001
# Terminal 5: Publish from first system
ROS_MASTER_URI=http://localhost:10000 rostopic pub /shared_topic std_msgs/String "data: 'From System 1'" -r 1
# Terminal 6: Subscribe from second system
ROS_MASTER_URI=http://localhost:10001 rostopic echo /shared_topic
幕後發生了什麼事情呢:
Zenoh 與 ROS1 的整合是機器人發展的新里程碑,讓舊系統注入現代分散式通訊技術。Rust 不僅帶來系統程式設計的可靠性,Zenoh 更提供彈性、性能与擴展性兼備的資料層。
下一篇我們將探索下一代 ROS 2,以及 Zenoh 在 ROS 2 的應用,敬請期待!