feat: add IMU Python package with pybind11 bindings

- Add dm_imu_pkg/__init__.py to dynamically load compiled IMU module during development and installation
- Update .vscode/settings.json to ignore missing CMakeLists for flexible builds
- Generate egg-info metadata and package structure for distribution
This commit is contained in:
2025-12-08 23:54:56 +08:00
parent 74a2d8c355
commit c3dac34dcc
95 changed files with 445 additions and 8824 deletions

70
src/pybind_imu/example.py Normal file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/env python3
"""
example.py Demonstrates how to use the pybind11wrapped DMIMU driver.
Prerequisites
-------------
* The compiled shared library `imu_py*.so` must exist (see README.md for build steps).
* The current user must have read/write access to the IMU serial device
(e.g. /dev/ttyACM1). Use `sudo` or add the user to the `dialout` group
if necessary.
Usage
-----
$ python3 example.py
"""
import pathlib
import importlib.util
import sys
import signal
import time
# ----------------------------------------------------------------------
# Load the compiled extension module.
# Adjust the path if you installed the .so elsewhere.
# ----------------------------------------------------------------------
module_path = pathlib.Path(__file__).parent / "build" / "imu_py.cpython-310-aarch64-linux-gnu.so"
if not module_path.is_file():
sys.stderr.write(f"Error: compiled module not found at {module_path}\n")
sys.exit(1)
spec = importlib.util.spec_from_file_location("imu_py", module_path)
imu_py = importlib.util.module_from_spec(spec)
spec.loader.exec_module(imu_py)
# ----------------------------------------------------------------------
# Helper to cleanly stop the IMU thread on SIGINT / SIGTERM.
# ----------------------------------------------------------------------
def _signal_handler(sig, frame):
print("\nReceived interrupt stopping IMU...")
imu.stop()
sys.exit(0)
signal.signal(signal.SIGINT, _signal_handler)
signal.signal(signal.SIGTERM, _signal_handler)
# ----------------------------------------------------------------------
# Create an IMU instance.
# You can change the serial port or baud rate if your hardware differs.
# ----------------------------------------------------------------------
imu = imu_py.DmImu("/dev/ttyACM0", 921600)
print("Starting IMU data acquisition...")
imu.start()
print("Press CtrlC to stop.\n")
try:
while True:
data = imu.getData()
# Prettyprint the dictionary; you may replace this with logging, saving, etc.
print(
f"acc: ({data['accx']:.3f}, {data['accy']:.3f}, {data['accz']:.3f}) "
f"gyro: ({data['gyrox']:.3f}, {data['gyroy']:.3f}, {data['gyroz']:.3f}) "
f"euler: (roll={data['roll']:.2f}, pitch={data['pitch']:.2f}, yaw={data['yaw']:.2f})"
)
# Adjust the sleep interval as needed (here we poll at ~10Hz).
time.sleep(0.01)
except KeyboardInterrupt:
# Fallback in case the signal handler missed the interrupt.
_signal_handler(None, None)