Geometry Messages

Spatial data types for positions, orientations, velocities, and coordinate transforms.

# simplified
from horus import Pose2D, Pose3D, Twist, Vector3, Quaternion, TransformStamped

Pose2D

2D position and orientation — the most common pose type for ground robots.

# simplified
pose = Pose2D(x=1.0, y=2.0, theta=0.5)  # meters, radians
FieldTypeUnitDescription
xfloatmX position
yfloatmY position
thetafloatradHeading angle
timestamp_nsintnsTimestamp
Static MethodReturnsDescription
Pose2D.origin()Pose2DCreate a pose at the origin (0, 0, 0)
MethodReturnsDescription
distance_to(other)floatEuclidean distance to another Pose2D
normalize_angle()NoneNormalize theta to [-pi, pi] in-place
is_valid()boolCheck for NaN/inf values

Pose3D

6-DOF pose — position + quaternion orientation.

# simplified
pose = Pose3D(
    x=1.0, y=2.0, z=0.5,
    qx=0.0, qy=0.0, qz=0.0, qw=1.0,  # identity rotation
)
FieldTypeUnitDescription
x, y, zfloatmPosition
qx, qy, qz, qwfloatQuaternion orientation
timestamp_nsintnsTimestamp
Static MethodReturnsDescription
Pose3D.identity()Pose3DIdentity pose (origin, no rotation)
Pose3D.from_pose_2d(pose)Pose3DCreate from a Pose2D (z=0, rotation around z-axis)
MethodReturnsDescription
distance_to(other)floatEuclidean distance to another Pose3D
is_valid()boolCheck for NaN/inf values

Twist

6-DOF velocity — linear + angular.

# simplified
twist = Twist(
    linear_x=0.5, linear_y=0.0, linear_z=0.0,
    angular_x=0.0, angular_y=0.0, angular_z=0.3,
)
FieldTypeUnitDescription
linear_x, linear_y, linear_zfloatm/sLinear velocity
angular_x, angular_y, angular_zfloatrad/sAngular velocity
timestamp_nsintnsTimestamp
Static MethodReturnsDescription
Twist.stop()TwistZero velocity (all components 0)
Twist.new_2d(linear_x=0.0, angular_z=0.0)Twist2D twist (only forward + yaw)
MethodReturnsDescription
is_valid()boolCheck for NaN/inf values

ROS2 equivalent: geometry_msgs/msg/Twist


Vector3

3D vector for general-purpose spatial math.

# simplified
v = Vector3(x=1.0, y=0.0, z=0.0)
FieldTypeDescription
x, y, zfloatVector components
Static MethodReturnsDescription
Vector3.zero()Vector3Zero vector (0, 0, 0)
MethodReturnsDescription
magnitude()floatVector length (L2 norm)
normalize()NoneNormalize to unit length in-place
normalized()Vector3Return a new unit-length vector (does not mutate self)
dot(other)floatDot product with another Vector3
cross(other)Vector3Cross product with another Vector3

Point3

3D point (semantically distinct from Vector3 — a position, not a direction).

# simplified
p = Point3(x=1.0, y=2.0, z=3.0)
FieldTypeDescription
x, y, zfloatPoint coordinates
Static MethodReturnsDescription
Point3.origin()Point3Origin point (0, 0, 0)
MethodReturnsDescription
distance_to(other)floatEuclidean distance to another Point3

Quaternion

Rotation quaternion (x, y, z, w format).

# simplified
q = Quaternion(x=0.0, y=0.0, z=0.0, w=1.0)  # identity
FieldTypeDescription
x, y, z, wfloatQuaternion components
Static MethodReturnsDescription
Quaternion.identity()QuaternionIdentity rotation (0, 0, 0, 1)
Quaternion.from_euler(roll=0.0, pitch=0.0, yaw=0.0)QuaternionCreate from Euler angles (radians)
MethodReturnsDescription
normalize()NoneNormalize to unit quaternion in-place
is_valid()boolCheck if quaternion is approximately unit length

Accel

6-DOF acceleration.

# simplified
accel = Accel(
    linear_x=0.0, linear_y=0.0, linear_z=9.81,
    angular_x=0.0, angular_y=0.0, angular_z=0.0,
)
FieldTypeUnitDescription
linear_x, linear_y, linear_zfloatm/s²Linear acceleration
angular_x, angular_y, angular_zfloatrad/s²Angular acceleration
timestamp_nsintnsTimestamp
MethodReturnsDescription
is_valid()boolCheck for NaN/inf values

TransformStamped

Timestamped rigid-body transform (translation + rotation).

Constructor

# simplified
tf = horus.TransformStamped(
    tx=0.1, ty=0.0, tz=0.3,
    rx=0.0, ry=0.0, rz=0.0, rw=1.0,
    timestamp_ns=horus.timestamp_ns(),
)
FieldTypeDescription
tx, ty, tzfloatTranslation (meters)
rx, ry, rz, rwfloatRotation quaternion
timestamp_nsintTimestamp in nanoseconds

Static Methods

MethodReturnsDescription
TransformStamped.identity()TransformStampedIdentity transform (no translation or rotation)
TransformStamped.from_pose_2d(pose)TransformStampedCreate from a Pose2D (z=0, rotation around z-axis)

Methods

MethodReturnsDescription
is_valid()boolCheck if the rotation quaternion is normalized
normalize_rotation()NoneNormalize the rotation quaternion in-place

PoseStamped

Timestamped pose.

# simplified
ps = horus.PoseStamped(
    x=1.0, y=2.0, z=0.0,
    qx=0.0, qy=0.0, qz=0.0, qw=1.0,
    frame_id="map",
    timestamp_ns=horus.timestamp_ns(),
)

PoseWithCovariance

Pose with uncertainty estimate (6x6 covariance matrix, row-major).

# simplified
pwc = PoseWithCovariance(
    x=1.0, y=2.0, z=0.0,
    qx=0.0, qy=0.0, qz=0.0, qw=1.0,
    frame_id="map",
)
pwc.covariance = [0.01] * 36  # 6x6 row-major
FieldTypeDescription
x, y, zfloatPosition
qx, qy, qz, qwfloatQuaternion orientation
covariancelist[float]6x6 covariance matrix (36 elements, row-major)
frame_idstrCoordinate frame
timestamp_nsintTimestamp
MethodReturnsDescription
position_variance()list[float]Diagonal elements [0,0], [1,1], [2,2] — position uncertainty (x, y, z)
orientation_variance()list[float]Diagonal elements [3,3], [4,4], [5,5] — orientation uncertainty (roll, pitch, yaw)

TwistWithCovariance

Twist with uncertainty estimate (6x6 covariance matrix, row-major).

# simplified
twc = TwistWithCovariance(
    linear_x=0.5, linear_y=0.0, linear_z=0.0,
    angular_x=0.0, angular_y=0.0, angular_z=0.1,
    frame_id="base_link",
)
twc.covariance = [0.01] * 36
FieldTypeDescription
linear_x, linear_y, linear_zfloatLinear velocity
angular_x, angular_y, angular_zfloatAngular velocity
covariancelist[float]6x6 covariance matrix (36 elements, row-major)
frame_idstrCoordinate frame
timestamp_nsintTimestamp
MethodReturnsDescription
linear_variance()list[float]Diagonal elements [0,0], [1,1], [2,2] — linear velocity uncertainty
angular_variance()list[float]Diagonal elements [3,3], [4,4], [5,5] — angular velocity uncertainty

See Also