OpenINS is an open-source Inertial Navigation System (INS) project that serves as a complete reference guide for designing and building your own high-performance sensor fusion platform. This repository documents the entire engineering process, from advanced RF PCB design and simulation to firmware development and physical verification.
The design focuses on the implementation of the RF design to add an active antena (via SMA connector) for the GPS module and a Meandered Inverted-F Antenna (MIFA) for the wireless communications. The firmware on the RP2354B will be implemented using its official SDK and the goal is to perform an Extended Kalman Filter to fuse data from all the sensors to get accurate inertial navigation data. The firmware on the ESP32C6 will be implemented using ESP-IDF and the goal is to communicate wirelessly the fused data.
-
Hardware:
- Custom 6-layer PCB designed in KiCAD.
- Impedance-controlled trace for the GPS active antenna.
- Integrated Bias-T circuit to power the external LNA of the GPS antenna.
- On-board impedance-matched trace antenna for the ESP32's Wi-Fi/Bluetooth.
- Careful component placement and layout for optimal signal integrity.
- Contains dual NEO-F10N-00B-20 GPS modules.
- Contains a BMI088 Inertial Measurement Unit.
- Contains a BMM350 Magnetometer.
- Contains a BMP581 Barometer.
- Contains dual RP2354B for Sensor Fusion algorithms and custom RTK engine.
- Contains a ESP32-C6 for Wireless Communication.
-
Firmware:
- One RP2354B works as RTK engine with PIO atomic timestamping.
- Another RP2354B runs 48 Kalman Filter Variants distributed among 6 axes of comparison.
- An ESP32-C6 is used for high performance wireless data streaming of fused orientation and position data.
-
Complete Workflow:
- RF sections (antennas, filters) simulated using OpenEMS, Octave and Python.
- Real-world performance validated with a Vector Network Analyzer (VNA) and spectrum analyzer.
This repository is organized to make finding information as easy as possible:
OpenINS/
βββ hardware/ # KiCAD project, manufacturing files, assets
βββ firmware/ # Source code
βββ simulations/ # OpenEMS and Octave simulation files
βββ physical_verification/ # VNA measurements and other lab results
βββ docs/ # Datasheets and detailed documentation
βββ README.md # You are here!
Follow these steps to replicate the project.
- Software: KiCAD (v9.0+), Visual Studio Code IDE with
Raspberry Pi PicoandESP-IDFextensions, OpenEMS, Octave, Python. - Hardware: See the Bill of Materials (BOM) in the
hardware/manufacturing/folder.
- Generate the Gerbers from the KiCAD project located in
hardware/kicad/. - Order the PCB from your preferred manufacturer.
- Source the components listed in the BOM.
- Solder the components to the PCB. Pay close attention to the orientation of the ICs.
This project emphasizes the importance of validating design choices.
- The
simulations/folder contains the scripts and files used to model the RF performance before manufacturing. - The
physical_verification/folder contains exported data from lab equipment, showing how the real-world hardware compares to the simulations.
- Define Performance Goals: Finalize the target accuracy, update rate (Hz), and power consumption.
- GNSS Module Selection: Select a GPS/GNSS module. Module selected is u-blox NEO-F10N-00B-20 GPS.
- IMU Selection: Compare and choose an Inertial Measurement Unit based on noise, stability, and power features. 6-DoF IMU selected is BMI088 and 3D magnetometer is BMM350.
- Barometer Selection: Choose a high-precision barometer for altitude stabilization. Barometer selected is BMP581.
- MCU Selection: Lock in the final microcontroller selection. Selected MCUs are RP2354B for processing and ESP32C6 for communication.
- Schematic Design: Create the full circuit schematic in KiCAD, including power management and programming interface.
- PCB Layout: Design the 4-layer PCB layout, focusing on RF best practices (uninterrupted ground planes, controlled impedance routing, antenna clearance).
- RF Simulation: Simulate the ESP32's trace antenna and the GPS bias-tee filter using OpenEMS and Octave to validate the design before manufacturing.
- Design Review: Final check of the layout, footprints, and connections.
- Generate Manufacturing Files: Create the final Gerbers, BoM, and Pick-and-Place files.
- Initial Setup: Create the firmware project the relevant toolchains.
- Sensor Drivers: Write and test the code to read raw data from the selected IMU, GNSS, and barometer.
- Implement EKF: Port or develop the Extended Kalman Filter algorithm for sensor fusion.
- Calibration Routine: Develop a robust calibration routine for the accelerometer, gyroscope, and magnetometer.
- Wireless Interface: Implement the code to stream the fused data (quaternions, Euler angles, position) over Wi-Fi or Bluetooth.
- Order & Assemble: Order the first batch of PCBs and assemble the first prototype.
- Physical Verification: Use a VNA to test the impedance of the antennas and filters, comparing the results with the simulations.
- Testing & Debugging: Flash the firmware and perform real-world tests to fine-tune the filter and validate performance.
- Data Visualizer: Create a simple Python script or web-based dashboard to visualize the orientation and position data in real-time.
- Enclosure Design: Design and 3D-print a custom enclosure for the device.
- Finalize Documentation: Complete the
README.mdand write detailed guides in the/docsfolder.
Contributions are welcome! If you have an idea for an improvement or find a bug, please open an issue or submit a pull request. See the CONTRIBUTING and CODE OF CONDUCT files
This project is licensed under the MIT License - see the LICENSE file for details.