Standard Messages

HORUS provides 75+ typed message types covering every common robotics domain. All are importable from horus and binary-compatible with Rust for cross-language topics.

from horus import CmdVel, Imu, LaserScan, Pose2D, Odometry

Which Message Do I Need?

I need to...UseCategory
Send velocity commands to motorsCmdVel, TwistControl
Read IMU data (accel + gyro)ImuSensor
Read LiDAR scansLaserScanSensor
Publish robot positionOdometry, Pose2D, Pose3DSensor, Geometry
Send camera imagesImageImage API
Send point cloudsPointCloudPointCloud API
Report ML detectionsDetection, Detection3DPerception
Send navigation goalsNavGoal, NavPathNavigation
Report system healthDiagnosticReport, NodeHeartbeatDiagnostics
Send force/torque dataWrenchStamped, ForceCommandForce
Send joystick/keyboard inputJoystickInput, KeyboardInputInput
Send audio dataAudioFrameML
Send dynamic/untyped dataPython dicts (GenericMessage, 4KB)Topic API

Message Categories

CategoryTypesPage
SensorImu, LaserScan, Odometry, NavSatFix, BatteryState, RangeSensor, Temperature, MagneticFieldSensor Messages
ControlCmdVel, MotorCommand, ServoCommand, PidConfig, DifferentialDriveCommand, JointCommandControl Messages
GeometryPose2D, Pose3D, Twist, Vector3, Point3, Quaternion, TransformStamped, AccelGeometry Messages
NavigationNavGoal, NavPath, Waypoint, OccupancyGrid, CostMap, VelocityObstacleNavigation Messages
PerceptionDetection, Detection3D, BoundingBox2D/3D, SegmentationMask, TrackedObject, LandmarkPerception Messages
DiagnosticsHeartbeat, DiagnosticReport, EmergencyStop, SafetyStatus, NodeHeartbeatDiagnostics Messages
VisionCompressedImage, CameraInfo, StereoInfo, RegionOfInterestVision Messages
Force & HapticsWrenchStamped, ForceCommand, ContactInfo, HapticFeedback, TactileArrayForce Messages
InputJoystickInput, KeyboardInputInput Messages
ClockClock, TimeReferenceClock Messages
MLAudioFrameML Messages
TensorTensor descriptorsTensor Messages

Import

All standard messages are available from the top-level horus module:

import horus

# Direct attribute access
cmd = horus.CmdVel(linear=1.0, angular=0.5)
imu = horus.Imu(accel_x=0.0, accel_y=0.0, accel_z=9.81)

# Or import specific types
from horus import CmdVel, Imu, LaserScan, Pose2D, Odometry

Custom Messages

Need a type that doesn't exist? Use Python dicts for prototyping:

node.send("motor_status", {
    "rpm": 1500.0,
    "current_amps": 2.3,
    "temperature_c": 45.0,
})

For production cross-language use, define message types in Rust with message! and they become available in Python automatically. See Custom Messages.


Typed vs Generic Performance

TransportLatencyCross-Language
Typed messages (horus.CmdVel)~1.7μsYes
Python dicts (GenericMessage)~6-50μsNo
Image zero-copy (DLPack)~1.1μsYes

Rule: Use typed messages for control loops and cross-language topics. Use dicts for Python-only prototyping.


See Also