La Coupe de France de Robotique
Introduction
La Coupe de France de robotique is an annual robotics competition which brings together teams of young people from all across France and the world to compete in matches that push strategy, technical ingenuity, and system reliability to the limit.
Each year brings a new challenge, a new set of rules, and a new playing arena. Teams, therefore, must build new robots each year to meet the requirements and score points most effectively in the playing arena. Top French teams compete against their international counterparts in the Eurobot final.
We at the Ecole Centrale de Nantes robotics club participated in the 2026 tournament with two teams. Mine, ECNNantrobot made our debut at the tournament with three robots: The main robot and two SIMAs. As part of the software subteam, I developed the main robot’s obstacle avoidance system, managed the firmware, and implemented the strategy.
For more information, check out the team's GitHub.
Demonstrated Skills: Python, C++, ROS2, Behaviour trees
The theme - winter is coming
Eurobot 2026 challenges two autonomous robots to help their squirrels prepare for winter by collecting, storing, and ultimately “eating” hazelnuts. Matches are played on a 3 × 2 m playing field, with each team operating from its own starting/finishing nest. The game is divided into five independent objectives, allowing teams to develop different strategies rather than following a fixed sequence.
1. Let’s Keep the Hazelnuts Warm
The main objective is to collect hazelnut crates and place them in either the team's nest or one of the pantries. Crates placed in the nest are worth 2 points each, while valid crates in a pantry are worth 3 points each. A further 5-point bonus is awarded for every pantry where the team has an absolute majority of its own valid crates. Crates in pantries can be stolen by the opposing team, while crates in the nest are protected.
2. To Find Is to Keep
Each team deploys a small autonomous actuator called a SIMA (Small Independent Mobile Actuator) into the central granary. Its task is to remove hazelnut crates from four fridges and replace them with empty crates, allowing the main robot to recover the released hazelnuts. This action scores 2 points for each fridge emptied of hazelnuts and 5 points for each fridge filled with an empty crate. These points are awarded to both teams, regardless of which team performs the action.
3. Not Too Warm, Not Too Cold
The robot must move a temperature cursor as close as possible to the centre of its thermometer. The score depends on the numbered zone reached by the cursor, so more accurate positioning produces more points. An additional interaction rule can also give the team the maximum score if the opposing robot or SIMA significantly displaces its cursor.
4. Nest, Sweet Nest
At the end of the match, the main robot must return to its own nest. A robot that is partially inside the valid area receives 5 points, while being completely inside earns an additional 5 points, for a maximum of 10 points.
5. Munch Time!
The team's SIMAs must reach the pantries to represent the squirrels eating their stored hazelnuts. Each pantry occupied by a team’s SIMA is worth 5 points, while successfully having all SIMAs “eat” earns an additional 10 points.
Playing area
The robots
Three robots were designed and built for the tournament: The main robot, affectionately named “Le Robot”, and two SIMAs, “Les Pamis”. They have the following specifications:
Le Robot
LiDAR (RPLiDAR C1)
STS 3215 intelligent server motors
SCS 0009 intelligent server motors
Closed-loop stepper motors (Nema 17)
ESP32 microcontroller
Raspberry Pi 4B
Les Pamis
ESP32 microcontroller
N20 motors
HC-SR04 ultrasonic sensors
Le Robot
Les Pamis
Le Robot’s architecture
I was part of the team that developed and implemented Le Robot’s software architecture. Decisions were made from an engineering standpoint, but also took into consideration time, available budget, and the competition guidelines.
Localisation
Localisation is performed entirely through wheel odometry, using the magnetic incremental encoders integrated into the NEMA 17 motors. Each motor has a nominal step angle of 1.8°, which the encoder system subdivides into 20 microsteps of 0.09°. This provides high angular resolution and enables precise estimation of the robot’s displacement and orientation. However, because the position estimate is obtained through dead reckoning, even small errors accumulate over time, resulting in inevitable position and orientation drift.
Control
The control architecture was designed around the type of strategy implemented by the robot. Since the strategy consists primarily of predefined motion commands—for example, drive forward 0.5 m, then turn right—an external feedback controller was not required. Instead, the robot relies on the position-monitoring and real-time correction capabilities of the motor drivers to execute each motion accurately.
For linear motion, the desired travel distance is converted into the corresponding number of motor steps. This step count, together with a target velocity, is transmitted to the motor driver, which executes the motion while internally monitoring and correcting the motor position.
Rotational motion is handled in a similar manner. Using the robot's track width (the distance between the wheels), the arc length associated with a desired rotation can be calculated geometrically. This arc length is then converted into the required number of motor steps, with the two motors driven in opposite directions to generate the rotation. A target velocity is also specified for the manoeuvre.
This approach keeps the control architecture relatively simple while still providing accurate execution of the predefined motion primitives required by the strategy.
Obstacle Detection
Obstacle detection is performed using an RPLiDAR C1, which provides a 2D representation of the robot's surroundings. Its ROS 2 driver publishes the resulting measurements as an array of range and angle values on a ROS 2 topic, allowing the robot to continuously monitor its environment.
According to the competition rules, the robot must come to a complete stop when an obstacle is encountered. Since the only expected obstacle is the opposing team's robot, the obstacle-avoidance system is intentionally simple and focuses on detecting the distance to the nearest object.
The LiDAR measurements are processed as follows:
Range measurements greater than 3 m are discarded, as this exceeds the length of the competition table.
If any remaining measurement is less than or equal to the predefined minimum obstacle distance, the robot commands a velocity of zero and stops.
Otherwise, the minimum detected range is used to calculate a velocity multiplier proportional to the distance from the nearest obstacle. As the robot approaches an obstacle, its velocity is progressively reduced, providing an additional safety margin before the stopping threshold is reached.
Software
Communication
The Raspberry Pi and ESP32 communicate through a serial interface, with the Raspberry Pi transmitting control messages to the ESP32 as strings at fixed frequencies. This provides a simple and deterministic communication layer between the high-level software running on the Raspberry Pi and the low-level hardware control implemented on the microcontroller.
Firmware
The robot's firmware runs on the ESP32 and is written in C++. It is responsible for the core real-time functions of the robot, including motor control, motion and manoeuvring, and execution of the match strategy.
To manage these functions concurrently, the firmware uses FreeRTOS-based task scheduling. This allows individual operations to be separated into independent tasks that can be queued, prioritised, and executed efficiently. Two key tasks are the serial handler, which continuously receives and parses commands from the Raspberry Pi, and the velocity handler, which translates the received commands into motor velocities. This architecture allows communication, motion control, and strategy execution to operate concurrently without relying on a single blocking control loop.
ROS 2
ROS 2 was primarily used on the Raspberry Pi to implement the robot's obstacle-detection system, providing a structured framework for receiving and processing LiDAR data.
Beyond obstacle detection, significant work was also undertaken to integrate ROS 2 behaviour trees into the robot's architecture. The intention was to use behaviour trees for more complex strategy execution and task management, providing a more modular way of sequencing and prioritising actions during a match. Although several hundred lines of code were developed for this system, the implementation was not sufficiently reliable to be used in the final competition configuration. The experience nevertheless provided a foundation for exploring more sophisticated task-management and strategy architectures in future iterations.
Lessons learned
A major error we made was building too much, too fast. We kept adding layers of complexity to the high-level software without testing its compatibility with the firmware or its performance on the robot. This was partly a consequence of our parallel development structure. Like many competition teams, different sub-teams worked independently on mechanical, electrical, firmware, and software components. This meant that we had limited access to a fully assembled robot for much of the development process and could not properly test the complete system until relatively close to the competition. Communication between sub-teams was also insufficient, which led to compatibility issues between independently developed software modules. The result was thousands of lines of code that could not be validated in time for the competition and had to be removed—months of work that yielded little.
Therefore, for future iterations, emphasis shall be placed on a layered architecture where each layer is stress-tested for reliability and robustness before the next layer is built and stacked. Communication in the team shall also be improved to ensure smooth progress towards a common objective.
To conclude…
2026 Coupe de France de Robotique was an incredible experience. There were over 100 teams, some of which brought almost their entire workshop to the event. Everyone was working, building, testing, iterating, and innovating. It relit the fire of passion I have for this incredible field of robotics, and I look forward to the 2027 tournament; Our team will come back stronger than ever!