Month: June 2025

Lately, at home and at work during my Fun Fridays, I have been trying to learn more about 3D CAD and more precisely about FreeCAD, mostly in the context of (ab)using our 3D printers :). Inspired by a couple of Crazyradio cases that have already been published, I started working on a Crazyradio 2.0 case since this has not yet been done, I am quite happy about the result:

The design is mostly press-fit: the top and bottom parts are pressed together and hold thanks to the 3D printed layers interlocking in each-other. The LED lens is pressed in the top and the button actually slides and is guided by the top. The button is flush with the case since it is mainly a bootloader button and is not required to be pressed during normal use.

ECAD/CAD design

One of my goal when starting with this project was to experiment working both with Electronic CAD (KiCAD in my case) and Mechanical CAD (FreeCAD). There is an extension for FreeCAD that allows to go back-and-forth between the two tools, but in this case it was much simpler since my board was already finished, so I only needed to get a model of it in FreeCAD.

To do so, I made sure all the important components had 3D models in the Crazyradio electronic design. I had to import a couple of models from Mouser, and had to re-create the RGB LED in FreeCAD. I then exported it as a STEP file. This file can be imported in FreeCAD and retain all the interesting shape and surfaces useful to work with the model:

Shape binder: Keeping it DRY

Coming from the software/electronic world, we have this notion of DRY: Do not Repeat Yourself. Ideally I would like to apply the same to mechanical design and avoid as much as possible to write any measurement by hand. one way to do that with FreeCAD is with Shape binder. A good example of its use is with the LED lens.

I wanted to put a translucent lens just on top of the Crazyradio LED. One way to achieve that is to create a Shape binder of the LED top surface onto the TOP and Lens. The LED top is the yellow square in the next picture and its presence allows to align perfectly the hole in the top cover to the middle of the LED on the PCB. This prevent all hazardous manual measurement when placing the hole.

For the lens design I can go one step further, I can create a shape binder both for the LED and for the hole in the top layer, this way the shape of the lens is derived from existing geometry and, to a large extent, does not have to be specified manually:

This allows to quite easily align the lens perfectly on top of the LED. The same principle is used for the button to get it to slide and press on the PCB switch with minimal play.

Final product

I pushed the current state of the case on GitHub. It is also available on Maker World. I plan on improving the design before deciding to name it 1.0 and to eventually upload it on Printables and Thingiverse.

If you want to learn more about FreeCAD, I can recommend this great video series on YouTube, it goes through a lot of very useful functionalities like the shape binders.

With the Swedish summer upon us, things are more calm at Bitcraze. The summer is usually a time for us to look a bit more at fixing infrastructure and other things that we do not have time to work on the rest of the year. One of the things I have been looking at improving lately is the state of our Python projects.

We currently use Python as the default language for everything we do on PC. This includes the Crazyflie lib, Client and other tools for our ecosystem. Over the years the state of the Python projects have greatly evolved. It started in ~2011 with almost no project management at all; just Python files. Then we switched to setup.py/pip support. Recently the Crazyflie client got the pyproject.toml treatment. Now that most Linux distributions prevent pip install-ing packages we need to juggle with venvs in order to use or develop in Python.

In essence, Python started with an easy to use language but has now become quite complex and hard to handle. Things become even more complicated when we take into account CI in Github actions that have to test that our projects actually work with all supported version of Python on Linux/Mac/Windows.

A bit of Rust (tooling) in our Python

As you might have gathered from our previous blog posts over the years, we like Rust quite a bit at Bitcraze and hope to use it more in our products moving forward. One of the great parts of Rust is the quality of the tooling and of the compiler feedback. Cargo as a project management tool helps a lot working with projects in a comfortable and repeatable way.

This is why we are now quite interested in using uv going forward as an official tool to work with the Bitcraze Python projects. uv can replace both venv and pip and makes working with a Python project as easy as working on a Rust one with cargo. It is also very fast and efficient since it is written in … Rust of course :-).

We are also looking at switching from Flake8 to Ruff and Ty for linting and type checking respectively. These two tools, from the same developer as uv are very fast and give very high quality error messages and warnings – this should make it much easier to maintain good code quality.

These changes would mostly be on our documentation and development side. The resulting projects are still compatible with pip and can still be used as they where used before. However we would make sure the projects can be efficiently used with uv.

Example

The Crazyflie client is currently already fully able to run with uv since it already uses the ‘new’ pyproject.toml project config file. So working with the project, from within the project folder, would look like that:

crazyflie-clients-python $ uv run cfclient    # Run the Crazyflie client GUI
(...)

crazyflie-clients-python $ uv run ruff check  # Check the code, runs in ~100ms!
All checks passed!

crazyflie-clients-python $ uv run pre-commit
      Built cfclient @ file:///(...)/crazyflie-clients-python
