Skip to main content

Boomerang Controller Documentation

Overview​

The Boomerang Controller is an advanced path-following algorithm implemented in LemLib that allows robots to smoothly navigate to target positions while maintaining optimal heading throughout the movement. Unlike simple point-to-point movement, Boomerang creates curved, efficient paths.

What is Boomerang Control?​

Basic Concept​

Boomerang control combines position control and heading control to create smooth, curved paths that:

  • Minimize total travel time
  • Reduce wheel slippage
  • Provide predictable, repeatable motion
  • Allow for dynamic obstacle avoidance

Why "Boomerang"?​

The algorithm is called "Boomerang" because the robot's path often resembles the curved flight path of a boomerang - smooth, arcing motions rather than sharp turns.

How Boomerang Works​

Algorithm Steps​

  1. Calculate target vector from current position to goal
  2. Determine optimal heading based on target direction and desired final heading
  3. Generate smooth path using carrot-following technique
  4. Apply motion commands to follow the generated path

Key Parameters​

// Example Boomerang movement
chassis.moveToPoint(24, 24, // Target X, Y coordinates (inches)
2000, // Timeout (ms)
{.forwards = false, // Drive backwards
.maxSpeed = 100}); // Maximum speed

Boomerang vs. Other Controllers​

Controller TypePath ShapeUse CaseProsCons
Point-to-PointStraight lineSimple movementsFast, directSharp turns, wheel slip
Pure PursuitSmooth curvesComplex pathsVery smoothRequires pre-planned path
BoomerangCurved arcsDynamic targetsSmooth + flexibleMore complex tuning

Configuration and Tuning​

Movement Options​

lemlib::MoveToPointParams params;
params.forwards = true; // Drive forwards (false = backwards)
params.maxSpeed = 127; // Maximum speed (0-127)
params.minSpeed = 20; // Minimum speed to prevent stalling
params.earlyExitRange = 2; // Distance to start slowing down (inches)

Advanced Parameters​

  • Lead Distance: How far ahead to "look" for path planning
  • Settle Range: Distance tolerance for reaching target
  • Settle Time: Time to remain within settle range
  • Timeout: Maximum time allowed for movement

Practical Applications​

Autonomous Routines​

void autonomous() {
// Move to scoring position with optimal path
chassis.moveToPoint(48, 24, 3000, {.forwards = true, .maxSpeed = 100});

// Turn to face goal while moving
chassis.turnToHeading(90, 1000);

// Move to next position
chassis.moveToPoint(24, 48, 3000, {.forwards = false, .maxSpeed = 80});
}

Field Navigation​

  • Scoring runs: Smooth approach to goals
  • Game piece collection: Efficient pickup patterns
  • Defensive positioning: Quick repositioning
  • Multi-point paths: Chaining multiple movements

Advantages of Boomerang​

Mechanical Benefits​

  • Reduced wheel wear: Smooth curves vs. sharp turns
  • Less motor strain: Gradual acceleration/deceleration
  • Improved traction: Minimizes wheel slippage
  • Consistent timing: Predictable movement duration

Programming Benefits​

  • Simple interface: Single function call for complex movements
  • Automatic optimization: Algorithm finds efficient paths
  • Robust performance: Handles odometry errors gracefully
  • Flexible parameters: Customizable for different situations

Common Use Cases​

1. Scoring Sequences​

// Approach scoring zone smoothly
chassis.moveToPoint(scoreX, scoreY, 2000, {.forwards = true});
// Score game piece
scoreGamePiece();
// Back away efficiently
chassis.moveToPoint(safeX, safeY, 1500, {.forwards = false});

2. Game Piece Collection​

// Navigate to game piece with optimal approach angle
chassis.moveToPoint(pieceX, pieceY, 2500, {.forwards = true, .maxSpeed = 90});
// Collect piece
collectPiece();

3. Defensive Positioning​

// Quick repositioning for defense
chassis.moveToPoint(defenseX, defenseY, 1000, {.maxSpeed = 127});

Tuning Guidelines​

Speed Settings​

  • High speed: Use for long, open movements
  • Medium speed: Use for precision positioning
  • Low speed: Use near obstacles or for final approach

Direction Selection​

  • Forwards: When robot front has intake/mechanisms
  • Backwards: When robot back is more maneuverable
  • Choose based on: Next action, obstacle avoidance, time efficiency

Timeout Values​

  • Conservative: 3-4 seconds for most movements
  • Aggressive: 1-2 seconds for quick repositioning
  • Safety: Always include timeout to prevent infinite loops

Troubleshooting​

Robot Doesn't Reach Target​

Possible Causes:

  • Timeout too short
  • Obstacles blocking path
  • Odometry drift
  • Mechanical issues

Solutions:

  • Increase timeout value
  • Check for physical obstructions
  • Recalibrate odometry
  • Verify motor and sensor function

Path Too Aggressive​

Symptoms: Robot overshoots, loses traction, or moves erratically Solutions:

  • Reduce maximum speed
  • Increase settle range
  • Check PID tuning
  • Verify wheel condition

Inconsistent Performance​

Causes: Odometry errors, battery voltage, field conditions Solutions:

  • Regular odometry calibration
  • Monitor battery levels
  • Adjust for field variations

Integration with Other Systems​

Sensor Feedback​

// Use vision to refine target position
if (visionTargetDetected()) {
auto target = getVisionTarget();
chassis.moveToPoint(target.x, target.y, 2000);
}

State Machines​

switch (autonomousState) {
case MOVE_TO_SCORE:
chassis.moveToPoint(scorePos.x, scorePos.y, 2000);
if (chassis.isSettled()) {
autonomousState = SCORE_PIECE;
}
break;
}

Performance Optimization​

Path Efficiency​

  • Plan movements to minimize total distance
  • Consider robot orientation for next action
  • Chain movements smoothly
  • Avoid unnecessary direction changes

Timing Optimization​

  • Use appropriate speeds for each segment
  • Overlap movements with mechanism actions
  • Minimize settle times where possible
  • Plan for consistent cycle times

Future Enhancements​

  • Dynamic obstacle avoidance
  • Multi-point path planning
  • Velocity profiling integration
  • Real-time path optimization
  • Integration with vision systems

Last updated: 2025-08-25