# Robot Configuration Before Kompass can drive your robot, it needs to understand its physical constraints. You define this "Digital Twin" using the `RobotConfig` object, which aggregates the Motion Model, Geometry, and Control Limits. ```python import numpy as np from kompass.robot import RobotConfig, RobotType, RobotGeometry # Example: Defining a simple box-shaped Ackermann robot robot_config = RobotConfig( model_type=RobotType.ACKERMANN, geometry_type=RobotGeometry.Type.BOX, geometry_params=np.array([1.0, 1.0, 1.0]) # x, y, z ) ``` ## Motion Models Kompass supports three distinct kinematic models. Choose the one that matches your robot's drivetrain. - {material-regular}`directions_car;1.5em;sd-text-primary` Ackermann - **Car-Like Vehicles** Non-holonomic constraints (bicycle model). The robot has a limited steering angle and cannot rotate in place. - {material-regular}`sync;1.5em;sd-text-primary` Differential - **Two-Wheeled Robots** Robots like the Turtlebot. Capable of forward/backward motion and zero-radius rotation (spinning in place). - {material-regular}`open_with;1.5em;sd-text-primary` Omni - **Holonomic Robots** Robots like Mecanum-wheel platforms or Quadrupeds. Capable of instantaneous motion in any direction (x, y) and rotation. ## Robot Geometry The geometry defines the collision volume of the robot. This is used by the local planner for obstacle avoidance. The `geometry_params` argument expects a **NumPy array** containing specific dimensions based on the selected type: | Type | Parameters (np.array) | Description | | --- | --- | --- | | **BOX** | `[length, width, height]` | Axis-aligned box. | | **CYLINDER** | `[radius, length_z]` | Vertical cylinder. | | **SPHERE** | `[radius]` | Perfect sphere. | | **ELLIPSOID** | `[axis_x, axis_y, axis_z]` | Axis-aligned ellipsoid. | | **CAPSULE** | `[radius, length_z]` | Cylinder with hemispherical ends. | | **CONE** | `[radius, length_z]` | Vertical cone. | **Configuration Example:** ```python # A cylinder robot (Radius=0.5m, Height=1.0m) cylinder_robot_config = RobotConfig( model_type=RobotType.DIFFERENTIAL_DRIVE, geometry_type=RobotGeometry.Type.CYLINDER, geometry_params=np.array([0.5, 1.0]) ) # A box robot (Length=0.5, Width=0.5, Height=1.0m) box_robot_config = RobotConfig( model_type=RobotType.DIFFERENTIAL_DRIVE, geometry_type=RobotGeometry.Type.BOX, geometry_params=np.array([0.5, 0.5, 1.0]) ) ``` ## Control Limits Safety is paramount. You must explicitly define the kinematic limits for linear and angular velocities. Kompass separates **Acceleration** limits from **Deceleration** limits. This allows you to configure a "gentle" acceleration for smooth motion, but a "hard" deceleration for emergency braking. ```python from kompass.robot import LinearCtrlLimits, AngularCtrlLimits, RobotConfig, RobotType, RobotGeometry import numpy as np # 1. Linear Limits (Forward/Backward) # Max Speed: 1.0 m/s # Acceleration: 1.5 m/s^2 (Smooth start) # Deceleration: 2.5 m/s^2 (Fast stop) ctrl_vx = LinearCtrlLimits(max_vel=1.0, max_acc=1.5, max_decel=2.5) # 2. Angular Limits (Rotation) # Max Steer is only used for Ackermann robots ctrl_omega = AngularCtrlLimits( max_vel=1.0, max_acc=2.0, max_decel=2.0, max_steer=np.pi / 3 ) # Setup your robot configuration my_robot = RobotConfig( model_type=RobotType.DIFFERENTIAL_DRIVE, geometry_type=RobotGeometry.Type.CYLINDER, geometry_params=np.array([0.1, 0.3]), ctrl_vx_limits=ctrl_vx, ctrl_omega_limits=ctrl_omega, ) ``` :::{tip} For Ackermann robots, `ctrl_omega_limits.max_steer` defines the maximum physical steering angle of the wheels in radians. ::: ## Coordinate Frames Kompass needs to know the names of your TF frames to perform lookups. You configure this using the `RobotFrames` object. The components will automatically subscribe to `/tf` and `/tf_static` to track these frames. ```python from kompass.config import RobotFrames frames = RobotFrames( world='map', # The fixed global reference frame odom='odom', # The drift-prone odometry frame robot_base='base_link', # The center of the robot scan='scan', # Lidar frame rgb='camera/rgb', # RGB Camera frame depth='camera/depth' # Depth Camera frame ) ``` | Frame | Description | | --- | --- | | **world** | The global reference for path planning (usually `map`). | | **odom** | The continuous reference for local control loops. | | **robot_base** | The physical center of the robot. All geometry is relative to this. | | **Sensors** | `scan`, `rgb`, `depth` frames are used to transform sensor data into the robot's frame. |