Uninstalled 1 package in 0.97ms
░░░░░░░░░░░░░░░░░░░░ [0/1] Installing wheels...
Installed 1 package in 4ms
[WARNING] Unstaged files detected.
[INFO] Stashing unstaged files to /home/arnaud/.cache/pre-commit/patch1750684440-121836.
flake8...............................................(no files to check)Skipped
[INFO] Restored changes from /home/arnaud/.cache/pre-commit/patch1750684440-121836.Code language: Bash (bash)

This last command is a great example of the usefulness of uv: currently one need to install pre-commit on a virtual environment, enter it, and run pre-commit in the project. With uv is just works out of the box. In the back of course, pre-commit is installed in a virtual environment in the project folder. But this is all done automatically.

Finally we will also easily be able to test multiple versions of Python:

crazyflie-clients-python $ uv run --python 3.10 pre-commit
Using CPython 3.10.18 interpreter at: /home/linuxbrew/.linuxbrew/opt/python@3.10/bin/python3.10
Removed virtual environment at: .venv
Creating virtual environment at: .venv
      Built cfclient @ file:///(...)/crazyflie-clients-python
    Updated https://github.com/bitcraze/crazyflie-lib-python.git (3a35d22026c2ed8251b821e4f5b10e67091f811f)
      Built cflib @ git+https://github.com/bitcraze/crazyflie-lib-python.git@3a35d22026c2ed8251b821e4f5b10e67091f811f
░░░░░░░░░░░░░░░░░░░░ [0/32] Installing wheels...                                                                                             warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance.
Installed 32 packages in 699ms
[WARNING] Unstaged files detected.
[INFO] Stashing unstaged files to /home/arnaud/.cache/pre-commit/patch1750684632-123219.
[INFO] Installing environment for https://github.com/PyCQA/flake8.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
flake8...............................................(no files to check)Skipped
[INFO] Restored changes from /home/arnaud/.cache/pre-commit/patch1750684632-123219.Code language: JavaScript (javascript)

And, for the end user, uvx also simplify running the client:

$ uvx cfclient   # Pulls and run cfclient from Pypi
(...)

$ uvx --from cfclient cfloader
      Built cfclient
Installed 22 packages in 164ms

==============================
 CrazyLoader Flash Utility
==============================

 Usage: /(...)/.cache/uv/archive-v0/_OZwn5_zGeTE-qFoK_kEG/bin/cfloader [CRTP options] <action> [parameters]

The CRTP options are described above

Crazyload option:
   info                    : Print the info of the bootloader and quit.
                             Will let the target in bootloader mode
   reset                   : Reset the device in firmware mode
   flash <file> [targets]  : flash the <img> binary file from the first
                             possible  page in flash and reset to firmware
                             mode.Code language: HTML, XML (xml)

This last command would likely be added to all our firmware Makefiles to be used when calling make cload to flash the Crazyflie.

Feedback?

This currently does seem like a good idea to us. If you have any feedback or ideas on how to handle Python projects in a better way we are very interested to hear them. Like I mentioned, the summer is kind of a ‘clean up’ time for us so this is when we have time to look at this kind of things.

Swarm robotics has undergone rapid evolution and is now used in real-world applications. At the center of this exciting journey is the Crazyflie. Although small, its capabilities make it ideal for swarming applications in research, education, and prototyping.

Small and Safe for Indoor Use

The Crazyflie 2.1+ is a nano-quadcopter that weights only 29g. Crazyflie swarms are safe to interact with and can fly in confined spaces like labs or classrooms. If the maximum recommended payload of 15g is not enough for your application, the Crazyflie 2.1 Brushless is a suitable alternative, as it has a recommended payload of 40g. These two platforms are compatible, allowing them to cooperate within a mixed swarm of your preference.

Setting Up a Crazyflie Swarm

Transitioning from a single Crazyflie to a swarm setup requires certain adjustments. Depending on the amount of data that you want to transfer to and from your Crazyflies, you might need to use more Crazyradio 2.0 dongles. We recommend 3-4 Crazyflies per radio but under ideal conditions each one can handle up to 15 drones. To get the most out of your swarm, you will also need an external positioning system. This could be a Lighthouse positioning system, a Loco positioning system or a Motion Capture system. This allows each Crazyflie to know its absolute position in space. A very interesting swarming project is Crazyswarm where they managed to fly a swarm of 49 Crazyflies using 3 Crazyradios and different positioning systems.

The Crazyswarm project. You can find the full video here.

Available Swarming Frameworks and Examples

To make your introduction to a Crazyflie swarm smoother, our python library contains a swarm class. It allows the user to control each drone in the swarm simultaneously, sending commands either in parallel or sequentially. The library also includes examples that demonstrate the capabilities of a Crazyflie swarm.
For users interested in exploring advanced decentralized swarm schemes, we support firmware that enables peer-to-peer communication. This is at an experimental level and has been used for the decentralized brushless swarm demo and for the ICRA 2025 demo.

Getting Started

