Message Types

HORUS provides 60+ typed messages covering every common robotics domain. All types are available in both Rust (use horus::prelude::*;) and Python (from horus import TypeName).

Coming from ROS2?

ROS2 PackageROS2 MessageHORUS Equivalent
geometry_msgsTwist, Pose, Pose2D, TransformStamped, Vector3, QuaternionTwist, Pose3D, Pose2D, TransformStamped, Vector3, Quaternion
sensor_msgsImu, LaserScan, Image, PointCloud2, JointState, BatteryState, CameraInfoImu, LaserScan, Image, PointCloud, JointState, BatteryState, CameraInfo
nav_msgsOdometry, OccupancyGrid, PathOdometry, OccupancyGrid, NavPath + Waypoint
vision_msgsDetection2D, Detection3DDetection, Detection3D
audio_common_msgsAudioDataAudioFrame
std_msgsHeader(embedded — timestamp_ns and frame_id are fields on each message)

Key difference from ROS2: No separate Header message. Every HORUS message has timestamp_ns and frame_id as direct fields.

Message Categories

CategoryTypesUse Case
GeometryPose2D, Pose3D, Twist, Vector3, Point3, Quaternion, TransformStamped, AccelPosition, orientation, motion
SensorsImu, LaserScan, Odometry, JointState, BatteryState, Range, Temperature, MagneticFieldSensor data from hardware
ControlCmdVel, MotorCommand, ServoCommand, JointCommand, PidStateMotor and actuator commands
NavigationNavGoal, GoalResult, Waypoint, NavPath, OccupancyGrid, CostMap, VelocityObstaclePath planning and mapping
PerceptionDetection, Detection3D, TrackedObject, SegmentationMask, LandmarkArray, PlaneDetectionComputer vision and ML output
VisionCompressedImage, CameraInfo, RegionOfInterest, StereoInfoCamera configuration and compressed data
Force/HapticsWrenchStamped, ForceCommand, ContactInfo, ImpedanceParameters, HapticFeedbackForce sensing and control
DiagnosticsHeartbeat, DiagnosticStatus, NodeHeartbeat, SafetyStatus, EmergencyStopSystem health monitoring
AudioAudioFrameMicrophone data, speech, anomaly detection
InputJoystickInput, KeyboardInputHuman input devices

Custom Messages

Need a type that doesn't exist? Create your own:

use horus::prelude::*;

message! {
    MotorStatus {
        rpm: f32,
        current_amps: f32,
        temperature_c: f32,
        fault_code: u32,
    }
}

// Now use it like any standard message
let topic: Topic<MotorStatus> = Topic::new("motor.status")?;