docs: Zenoh middleware guide (#25737)
Some checks failed
Build all targets / Scan for Board Targets (push) Has been cancelled
Build all targets / Build [${{ matrix.runner }}][${{ matrix.group }}] (push) Has been cancelled
Build all targets / Upload Artifacts (push) Has been cancelled
Checks / build (NO_NINJA_BUILD=1 px4_fmu-v5_default) (push) Has been cancelled
Checks / build (NO_NINJA_BUILD=1 px4_sitl_default) (push) Has been cancelled
Checks / build (check_format) (push) Has been cancelled
Checks / build (check_newlines) (push) Has been cancelled
Checks / build (module_documentation) (push) Has been cancelled
Checks / build (px4_fmu-v2_default stack_check) (push) Has been cancelled
Checks / build (px4_sitl_allyes) (push) Has been cancelled
Checks / build (shellcheck_all) (push) Has been cancelled
Checks / build (tests) (push) Has been cancelled
Checks / build (tests_coverage) (push) Has been cancelled
Checks / build (validate_module_configs) (push) Has been cancelled
Clang Tidy / build (push) Has been cancelled
MacOS build / build (px4_fmu-v5_default) (push) Has been cancelled
MacOS build / build (px4_sitl) (push) Has been cancelled
Ubuntu environment build / Build and Test (ubuntu:22.04) (push) Has been cancelled
Ubuntu environment build / Build and Test (ubuntu:24.04) (push) Has been cancelled
Container build / Set Tags and Variables (push) Has been cancelled
Container build / Build Container (amd64) (push) Has been cancelled
Container build / Build Container (arm64) (push) Has been cancelled
Container build / Deploy To Registry (push) Has been cancelled
EKF Update Change Indicator / unit_tests (push) Has been cancelled
Failsafe Simulator Build / build (failsafe_web) (push) Has been cancelled
FLASH usage analysis / Analyzing px4_fmu-v5x (push) Has been cancelled
FLASH usage analysis / Analyzing px4_fmu-v6x (push) Has been cancelled
FLASH usage analysis / Publish Results (push) Has been cancelled
ITCM check / Checking nxp_tropic-community (push) Has been cancelled
ITCM check / Checking px4_fmu-v5x (push) Has been cancelled
ITCM check / Checking px4_fmu-v6xrt (push) Has been cancelled
MAVROS Mission Tests / build (map[mission:MC_mission_box vehicle:iris]) (push) Has been cancelled
MAVROS Offboard Tests / build (map[test_file:mavros_posix_tests_offboard_posctl.test vehicle:iris]) (push) Has been cancelled
Nuttx Target with extra env config / build (px4_fmu-v5_default) (push) Has been cancelled
Python CI Checks / build (push) Has been cancelled
ROS Integration Tests / build (push) Has been cancelled
ROS Translation Node Tests / Build and test (map[ros_version:humble ubuntu:jammy]) (push) Has been cancelled
ROS Translation Node Tests / Build and test (map[ros_version:jazzy ubuntu:noble]) (push) Has been cancelled
SITL Tests / Testing PX4 tailsitter (push) Has been cancelled
SITL Tests / Testing PX4 iris (push) Has been cancelled
SITL Tests / Testing PX4 standard_vtol (push) Has been cancelled
Docs - Crowdin - Upload Guide sources (en) / upload-to-crowdin (push) Has been cancelled
Docs - Deploy PX4 User Guide to AWS / build (push) Has been cancelled
Docs - Deploy PX4 User Guide to AWS / deploy (push) Has been cancelled
Handle stale issues and PRs / stale (push) Has been cancelled
Fuzzing / Fuzzing (push) Has been cancelled

This commit is contained in:
Peter van der Perk
2025-10-16 11:48:12 +02:00
committed by GitHub
parent 104759b90c
commit faee1da630
6 changed files with 437 additions and 12 deletions

View File

@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export PX4 Zenoh arch.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.02362in" height="2.43307in"
viewBox="0 0 577.701 175.181" xml:space="preserve" color-interpolation-filters="sRGB" class="st9">
<v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
<v:userDefs>
<v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
</v:userDefs>
</v:documentProperties>
<style type="text/css">
<![CDATA[
.st1 {fill:#ffffff;stroke:#41719c;stroke-width:0.75}
.st2 {fill:#41719c;font-family:Calibri;font-size:0.833336em}
.st3 {font-family:Courier New;font-size:1em}
.st4 {font-size:1em}
.st5 {marker-end:url(#mrkr4-62);marker-start:url(#mrkr4-60);stroke:#41719c;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
.st6 {fill:#41719c;fill-opacity:1;stroke:#41719c;stroke-opacity:1;stroke-width:0.28409090909091}
.st7 {fill:none;stroke:none;stroke-width:0.25}
.st8 {fill:#41719c;font-family:Calibri;font-size:1.00001em}
.st9 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
]]>
</style>
<defs id="Markers">
<g id="lend4">
<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
</g>
<marker id="mrkr4-60" class="st6" v:arrowType="4" v:arrowSize="2" v:setback="6.68" refX="6.68" orient="auto"
markerUnits="strokeWidth" overflow="visible">
<use xlink:href="#lend4" transform="scale(3.52) "/>
</marker>
<marker id="mrkr4-62" class="st6" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
markerUnits="strokeWidth" overflow="visible">
<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
</marker>
</defs>
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
<v:userDefs>
<v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
</v:userDefs>
<title>Page-1</title>
<v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
v:shadowOffsetY="-8.50394"/>
<v:layer v:name="Connector" v:index="0"/>
<g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(429.165,-50.4584)">
<title>Rectangle</title>
<desc>Zenoh RMW implementation rmw_zenoh</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="68.5984" cy="158.173" width="137.2" height="34.0157"/>
<rect x="0" y="141.165" width="137.197" height="34.0157" class="st1"/>
<text x="9.51" y="155.08" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Zenoh RMW implementation<v:newlineChar/><tspan
x="41.59" dy="1.213em" class="st3">rmw_zenoh</tspan></text> </g>
<g id="shape2-5" v:mID="2" v:groupContext="shape" transform="translate(429.165,-90.1434)">
<title>Rectangle.2</title>
<desc>ROS Middleware (RMW) API</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="68.5984" cy="158.173" width="137.2" height="34.0157"/>
<rect x="0" y="141.165" width="137.197" height="34.0157" class="st1"/>
<text x="11.17" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ROS Middleware (RMW) API</text> </g>
<g id="shape4-8" v:mID="4" v:groupContext="shape" transform="translate(509.953,-129.828)">
<title>Rectangle.4</title>
<desc>ROS 2 Node</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="28.2047" cy="157.891" width="56.41" height="34.581"/>
<rect x="0" y="140.6" width="56.4094" height="34.581" class="st1"/>
<text x="16.22" y="154.89" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ROS 2<v:newlineChar/><tspan
x="17.23" dy="1.2em" class="st4">Node</tspan></text> </g>
<g id="shape5-12" v:mID="5" v:groupContext="shape" transform="translate(429.165,-129.828)">
<title>Rectangle.5</title>
<desc>ROS 2 Node</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="28.2047" cy="157.891" width="56.41" height="34.581"/>
<rect x="0" y="140.6" width="56.4094" height="34.581" class="st1"/>
<text x="16.22" y="154.89" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ROS 2<v:newlineChar/><tspan
x="17.23" dy="1.2em" class="st4">Node</tspan></text> </g>
<g id="shape6-16" v:mID="6" v:groupContext="shape" transform="translate(93.027,-51.0236)">
<title>Rectangle.6</title>
<desc>PX4 Zenoh-Pico Node</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="41.644" cy="118.488" width="83.29" height="113.386"/>
<rect x="0" y="61.7953" width="83.288" height="113.386" class="st1"/>
<text x="10.07" y="115.49" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PX4 Zenoh-Pico <tspan
x="30.67" dy="1.2em" class="st4">Node</tspan></text> </g>
<g id="shape7-20" v:mID="7" v:groupContext="shape" transform="translate(13.6063,-130.394)">
<title>Rectangle.7</title>
<desc>uORB Topic α</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="158.173" width="75.12" height="34.0157"/>
<rect x="0" y="141.165" width="75.1181" height="34.0157" class="st1"/>
<text x="10.13" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>uORB Topic <tspan
class="st4" v:langID="1032">α</tspan></text> </g>
<g id="shape8-24" v:mID="8" v:groupContext="shape" transform="translate(13.6063,-90.7087)">
<title>Rectangle.8</title>
<desc>uORB Topic β</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="158.173" width="75.12" height="34.0157"/>
<rect x="0" y="141.165" width="75.1181" height="34.0157" class="st1"/>
<text x="10.31" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>uORB Topic <tspan
class="st4" v:langID="1032">β</tspan></text> </g>
<g id="shape9-28" v:mID="9" v:groupContext="shape" transform="translate(13.6063,-51.0236)">
<title>Rectangle.9</title>
<desc>uORB Topic γ</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="158.173" width="75.12" height="34.0157"/>
<rect x="0" y="141.165" width="75.1181" height="34.0157" class="st1"/>
<text x="10.73" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>uORB Topic <tspan
class="st4" v:langID="1032">γ</tspan></text> </g>
<g id="shape10-32" v:mID="10" v:groupContext="shape" transform="translate(183.128,-130.394)">
<title>Rectangle.10</title>
<desc>ROS2 Topic α</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="158.173" width="75.12" height="34.0157"/>
<rect x="0" y="141.165" width="75.1181" height="34.0157" class="st1"/>
<text x="10.64" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ROS2 Topic <tspan
class="st4" v:langID="1032">α</tspan></text> </g>
<g id="shape11-36" v:mID="11" v:groupContext="shape" transform="translate(183.128,-90.7087)">
<title>Rectangle.11</title>
<desc>ROS2 Topic β</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="158.173" width="75.12" height="34.0157"/>
<rect x="0" y="141.165" width="75.1181" height="34.0157" class="st1"/>
<text x="10.82" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ROS2 Topic <tspan
class="st4" v:langID="1032">β</tspan></text> </g>
<g id="shape12-40" v:mID="12" v:groupContext="shape" transform="translate(183.128,-51.0236)">
<title>Rectangle.12</title>
<desc>ROS2 Topic γ</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="158.173" width="75.12" height="34.0157"/>
<rect x="0" y="141.165" width="75.1181" height="34.0157" class="st1"/>
<text x="11.25" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ROS2 Topic <tspan
class="st4" v:langID="1032">γ</tspan></text> </g>
<g id="shape18-44" v:mID="18" v:groupContext="shape" transform="translate(13.6063,-11.3386)">
<title>Rectangle.18</title>
<desc>PX4</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="122.598" cy="158.173" width="245.2" height="34.0157"/>
<rect x="0" y="141.165" width="245.197" height="34.0157" class="st1"/>
<text x="114.89" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>PX4</text> </g>
<g id="shape19-47" v:mID="19" v:groupContext="shape" transform="translate(322.583,-49.8088)">
<title>Rectangle.19</title>
<desc>Zenoh Router zenohd</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="48.3661" cy="138.907" width="96.74" height="72.5492"/>
<rect x="0" y="102.632" width="96.7323" height="72.5492" class="st1"/>
<text x="20.63" y="135.82" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Zenoh Router<v:newlineChar/><tspan
x="30.36" dy="1.213em" class="st3">zenohd</tspan></text> </g>
<g id="shape20-51" v:mID="20" v:groupContext="shape" transform="translate(322.583,-10.1237)">
<title>Rectangle.20</title>
<desc>Linux</desc>
<v:userDefs>
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
</v:userDefs>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="122.598" cy="158.173" width="245.2" height="34.0157"/>
<rect x="0" y="141.165" width="245.197" height="34.0157" class="st1"/>
<text x="111.93" y="161.17" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Linux</text> </g>
<g id="shape21-54" v:mID="21" v:groupContext="shape" v:layerMember="0" transform="translate(258.246,-147.402)">
<title>Dynamic connector</title>
<path d="M6.68 175.18 L7.04 175.18 L30.89 175.18 L30.89 236.5 L57.3 236.5" class="st5"/>
</g>
<g id="shape22-63" v:mID="22" v:groupContext="shape" v:layerMember="0" transform="translate(258.246,-107.717)">
<title>Dynamic connector.22</title>
<path d="M6.68 175.18 L7.04 175.18 L30.89 175.18 L30.89 196.81 L57.3 196.81" class="st5"/>
</g>
<g id="shape23-70" v:mID="23" v:groupContext="shape" v:layerMember="0" transform="translate(258.246,-68.0315)">
<title>Dynamic connector.23</title>
<path d="M6.68 175.18 L7.04 175.18 L30.89 175.18 L30.89 157.13 L57.3 157.13" class="st5"/>
</g>
<g id="shape24-77" v:mID="24" v:groupContext="shape" transform="translate(251.717,-17.1438)">
<title>Sheet.24</title>
<desc>UART TCP UDP</desc>
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
<v:textRect cx="37.5591" cy="151.863" width="75.12" height="46.6357"/>
<rect x="0" y="128.545" width="75.1181" height="46.6357" class="st7"/>
<text x="24.06" y="141.06" class="st8" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>UART<v:newlineChar/><tspan
x="28.34" dy="1.2em" class="st4">TCP<v:newlineChar/></tspan><tspan x="26.92" dy="1.2em" class="st4">UDP</tspan></text> </g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -744,6 +744,7 @@
- [Standard Modes Protocol](mavlink/standard_modes.md)
- [uXRCE-DDS (PX4-ROS 2/DDS Bridge)](middleware/uxrce_dds.md)
- [UORB Bridged to ROS 2](middleware/dds_topics.md)
- [Zenoh (PX4 ROS 2)](middleware/zenoh.md)
- [Modules & Commands](modules/modules_main.md)
- [Autotune](modules/modules_autotune.md)
- [Commands](modules/modules_command.md)

View File

@@ -5,7 +5,7 @@ This document is [auto-generated](https://github.com/PX4/PX4-Autopilot/blob/main
:::
The [dds_topics.yaml](https://github.com/PX4/PX4-Autopilot/blob/main/src/modules/uxrce_dds_client/dds_topics.yaml) file specifies which uORB message definitions are compiled into the [uxrce_dds_client](../modules/modules_system.md#uxrce-dds-client) module when [PX4 is built](../middleware/uxrce_dds.md#code-generation), and hence which topics are available for ROS 2 applications to subscribe or publish (by default).
The [dds_topics.yaml](https://github.com/PX4/PX4-Autopilot/blob/main/src/modules/uxrce_dds_client/dds_topics.yaml) file specifies which uORB message definitions are compiled into the [uxrce_dds_client](../modules/modules_system.md#uxrce-dds-client) and/or [zenoh](../modules/modules_driver.md#zenoh) module when [PX4 is built](../middleware/uxrce_dds.md#code-generation), and hence which topics are available for ROS 2 applications to subscribe or publish (by default).
This document shows a markdown-rendered version of [dds_topics.yaml](https://github.com/PX4/PX4-Autopilot/blob/main/src/modules/uxrce_dds_client/dds_topics.yaml), listing the publications, subscriptions, and so on.
@@ -13,7 +13,7 @@ This document shows a markdown-rendered version of [dds_topics.yaml](https://git
Topic | Type| Rate Limit
--- | --- | ---
`/fmu/out/register_ext_component_reply` | [px4_msgs::msg::RegisterExtComponentReply](../msg_docs/RegisterExtComponentReply.md) |
`/fmu/out/register_ext_component_reply` | [px4_msgs::msg::RegisterExtComponentReply](../msg_docs/RegisterExtComponentReply.md) |
`/fmu/out/arming_check_request` | [px4_msgs::msg::ArmingCheckRequest](../msg_docs/ArmingCheckRequest.md) | 5.0
`/fmu/out/mode_completed` | [px4_msgs::msg::ModeCompleted](../msg_docs/ModeCompleted.md) | 50.0
`/fmu/out/battery_status` | [px4_msgs::msg::BatteryStatus](../msg_docs/BatteryStatus.md) | 1.0
@@ -21,21 +21,21 @@ Topic | Type| Rate Limit
`/fmu/out/estimator_status_flags` | [px4_msgs::msg::EstimatorStatusFlags](../msg_docs/EstimatorStatusFlags.md) | 5.0
`/fmu/out/failsafe_flags` | [px4_msgs::msg::FailsafeFlags](../msg_docs/FailsafeFlags.md) | 5.0
`/fmu/out/manual_control_setpoint` | [px4_msgs::msg::ManualControlSetpoint](../msg_docs/ManualControlSetpoint.md) | 25.0
`/fmu/out/message_format_response` | [px4_msgs::msg::MessageFormatResponse](../msg_docs/MessageFormatResponse.md) |
`/fmu/out/message_format_response` | [px4_msgs::msg::MessageFormatResponse](../msg_docs/MessageFormatResponse.md) |
`/fmu/out/position_setpoint_triplet` | [px4_msgs::msg::PositionSetpointTriplet](../msg_docs/PositionSetpointTriplet.md) | 5.0
`/fmu/out/sensor_combined` | [px4_msgs::msg::SensorCombined](../msg_docs/SensorCombined.md) |
`/fmu/out/sensor_combined` | [px4_msgs::msg::SensorCombined](../msg_docs/SensorCombined.md) |
`/fmu/out/timesync_status` | [px4_msgs::msg::TimesyncStatus](../msg_docs/TimesyncStatus.md) | 10.0
`/fmu/out/vehicle_land_detected` | [px4_msgs::msg::VehicleLandDetected](../msg_docs/VehicleLandDetected.md) | 5.0
`/fmu/out/vehicle_attitude` | [px4_msgs::msg::VehicleAttitude](../msg_docs/VehicleAttitude.md) |
`/fmu/out/vehicle_attitude` | [px4_msgs::msg::VehicleAttitude](../msg_docs/VehicleAttitude.md) |
`/fmu/out/vehicle_control_mode` | [px4_msgs::msg::VehicleControlMode](../msg_docs/VehicleControlMode.md) | 50.0
`/fmu/out/vehicle_command_ack` | [px4_msgs::msg::VehicleCommandAck](../msg_docs/VehicleCommandAck.md) |
`/fmu/out/vehicle_command_ack` | [px4_msgs::msg::VehicleCommandAck](../msg_docs/VehicleCommandAck.md) |
`/fmu/out/vehicle_global_position` | [px4_msgs::msg::VehicleGlobalPosition](../msg_docs/VehicleGlobalPosition.md) | 50.0
`/fmu/out/vehicle_gps_position` | [px4_msgs::msg::SensorGps](../msg_docs/SensorGps.md) | 50.0
`/fmu/out/vehicle_local_position` | [px4_msgs::msg::VehicleLocalPosition](../msg_docs/VehicleLocalPosition.md) | 50.0
`/fmu/out/vehicle_odometry` | [px4_msgs::msg::VehicleOdometry](../msg_docs/VehicleOdometry.md) |
`/fmu/out/vehicle_odometry` | [px4_msgs::msg::VehicleOdometry](../msg_docs/VehicleOdometry.md) |
`/fmu/out/vehicle_status` | [px4_msgs::msg::VehicleStatus](../msg_docs/VehicleStatus.md) | 5.0
`/fmu/out/airspeed_validated` | [px4_msgs::msg::AirspeedValidated](../msg_docs/AirspeedValidated.md) | 50.0
`/fmu/out/vtol_vehicle_status` | [px4_msgs::msg::VtolVehicleStatus](../msg_docs/VtolVehicleStatus.md) |
`/fmu/out/vtol_vehicle_status` | [px4_msgs::msg::VtolVehicleStatus](../msg_docs/VtolVehicleStatus.md) |
`/fmu/out/home_position` | [px4_msgs::msg::HomePosition](../msg_docs/HomePosition.md) | 5.0
## Subscriptions

200
docs/en/middleware/zenoh.md Normal file
View File

@@ -0,0 +1,200 @@
# Zenoh (PX4 ROS 2 rmw_zenoh)
<Badge type="tip" text="main (planned for: PX4 v1.17)" /> <Badge type="warning" text="Experimental" />
:::warning Experimental
At the time of writing, PX4 Zenoh-pico is experimental, and hence subject to change.
:::
PX4 supports Zenoh as an alternative mechanism (to DDS) for bridging uORB topics to [ROS 2](../ros2/user_guide.md) (via the ROS 2 [`rmw_zenoh`](https://github.com/ros2/rmw_zenoh) middleware).
This allows uORB messages to be published and subscribed on a companion computer as though they were ROS 2 topics.
It provides a fast and lightweight way to connect PX4 to ROS 2, making it easier for applications to access vehicle telemetry and send control commands.
The following guide describes the architecture and various options for setting up the Zenoh client and router.
In particular, it covers the options that are most important to PX4 users exploring Zenoh as an alternative communication layer for ROS 2.
## Architecture
The Zenoh-based middleware consists of a client running on PX4 and a Zenoh router running on the companion computer, with bi-directional data exchange between them over a UART, TCP, UDP, or multicast-UDP link.
The router acts as a broker and discovery service, enabling PX4 to publish and subscribe to topics in the global Zenoh data space.
This allows seamless integration with ROS 2 nodes using [`rmw_zenoh`](https://github.com/ros2/rmw_zenoh), and supports flexible deployment across distributed systems.
![Architecture PX4 Zenoh-Pico with ROS 2](../../assets/middleware/zenoh/architecture-px4-zenoh.svg)
The client is the _PX4 Zenoh-Pico Node_ referred to above, which is implemented in the [PX4 `zenoh` module](../modules/modules_driver.md#zenoh).
This is based on Zenoh-Pico, a minimalistic version of [Eclipse Zenoh](https://zenoh.io/) (a data-centric protocol designed for real-time, distributed, and resource-constrained environments).
The router suggested above is [zenohd](https://github.com/eclipse-zenoh/zenoh/tree/main/zenohd).
:::info
UART is supported by Zenoh but has not yet implemented in the PX4 Zenoh-Pico node.
:::
## ROS 2 Zenoh Bring-up on Linux Companion
In order for PX4 uORB topics to be shared with ROS 2 applications, you will need the PX4 Zenoh-Pico Node client running on your FMU, connected to a Zenoh router running on the companion computer (or elsewhere in the network).
First select Zenoh as the ROS 2 transport by setting the `RMW_IMPLEMENTATION` environment variable as shown:
```sh
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
```
Then start the Zenoh router using the command:
```sh
ros2 run rmw_zenoh_cpp rmw_zenohd
```
For more information about the Zenoh Router see the [rmw_zenoh](https://github.com/ros2/rmw_zenoh?tab=readme-ov-file#start-the-zenoh-router) documentation.
## PX4 Zenoh-Pico Node Setup
### PX4 Firmware
Before setting up the Zenoh communication, first make sure that your firmware contains the driver that implements the [`zenoh` driver](../modules/modules_driver.md#zenoh), which provides the implementation of the _PX4 Zenoh-Pico Node_.
You can check if the module is present on your board by searching for the key `CONFIG_MODULES_ZENOH=y` in your board's `default.px4board` KConfig file.
For example, you can see that the module is present in `px4_fmu-v6xrt` build targets from [/boards/px4/fmu-v6xrt/default.px4board](https://github.com/PX4/PX4-Autopilot/blob/main/boards/px4/fmu-v6xrt/default.px4board#L91).
If `CONFIG_MODULES_ZENOH=y` is not preset you can add this key to your board configuration and rebuild.
Note that due to flash constraints you may need to remove other components in order to include the module (such as the [`uxrce_dds_client` module](../modules/modules_system.md#uxrce-dds-client), which you will not need if you are using Zenoh).
The table below shows some of the PX4 targets that include Zenoh by default.
| PX4 Target | Notes |
| ---------------------- | ------------------------------------------------------------------------------------------- |
| `px4_fmu-v6xrt` | For [FMUv6X-RT](../flight_controller/nxp_mr_vmu_rt1176.md) (reference platform for testing) |
| `nxp_tropic-community` | |
| `nxp_mr-tropic` | |
| `nxp_mr-canhubk344` | |
| `px4_sitl_zenoh` | Zenoh-enabled simulation build |
| `px4_fmu-v6x_zenoh` | Zenoh-enabled firmware for FMUv6X |
Zenoh is not included in the default `px4_fmu-` targets for any firmware other than `px4_fmu-v6xrt` (`px4_sitl_zenoh` and `px4_fmu-v6x_zenoh` [are build variants](../dev_setup/building_px4.md#px4-make-build-targets)).
::: tip
You can check if Zenoh is present at runtime by using QGroundControl to [find the parameter](../advanced_config/parameters.md#finding-a-parameter) [ZENOH_ENABLE](../advanced_config/parameter_reference.md#ZENOH_ENABLE).
If present, the module is installed.
:::
### Enable Zenoh on PX4 Startup
Set the [ZENOH_ENABLE](../advanced_config/parameter_reference.md#ZENOH_ENABLE) parameter to `1` to enable Zenoh on PX4 startup.
### Configure Zenoh Network
Set up PX4 to connect to the companion computer running `zenohd`.
PX4's default IP address of the Zenoh daemon host is `10.41.10.1`.
If you're using a different IP for the Zenoh daemon, run the following command (replacing the address) in a PX4 shell and then reboot:
```sh
zenoh config net client tcp/10.41.10.1:7447#iface=eth0
```
Note that for the simulation target with Zeroh (`px4_sitl_zenoh`) you won't need to make any changes because the default IP address of the Zenoh daemon is set to `localhost`.
:::warning
Any changes to the network configuration require a PX4 system reboot to take effect.
:::
:::tip
See [PX4 Ethernet Setup](../advanced_config/ethernet_setup.md) for more information about Ethernet configuration.
:::
### PX4 Zenoh-pico Node configuration
The **default configuration** is auto-generated from the [dds_topics.yaml](../middleware/dds_topics.md) file in the PX4 repository.
This file specifies which uORB message definitions are to be published/subscribed by ROS 2 applications, and hence (indirectly) which topics are compiled into the zenoh module.
To inspect the current Zenoh configuration:
```sh
zenoh config
```
The PX4 Zenoh-pico node stores its configuration on the **SD card** under the `zenoh` folder.
This folder contains three key files:
- **`net.txt`** Defines the **Zenoh network configuration**.
- **`pub.csv`** Maps **uORB topics to ROS2 topics** (used for publishing).
- **`sub.csv`** Maps **ROS2 topics to uORB topics** (used for subscribing).
### 4. Modifying Topic Mappings
Zenoh topic mappings define how data flows between PX4's internal uORB topics and external ROS2 topics via Zenoh.
These mappings are stored in `pub.csv` and `sub.csv` on the SD card, and can be modified at runtime using the `zenoh config` CLI tool.
:::warning
Any changes to the topic mappings require a PX4 system reboot to take effect.
:::
There are two types of mappings you can modify:
- **Publisher mappings**: Forward data from a uORB topic to a Zenoh topic.
- **Subscriber mappings**: Receive data from a Zenoh topic and publish it to a uORB topic.
The main operations and their commands are:
- Publish a uORB topic to a Zenoh topic:
```sh
zenoh config add publisher <zenoh_topic> <uorb_topic> [uorb_instance]
```
- Subscribe to a Zenoh topic and forward it to a uORB topic:
```sh
zenoh config add subscriber <zenoh_topic> <uorb_topic> [uorb_instance]
```
- Remove existing mappings:
```sh
zenoh config delete publisher <zenoh_topic>
zenoh config delete subscriber <zenoh_topic>
```
After modifying the mappings, reboot PX4 to apply the changes.
The updated configuration will be loaded from the SD card during startup.
## Communicating with PX4 from ROS 2 via Zenoh
Once your PX4 FMU is publishing data into ROS 2, you can inspect the available topics and their contents using standard ROS 2 CLI tools:
```sh
ros2 topic list
```
Check topic type and publishers/subscribers:
```sh
ros2 topic info -v /fmu/out/vehicle_status
Type: px4_msgs/msg/VehicleStatus
Publisher count: 1
Node name: px4_aabbcc00000000000000000000000000
Node namespace: /
Topic type: px4_msgs/msg/VehicleStatus
Topic type hash: RIHS01_828bddbb7d4c2aa6ad93757955f6893be1ec5d8f11885ec7715bcdd76b5226c9
Endpoint type: PUBLISHER
GID: 82.99.74.2c.b6.7d.93.44.91.4d.fe.14.93.58.40.16
QoS profile:
Reliability: RELIABLE
History (Depth): KEEP_LAST (7)
Durability: VOLATILE
Lifespan: Infinite
Deadline: Infinite
Liveliness: AUTOMATIC
Liveliness lease duration: Infinite
Subscription count: 0
```
### PX4 ROS 2 Interface with Zenoh
The [PX4 ROS 2 Interface Library](../ros2/px4_ros2_interface_lib.md) works out of the box with Zenoh as a transport backend.
This means you can publish and subscribe to PX4 topics over Zenoh without changing your ROS 2 nodes or dealing with DDS configuration.
For setup details and supported message types, refer to the [PX4 ROS 2 Interface Library](../ros2/px4_ros2_interface_lib.md).

View File

@@ -19,7 +19,7 @@ if MODULES_ZENOH
config ZENOH_DEFAULT_LOCATOR
string "Zenoh default mode"
default "tcp/127.0.0.1:7447" if PLATFORM_POSIX
default "" if !PLATFORM_POSIX
default "tcp/10.41.10.1:7447#iface=eth0" if !PLATFORM_POSIX
config ZENOH_RMW_LIVELINESS
bool "[EXPERIMENTAL] rmw_zenoh liveliness implemenation"

View File

@@ -6,9 +6,12 @@ parameters:
ZENOH_ENABLE:
description:
short: Zenoh Enable
long: Zenoh
short: Enable Zenoh
long: |
Set true (1) to start the Zenoh driver module (a.k.a the "Zenoh-Pico Node").
See https://docs.px4.io/main/en/middleware/zenoh and
https://docs.px4.io/main/en/modules/modules_driver.html#zenoh
category: System
type: int32
type: boolean
reboot_required: true
default: 0