Interested in building your first swarm? Explore our swarm bundles featuring multiple platforms and positioning systems that suit your research or development needs. If you are new to the Crazyflie ecosystem, make sure to follow the step-by-step swarm tutorial to better understand the setup process, communication flow, and control mechanisms involved in operating a drone swarm.

A couple of weeks ago, we were at ICRA 2025 in Atlanta. This year’s ICRA drew over 7,000 attendees, making it the biggest edition yet. We had a booth at the exhibition where we showed our decentralized swarm demo. The setup included a mix of Crazyflie 2.1+ units with Qi charging decks and Crazyflie 2.1 Brushless platforms with our new charging dock. The entire swarm operated onboard, with two Lighthouse base stations for positioning. More details about the setup can be found in the recent swarm demo blog post.

8 Crazyflies flying simultaneously in our decentralized swarm at ICRA 2025

Some of the brushless drones carried our high-powered LED deck prototype to make the swarm more visible and engaging. One of the drones also had a prototype camera streaming deck, which held up well despite the busy wireless environment.

A Different Perspective

This year we were also invited to participate in a workshop: 25 Years of Aerial Robotics: Challenges and Opportunities, where I (Rik) gave a short presentation about the evolution of positioning in the Crazyflie, from webcam-based AruCo marker tracking to the systems we use today.

Usually, we spend most of our time on the exhibition floor, so being part of a workshop like this was a different experience. It was interesting to hear researchers mention the Crazyflie in their work without needing to explain what it is. That kind of familiarity isn’t something we take for granted, and it was nice to see.

The workshop also gave us a chance to talk with both established researchers and newer faces in the field. What stood out most was hearing how people are using the Crazyflie in their work today. It’s very rewarding to see how what we do at the office connects with and supports real research.

Catching Up and Looking Around

One of the most rewarding parts of the conference was the chance to connect directly with people using the platform. We talked to many users, both current and past, and saw new research based on the platform. It was also great to reconnect with Flapper Drones, who build flapping-wing vehicles powered by the Crazyflie Bolt. And it was nice to see HopTo on the exhibition floor for the first time. The company is a spin-off from the Robotics and Intelligent Systems Lab at CityU Hong Kong, which published a Science Robotics paper on the hopcopter concept that used a Crazyflie. We also had the chance to catch up with a maintainer of CrazySim, an open-source simulator in the Crazyflie ecosystem. It’s always valuable to connect with people building on top of the platform, whether through research, hardware, or open-source tools.

Wrapping Up

ICRA 2025 was packed with activity. From demoing the swarm, to the workshop, to hallway conversations, it gave us a lot of valuable feedback and insight. Thanks to everyone who stopped by, joined a talk, or came to say hello.

As the demand for open, modular, and research-grade robotics continues to grow, Bitcraze is entering a strategic distribution partnership in China, one of the world’s most advanced and fast-evolving markets for robotics and education.

Researchers, educators, and industrial developers in China will benefit from easy access to Bitcraze’s entire product ecosystem. This includes high-performance indoor drones, positioning systems, and modular development tools widely used in academia and R&D across the globe.

Our new exclusive agreement with NOKOV Motion Capture, marks a step forward in expanding access to our autonomous drone systems and robotics development kits across China.

Expanding Access for China’s Robotics Community

Through NOKOV Motion Capture, customers in China gain professional support in Mandarin, short delivery times, and access to official training, demos, and bundled solutions. Together, we’re making it easier than ever for Chinese institutions to explore autonomous flight, precision tracking, and open-source robotics innovation.

A Powerful Integration of Motion Capture and Flight

One of the most exciting aspects of this partnership is the technical synergy between NOKOV Motion Capture’s industry-leading motion capture systems and Bitcraze’s versatile flight platforms. NOKOV Motion Capture’s optical tracking technology is already a staple in academic and industrial research labs throughout China.

By integrating this with Bitcraze’s drones and positioning systems, users can achieve highly accurate, low-latency indoor positioning, conduct repeatable flight experiments with synchronized motion data, and enjoy a seamless workflow from trajectory capture to analysis.

This combination opens up new possibilities for research in fields like robotics control, swarm behavior, artificial intelligence, and simulation.

Supporting Research, Education, and Development

Bitcraze’s systems have earned the trust of top universities and laboratories around the globe. With this partnership, we continue to support Chinese institutions working on:

  • Swarm robotics and AI research
  • STEM and engineering education
  • Indoor navigation and environment interaction
  • Lightweight aerial prototyping and simulation

We believe in giving innovators the tools they need to experiment freely, iterate faster, and go further.

Start Your Journey with Us

Whether you’re designing new robotic systems or preparing your classroom for hands-on drone-based learning, Bitcraze and NOKOV are here to support your ambitions.

If you’d like to learn more or get started with our products in China, please reach out to NOKOV for local support and information.

https://www.nokov.com/products/robotics/crazyflie-crazyswarm-platform.html

https://en.nokov.com/products/robotics-motion-capture/crazyflie-crazyswarm.html

Together, we’re making robotics innovation more accessible, collaborative, and inspiring for everyone.