Your greenhouse, watched by a robot that drives itself, and a live digital twin.
Lupin explores and patrols a greenhouse with Nav2, reads climate data off AprilTags, finds and grades flowers with YOLO, and streams it all into a digital twin you can drive by voice. ROS 2, simulation and real hardware, fully open-source.
ros2 launch lupin_bringup sim_full.launch.py- ROS 2 Humble
- Nav2 · MPPI
- Mecanum base
- 23-tool voice
- Open-source
- 9
- ROS 2 packages
- 23
- voice tools
- 10 / 6
- msgs / services
- MPPI
- omni controller
- Sim + HW
- one codebase
- MIT
- open-source
A greenhouse has thousands of plants and one grower’s attention.
Climate readings sit scattered on tags down every aisle, plant health is checked by hand, and nobody can be in every row at once. Fixed sensors only see their one spot; a person can’t walk the rows all day.
Let the robot walk the rows.

Six capabilities, one robot.
From an empty map to a live twin.
Demos.
Drop clips into public/demos/ and they appear here automatically.
DEMO VIDEO PLACEHOLDER
drop your clip at public/demos/navigation.mp4
DEMO VIDEO PLACEHOLDER
drop your clip at public/demos/hardware.mp4
DEMO VIDEO PLACEHOLDER
drop your clip at public/demos/twin.mp4
DEMO VIDEO PLACEHOLDER
drop your clip at public/demos/voice.mp4
MIRTE Master V2.
Lupin runs on the course’s MIRTE Master V2, a holonomic mecanum platform with a small manipulator. The same codebase drives Gazebo and the real robot; only the downstream drive topic changes.
Full hardware spec

4-wheel mecanum base
holonomic drive
4-DOF arm + 1-DOF gripper
Hiwonder servos
Orbbec depth + gripper cam
RGB-D + close-up
RPLidar + IMU
SLAM + odometry
Orange Pi onboard
laptop offload
wheel-encoder odometry
sim = hardware
Engineering you can read.
The HMI walks the /tf tree itself
No tf2_web_republisher: RosProvider subscribes to /tf + /tf_static over CBOR, chains 2D transforms in the browser, and re-renders only when the robot moves >5 mm.
A permanent, heart-beating E-stop
It boots engaged, gates every cmd_vel publish, heartbeats a zero Twist at 20 Hz, and fires CancelGoal at both Nav2 servers, and auto-trips on tab-hide or rosbridge drop.
A twin that admits what it can’t see
The get_field service interpolates sensor heatmaps but encodes any cell beyond 1.5 m of a real reading as NaN, so the console paints colour only where data supports it.
A dependency-free frontier explorer
Pure-Python BFS over the occupancy grid, no numpy, no rclpy, masks unknown-adjacent free cells and scores clusters by size / (1 + distance) to pick the next goal.
Built by Team Lupin.
Six MSc Robotics students at TU Delft (group_14, RO47007 Multidisciplinary Project, 2026 cohort), co-authors, maintainers, and owners of the entire stack, from the mecanum base to the mission console.

Walk the rows without walking the rows.
Bring Lupin up in simulation with one command, then point it at the real robot. Open-source, ROS 2, sim and hardware.
ros2 launch lupin_bringup sim_full.launch.py


