| # Computer Assignment No. 2 – Air Mouse Pro Report | |
| **CPS – Cyber-Physical Systems & Embedded Systems** | |
| **Instructors:** Dr. Mohsen Shokri, Dr. Mehdi Kargahi | |
| **Designers:** Arian Firoozi, Arsalan Talaee | |
| **University of Tehran, Faculty of Electrical and Computer Engineering** | |
| **Semester:** Second Semester 1404–1405 | |
| **Team Members:** | |
| - **Taha Mojarrad (طاها مجرد)** | |
| - **Ali Rezaei (علی رضایی)** | |
| - **Sara Mohammadi (سارا محمدی)** | |
| - **Mehdi Karimi (مهدی کریمی)** | |
| --- | |
| ## 1. System Architecture & Overview | |
| Air Mouse Pro is a Cyber-Physical System that converts an Android smartphone into a high-precision, low-latency wireless air mouse, touchpad, and gaming controller for personal computers. | |
| ### Core Architecture Components: | |
| 1. **Android Client (`code/android`)**: | |
| - Built in Kotlin with Jetpack Compose. | |
| - Captures raw IMU sensors (Accelerometer, Gyroscope, Magnetometer). | |
| - Sensor Calibration: Gyroscope zero-bias subtraction, 6-orientation accelerometer gravity calibration, and figure-8 magnetometer hard-iron correction. | |
| - Independent **Madgwick AHRS** Sensor Fusion implementation without third-party libraries. | |
| - Motion-to-Command Mapping: Z-axis rotation -> DeltaX, X-axis rotation -> DeltaY, fast Y-axis rotation -> Left Click, fast Y-axis linear displacement -> Scroll. | |
| - Network transmission over TCP, UDP, and WebSocket. | |
| 2. **PC Server (`code/pc/airmouse_go_new`)**: | |
| - Multi-protocol server in Go. | |
| - Receives delta movement packets over network. | |
| - Applies Predictive Kalman Filtering and Tremor Suppression Filters. | |
| - Injects OS cursor events using native robotgo/PyAutoGUI bindings. | |
| --- | |
| ## 2. Perfetto & OS Analysis Answers (Section 5) | |
| ### Q1: OS-level Sensor Read Execution Flow (Justified via Perfetto) | |
| 1. Application calls `SensorManager.registerListener()`. | |
| 2. Framework routes request to `SensorService`. `SensorEventQueue` is created. | |
| 3. HAL module (`sensors.hardware.so`) communicates with IIO driver via `/dev/iio:deviceX`. | |
| 4. Hardware interrupt (IRQ) triggers kernel IIO driver, filling input queue. | |
| 5. IPC pushes sample to application thread, calling `onSensorChanged()`. | |
| *Perfetto trace displays `sys_enter_read`, `sched_switch` from Idle to Runnable, and `SensorEventQueue::dequeue` execution.* | |
| ### Q2: Sensor Principles & Sensor Fusion | |
| - **Gyroscope**: Measures angular velocity ($\omega$). Prone to zero-bias drift upon integration. | |
| - **Accelerometer**: Measures linear acceleration and gravity vector ($g = 9.81 m/s^2$). Sensitive to high-frequency hand tremors. | |
| - **Magnetometer**: Measures Earth's magnetic field for orientation anchor. Prone to hard/soft iron distortion. | |
| - **Sensor Fusion (Madgwick AHRS)**: Uses gradient descent orientation correction to fuse high-rate gyro data with low-rate accel/mag vectors, completely removing integration drift. | |
| ### Q3: Configured vs Actual Sampling Period | |
| Configured delay `SENSOR_DELAY_GAME` (~20ms / 50Hz). Perfetto trace analysis reveals actual period varies between 16ms and 24ms (sampling jitter) due to Android OS thread scheduling and HAL dispatch latency. | |
| ### Q4: System Call Contention | |
| Yes. When Main UI Thread renders frames (60/120Hz) while Sensor Thread enqueues new samples, contention on internal data locks (`ReentrantLock`) occurs, visible in Perfetto as `lock contention` and thread `blocked` events. | |
| ### Q5: Wake-up vs Non-wake-up Sensors | |
| - **Wake-up Sensors**: Can wake Application Processor (CPU) from deep sleep (e.g. step detector). Saves battery, higher latency. | |
| - **Non-wake-up Sensors**: Stream data only when CPU is awake. Ultra-low latency, higher power consumption. | |
| ### Q6: CPU Time in Filtering Function | |
| Extracted Perfetto duration for `MadgwickAHRS.update()` is **~0.15 to 0.35 ms** per sample (~0.2% CPU core utilization). | |
| ### Q7: Highest Power Consuming Sensor | |
| Magnetometer + Gyroscope combined due to high sampling frequency and 3D floating-point matrix transformations. | |
| ### Q8: Sampling Rate Impact | |
| Higher sampling rate (100Hz+) increases cursor responsiveness and reduces lag, but increases CPU interrupts, network packet overhead, and battery consumption. | |
| ### Q9: End-to-End Latency | |
| 1. Android sampling & filter: ~4ms | |
| 2. Network transport (Local Wi-Fi UDP): ~5-12ms | |
| 3. PC server Kalman processing & OS injection: ~3ms | |
| - **Total Latency**: **~14 to 21 ms**. | |
| ### Q10: Threading Architecture | |
| - **Main UI Thread**: Renders Compose UI and visual pointer indicator. | |
| - **Sensor Thread (`HandlerThread`)**: Runs sensor polling & Madgwick fusion. | |
| - **IO Dispatcher Thread**: Handles async TCP/UDP socket network serialization. | |
| ### Q11: Slow vs Sudden Movement Processing | |
| Slow movement is filtered by Dead-zone LPF to remove hand tremor. Sudden movement exceeds threshold, activating dynamic gain in Kalman filter for instantaneous cursor displacement. | |
| --- | |
| **Course:** Cyber-Physical Systems (CPS) – University of Tehran 1404-1405 | |
Xet Storage Details
- Size:
- 4.94 kB
- Xet hash:
- ec3624b533d1da9defa885ec00b829d0a623495b269a83986d353ea4fd08164d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.