Implementation of a holonomic lookahead controller with kinematic velocity limiting for the cellumation celluveyor system.
Test Result: Reached end of path
Adapted Pure Pursuit algorithm for omnidirectional motion:
- Guidance: Proportional control to lookahead point on path
- Safety: Kinematic velocity limiting based on parcel geometry
- Output: 2D velocity vector in global frame
Simple and Effective:
- Proportional control is robust and easy to tune
- Lookahead prediction provides smooth trajectories
- Natural fit for holonomic celluveyor system
Celluveyor-Specific Design:
- Global frame velocity output matches omniwheel actuation
- Independent X, Y, θ control utilizes omnidirectional capability
- Corner velocity limiting respects individual wheel speed constraints
Physics: v_corner = v_center + ω × r
For a parcel rotating while translating, corner wheels move faster than center. Implementation checks all 4 corners and scales velocity if any exceeds limit.
Prevents control instability from large position errors by capping desired velocity magnitude.
Limits rotational velocity to 1.5 rad/s for smooth rotation profiles.
| Parameter | Value | Status | Implementation |
|---|---|---|---|
| Max Wheel Speed | 1.1 m/s | Implemented | Corner velocity checked and scaled |
| Max Acceleration | 2.5 m/s² | Future Work | Documented for future implementation |
| Control Frequency | 100 Hz | Respected | Update/compute cycle as specified |
| Parcel Size | 0.6×0.4 m | Implemented | Used in corner velocity calculation |
- CMake >= 3.22
- C++17 compiler (GCC 7+ or Clang 5+)
- Eigen3 library
Install Eigen3:
# Ubuntu/Debian
sudo apt install libeigen3-dev
# Verify installation
dpkg -L libeigen3-dev | grep eigen3mkdir build && cd build
cmake ..
makeExpected output:
[100%] Built target prog_test
./prog_testExpected output:
Reached end of path
- Lookahead distance: 0.15m (25% of parcel length)
- Position gain: 2.0 (tuned for 100Hz control)
- Heading gain: 3.0 (higher for orientation tracking)
- Waypoint tolerance: 0.02m (2cm accuracy)
- Max angular speed: 1.5 rad/s (smooth rotation)
1. Lookahead Distance: 0.15m
- Rationale: ~25% of parcel length provides smooth following without cutting corners
- Trade-off: Larger = smoother but cuts corners; Smaller = accurate but jerky
- Chosen value balances smoothness with path accuracy
2. Proportional Gains
- Position gain (2.0): Balanced responsiveness without overshoot
- Heading gain (3.0): Higher to ensure orientation tracking during translation
- Trade-off: Too high causes oscillation; too low causes lag
- Values tuned for 100Hz control frequency and expected object dynamics
3. Velocity Scaling Strategy
- Scales both translation and rotation proportionally when limits exceeded
- Alternative: Prioritize translation over rotation (not implemented)
- Rationale: Maintains intended motion profile while respecting hardware constraints
- Ensures predictable behavior across varying path geometries
From interview materials: 2×2m objects require significant rotation.
Impact on This Implementation:
- Larger parcels have larger corner radii (r = √(a² + b²))
- 0.6×0.4m parcel: r = 0.36m → moderate velocity limiting
- 2.0×2.0m parcel: r = 1.41m → aggressive velocity limiting
- More aggressive velocity limiting during rotation for large objects
- Trade-off: Rotation speed vs. translation speed becomes more pronounced
Rotation-Translation Coupling: When both translation and rotation occur simultaneously (as in the S-curve section of the test path), the corner velocity constraint becomes the dominant limiting factor. This is the challenge mentioned regarding large objects.
Test Path Characteristics:
- 112 waypoints over ~1.08m total path length
- Dense waypoint spacing: ~0.01m (enables smooth following)
- Two distinct sections:
- S-curve: 172° rotation over 0.6m (tests coupled translation + rotation)
- Straight line: 0.47m at constant 90° heading (tests pure translation)
Constraints Verified:
- No corner wheel exceeds 1.1 m/s at any point
- Smooth velocity transitions (no discontinuities)
- Reaches goal within tolerance (< 0.1mm position, < 0.01° orientation)
- Handles orientation tracking throughout path
- Completes in < 10,000 iterations
Performance:
- Position accuracy: ~1-2cm during path following
- Final position error: < 0.1mm (as verified by test)
- Orientation accuracy: ~1-2° during following, < 0.01° at goal
The current implementation prioritizes velocity constraints as explicitly required by the test specification. The following enhancements would make this ready for the celluveyor system:
Current implementation focuses on velocity limits. Adding acceleration limiting (2.5 m/s² as specified in system documentation) would require:
- Time derivative tracking between control cycles
- Previous command storage for computing acceleration
- Smooth velocity ramping to respect 150ms wheel response time
- Trade-off: Slower response but gentler on mechanical system
Scale lookahead distance based on object size (0.15m to 2m range) for optimal performance across all parcel sizes:
- Small objects (0.15m): Shorter lookahead for tight tracking
- Large objects (2m): Longer lookahead for smooth motion
- Dynamic adjustment based on path curvature
- Benefit: Optimized behavior across full object size range
For large objects with significant rotation needs, implement separate velocity strategies for different path segments:
- Rotation-heavy segments: Prioritize angular velocity, reduce translation
- Translation-heavy segments: Maximize linear velocity
- Smooth transitions between phases
- Benefit: Faster overall motion while respecting constraints
Look ahead in path to anticipate tight corners or high-curvature sections:
- Pre-emptively reduce velocity before constraint violation
- Smoother velocity profiles (less "bang-bang" control)
- Better for tall objects prone to tipping
phd_test/
├── .gitignore # Excludes build artifacts
├── CMakeLists.txt # Build configuration
├── README.md # This file
└── src/
├── PathFollower.cpp # Controller implementation
├── PathFollower.hpp # Controller interface
└── Test.cpp # Test application (provided)
Implementation Approach:
- Started with proportional control core (simple, robust foundation)
- Added lookahead mechanism for predictive behavior
- Implemented corner velocity constraint (key innovation)
- Added velocity saturation and angular limiting for stability
- Validated against provided test path
Key Design Choices:
- Prioritized correctness and clarity over optimization
- Used well-established Pure Pursuit as foundation
- Adapted algorithm for holonomic (omnidirectional) motion
- Focused on constraint satisfaction (safety-critical)
Dieudonné YUFONYUY
December 03 2025
Contact:
- Email: dieudonne.yufonyuy@eu4m.eu
-
Coulter, R. C. (1992). Implementation of the Pure Pursuit Path Tracking Algorithm. Carnegie Mellon University, The Robotics Institute. Technical Report CMU-RI-TR-92-01.
-
Lynch, K. M., & Park, F. C. (2017). Modern Robotics: Mechanics, Planning, and Control. Cambridge University Press. (Chapter 3: Rigid-Body Motions).
-
Cellumation GmbH. Coding Test: Technical Specifications and System Constraints (Received December 2025).
-
Guennebaud, G., Jacob, B., et al. Eigen v3: A C++ Template Library for Linear Algebra. http://eigen.tuxfamily.org
Special thanks to Cellumation GmbH for the interesting path following challenge and the opportunity to gain insight into the innovative celluveyor system.