<style>
:root {
--primary-color: #2563eb;
--primary-dark: #1d4ed8;
--background-color: #ffffff;
--text-primary: #1e293b;
--text-secondary: #475569;
--card-background: #ffffff;
--shadow-color: rgba(0, 0, 0, 0.1);
}
@media (prefers-color-scheme: dark) {
:root {
--primary-color: #3b82f6;
--primary-dark: #2563eb;
--background-color: #1e293b;
--text-primary: #f8fafc;
--text-secondary: #cbd5e1;
--card-background: #334155;
--shadow-color: rgba(0, 0, 0, 0.3);
}
}
</style>
<div style="max-width: 1000px; margin: 0 auto; font-family: 'Arial', sans-serif;">
<!-- Combined Header and Logo Section -->
<div style="
background: var(--primary-color);
padding: 40px 40px 60px 40px;
border-radius: 12px;
margin-bottom: 40px;
box-shadow: 0 4px 15px var(--shadow-color);
">
<h1 style="
color: #FFFFFF;
font-size: 36px;
margin: 0 0 40px 0;
letter-spacing: 1px;
font-weight: 500;
text-align: center;
">Research and Project Proposal</h1>
<!-- Logo Container with Flexbox -->
<div style="
display: flex;
justify-content: center;
align-items: center;
gap: 60px;
max-width: 800px;
margin: 0 auto;
">
<!-- Playard Logo -->
<div style="
flex: 0 1 300px;
padding: 25px;
background: var(--card-background);
border-radius: 12px;
box-shadow: 0 4px 6px var(--shadow-color);
transition: transform 0.3s ease, box-shadow 0.3s ease;
" onmouseover="this.style.transform='translateY(-5px)';this.style.boxShadow='0 6px 12px var(--shadow-color)';"
onmouseout="this.style.transform='translateY(0)';this.style.boxShadow='0 4px 6px var(--shadow-color)';">
<img src="https://hackmd.io/_uploads/rkWlrcjZ1g.svg" alt="Playard Logo" style="width: 100%; height: auto;"/>
</div>
<!-- Customer Logo -->
<div style="
flex: 0 1 300px;
padding: 25px;
background: var(--card-background);
border-radius: 12px;
box-shadow: 0 4px 6px var(--shadow-color);
transition: transform 0.3s ease, box-shadow 0.3s ease;
" onmouseover="this.style.transform='translateY(-5px)';this.style.boxShadow='0 6px 12px var(--shadow-color)';"
onmouseout="this.style.transform='translateY(0)';this.style.boxShadow='0 4px 6px var(--shadow-color)';">
<img src="https://hackmd.io/_uploads/r1cQ-vibkx.png" alt="Customer Logo" style="width: 100%; height: auto;"/>
</div>
</div>
</div>
<!-- Project Title Section -->
<div style="text-align: center; padding: 20px 40px; margin-bottom: 40px;">
<h2 style="
color: var(--primary-color);
font-size: 42px;
margin-bottom: 15px;
font-weight: 600;
">Relentless Golf</h2>
<h3 style="
color: var(--text-secondary);
font-size: 24px;
font-weight: 400;
margin-top: 0;
">Golf Kinematic Sequence Analyzer</h3>
</div>
<!-- Year -->
<div style="text-align: center; margin-bottom: 40px;">
<p style="
color: var(--text-secondary);
font-size: 20px;
font-weight: 500;
">2024</p>
</div>
<!-- Bottom Bar -->
<div style="
height: 6px;
background: var(--primary-color);
border-radius: 3px;
margin-bottom: 40px;
box-shadow: 0 2px 4px var(--shadow-color);
"></div>
</div>
# Science Behind the Golf Kinematics
## Understanding Different Swing Patterns
### Simulation
### 1. Professional Swing Pattern

*Perfect sequence with ideal timing: Notice how the hips initiate the movement, followed by the torso, and finally the arms. This creates maximum power with minimum effort.*
### 2. Over The Top Pattern

*Common fault where arms move too early: This pattern often leads to slicing and loss of power. Compare the arm movement timing with the professional pattern above.*
### 3. Early Extension Pattern

*Hip thrust pattern: Notice how the hip rotation differs from the professional pattern, causing loss of spine angle and inconsistent contact.*
### 4. Slow Transition Pattern

*Delayed downswing initiation: Observe how the transition from backswing to downswing is slower, reducing potential power generation.*
### 5. Fast Hips Pattern

*Overly aggressive hip rotation: The hips rotate too quickly, not allowing proper sequence development and power transfer.*
## Key Points to Observe in Each Pattern:
1. **Hip Movement** (Blue Segment)
- Initiates the downswing
- Sets the sequence timing
- Controls rotation speed
2. **Torso Rotation** (Green Segment)
- Follows hip movement
- Creates torque multiplication
- Maintains spine angle
3. **Arms/Club Path** (Red Segment)
- Responds to body rotation
- Shows lag and release
- Indicates swing efficiency
### 1. Real-Time Motion Capture
Just like in our simulation, we'll track three key body segments:
- 🔵 Hips (Blue sensor)
- 🟢 Upper Body/Torso (Green sensor)
- 🔴 Arms/Club (Red sensor)
But instead of computer animation, we'll use real IMU sensors (BNO085) attached to your body that can detect:
- Exact rotation angles
- Movement speed
- Acceleration
- Position changes
### 2. Pattern Recognition
```mermaid
flowchart LR
classDef sensorNode fill:#2E86C1,stroke:#000,stroke-width:2px,color:#fff
classDef processNode fill:#27AE60,stroke:#000,stroke-width:2px,color:#fff
classDef feedbackNode fill:#E74C3C,stroke:#000,stroke-width:2px,color:#fff
S1["Sensor Data"]:::sensorNode --> P1["Compare with\nIdeal Pattern"]:::processNode
P1 --> P2["Calculate\nDeviations"]:::processNode
P2 --> F1["Real-time\nAudio Feedback"]:::feedbackNode
```
### What is an IMU?
An IMU (Inertial Measurement Unit) is a sophisticated electronic device that combines multiple sensors to measure motion, orientation, and environmental conditions. Think of it as your smartphone's ability to know when you rotate it or move it, but with much higher precision and speed.
### BNO085: Our Chosen IMU

*The BNO085 is a high-precision smart sensor with built-in processing capabilities*
#### Key Features:
1. **9-Axis Sensing**
- 3-axis Accelerometer: Measures linear movement
- 3-axis Gyroscope: Detects rotation
- 3-axis Magnetometer: Determines orientation
2. **Built-in Processing**
- Automatic sensor fusion
- Self-calibration
- Error correction
- Low latency (fast response)
### Motion Capture System
#### 1. Sensor Placement
We'll track three key body segments with precision sensors:
- 🔵 **Hips (Base Sensor)**
* Measures core rotation
* Tracks power initiation
* Monitors hip sway and thrust
- 🟢 **Upper Body/Torso (Mid Sensor)**
* Analyzes spine angle
* Measures shoulder rotation
* Tracks torso-hip differential
- 🔴 **Arms/Club (Lead Sensor)**
* Monitors swing path
* Measures club head speed
* Tracks lag and release
#### 2. What We Measure
```mermaid
flowchart TB
classDef measureNode fill:#2E86C1,stroke:#000,stroke-width:2px,color:#fff
classDef dataNode fill:#27AE60,stroke:#000,stroke-width:2px,color:#fff
subgraph Measurements["Key Measurements"]
direction TB
M1["Rotation"]:::measureNode
M2["Acceleration"]:::measureNode
M3["Angular Velocity"]:::measureNode
M4["Orientation"]:::measureNode
D1["0-360° angles\n±2000°/sec"]:::dataNode
D2["±16g force\n0.01g resolution"]:::dataNode
D3["Real-time speed\n1000Hz sampling"]:::dataNode
D4["3D positioning\n0.1° accuracy"]:::dataNode
M1 --> D1
M2 --> D2
M3 --> D3
M4 --> D4
end
```
# Golf Training System
## System Architecture
```mermaid
flowchart TB
classDef nodeHW fill:#2E86C1,stroke:#000,stroke-width:2px,color:#fff
classDef audioNode fill:#27AE60,stroke:#000,stroke-width:2px,color:#fff
classDef powerNode fill:#E74C3C,stroke:#000,stroke-width:2px,color:#fff
classDef appNode fill:#8E44AD,stroke:#000,stroke-width:2px,color:#fff
classDef networkNode fill:#F39C12,stroke:#000,stroke-width:2px,color:#fff
subgraph Nodes["Smart Audio Sensor Nodes"]
direction TB
subgraph Node1["Node 1 - Pelvis"]
direction LR
N1_IMU["BNO085\nOrientation"]:::nodeHW
N1_NRF["nRF52\n- Local Analysis\n- Audio Gen\n- BLE Mesh"]:::nodeHW
N1_AUD["Buzzer\n- Timing\n- Speed"]:::audioNode
N1_BAT["🔋 LiPo\n130mAh"]:::powerNode
end
subgraph Node2["Node 2 - Thorax"]
direction LR
N2_IMU["BNO085\nOrientation"]:::nodeHW
N2_NRF["nRF52\n- Local Analysis\n- Audio Gen\n- BLE Mesh"]:::nodeHW
N2_AUD["Buzzer\n- Rotation\n- Sequence"]:::audioNode
N2_BAT["🔋 LiPo\n130mAh"]:::powerNode
end
subgraph Node3["Node 3 - Club"]
direction LR
N3_IMU["BNO085\nOrientation"]:::nodeHW
N3_NRF["nRF52\n- Local Analysis\n- Audio Gen\n- BLE Mesh"]:::nodeHW
N3_AUD["Buzzer\n- Speed\n- Impact"]:::audioNode
N3_BAT["🔋 LiPo\n130mAh"]:::powerNode
end
end
subgraph Mobile["📱 Mobile Application"]
direction TB
APP["Mobile App\n- Configuration\n- Data Analysis\n- Training History"]:::appNode
CLOUD["Cloud Storage"]:::networkNode
end
%% Node internal connections
N1_IMU --> N1_NRF --> N1_AUD
N2_IMU --> N2_NRF --> N2_AUD
N3_IMU --> N3_NRF --> N3_AUD
%% Wireless connections
N1_NRF <--> |"BLE Mesh\nSync & Timing"| N2_NRF
N2_NRF <--> |"BLE Mesh\nSync & Timing"| N3_NRF
N1_NRF & N2_NRF & N3_NRF --> |"Data"| APP
APP --> CLOUD
```
### Audio Generation
```mermaid
flowchart TB
classDef pelvisNode fill:#2E86C1,stroke:#000,stroke-width:2px,color:#fff
classDef thoraxNode fill:#27AE60,stroke:#000,stroke-width:2px,color:#fff
classDef clubNode fill:#E74C3C,stroke:#000,stroke-width:2px,color:#fff
classDef patternNode fill:#F39C12,stroke:#000,stroke-width:2px,color:#fff
subgraph Patterns["Audio Pattern Specifications"]
direction TB
subgraph Pelvis["Pelvis Node Patterns (200-400Hz)"]
direction LR
P1["Early Rotation\n⚠️ 3 quick beeps\n200Hz, 100ms each"]:::pelvisNode
P2["Perfect Timing\n✅ Single long beep\n300Hz, 500ms"]:::pelvisNode
P3["Late Rotation\n⚠️ 2 slow beeps\n400Hz, 250ms each"]:::pelvisNode
end
subgraph Thorax["Thorax Node Patterns (500-800Hz)"]
direction LR
T1["Wrong Sequence\n⚠️ Descending tones\n800→500Hz, 200ms"]:::thoraxNode
T2["Good Sequence\n✅ Ascending tones\n500→800Hz, 200ms"]:::thoraxNode
T3["Over Rotation\n⚠️ Continuous tone\n600Hz, 300ms"]:::thoraxNode
end
subgraph Club["Club Node Patterns (900-1200Hz)"]
direction LR
C1["Slow Speed\n⚠️ Low pitch pulse\n900Hz, 150ms"]:::clubNode
C2["Ideal Speed\n✅ High pitch tone\n1100Hz, 200ms"]:::clubNode
C3["Too Fast\n⚠️ High-Low warble\n1200-900Hz, 100ms"]:::clubNode
end
subgraph Sync["Combined Patterns"]
direction TB
S1["Perfect Swing\n✅ Harmonious ascending\nAll nodes sequential"]:::patternNode
S2["Timing Error\n⚠️ Dissonant pattern\nError node emphasized"]:::patternNode
end
end
```
### Audio System Timing Diagram
```mermaid
sequenceDiagram
participant IMU as BNO085
participant MCU as nRF52
participant Hub as Mobile App
participant Audio as Audio System
Note over IMU,Audio: Initialization Phase
IMU->>MCU: Config Ready
MCU->>Hub: Node Connected
Note over IMU,Audio: Calibration Phase
Hub->>MCU: Request Calibration
MCU->>IMU: Start Calibration
IMU-->>MCU: Calibration Status
MCU-->>Hub: Calibration Complete
Note over IMU,Audio: Data Collection (100Hz)
loop Every 10ms
IMU->>MCU: Sensor Data
MCU->>MCU: Process Data
MCU->>Hub: Send Packet
end
Note over IMU,Audio: Swing Detection
Hub->>Hub: Detect Swing Start
Note over IMU,Audio: Real-time Processing
loop During Swing
IMU->>MCU: High-Speed Data
MCU->>Hub: Processed Data
Hub->>Hub: Analyze Sequence
Hub->>Audio: Generate Feedback
end
Note over IMU,Audio: Post-Swing Analysis
Hub->>Hub: Complete Analysis
Hub->>Audio: Final Feedback
Hub->>MCU: Reset for Next Swing
```
### Node Software Flow
```mermaid
stateDiagram-v2
[*] --> Initialization
state Initialization {
[*] --> SensorConfig
SensorConfig --> CalibrationCheck
CalibrationCheck --> Ready
}
state DataCollection {
[*] --> CollectIMUData
CollectIMUData --> ProcessData
ProcessData --> DetectMovement
DetectMovement --> SendData
}
state AudioGeneration {
[*] --> AnalyzeSpeed
AnalyzeSpeed --> TimingCheck
TimingCheck --> GenerateSound
}
Ready --> DataCollection : Start Recording
DataCollection --> AudioGeneration : Movement Detected
AudioGeneration --> DataCollection : Complete
state "Sensor Configuration" as SensorConfig {
BNO085_Config
RadioConfig
BuzzerConfig
}
state "Movement Analysis" as DetectMovement {
CheckRotationalSpeed
CheckLinearSpeed
PatternMatching
}
state "Sound Generation" as GenerateSound {
SpeedToVolume
TimingToDuration
PlayFeedback
}
```
## What Are We Matching?
Think of a golf swing like a musical symphony - every part needs to move in perfect harmony. We're creating a system that listens to this "body symphony" and tells you when you're hitting the right notes at the right time.
```mermaid
flowchart TB
classDef perfectNode fill:#27AE60,stroke:#000,stroke-width:2px,color:#fff
classDef errorNode fill:#E74C3C,stroke:#000,stroke-width:2px,color:#fff
classDef infoNode fill:#3498DB,stroke:#000,stroke-width:2px,color:#fff
subgraph IDEAL["Ideal Swing Sequence"]
I1["1. Pelvis Start\n22-25 mph"]:::perfectNode
I2["2. Thorax Follow\n45-50 mph"]:::perfectNode
I3["3. Arms Speed\n70-75 mph"]:::perfectNode
I4["4. Club Impact\n90-100 mph"]:::perfectNode
I1 --> I2 --> I3 --> I4
end
subgraph SYSTEM["Real-time Analysis"]
S1["Sensor\nMeasurements"]:::infoNode
S2["Pattern\nComparison"]:::infoNode
S3["Audio\nFeedback"]:::infoNode
S1 --> S2 --> S3
end
subgraph FEEDBACK["Feedback Types"]
F1["Perfect: Ascending Tone"]:::perfectNode
F2["Early: Warning Beep"]:::errorNode
F3["Slow: Low Tone"]:::errorNode
end
IDEAL --> SYSTEM --> FEEDBACK
```
# Development Roadmap
## Fast Prototyping Approach
### Why Fast Prototyping?
Before diving into full-scale hardware development, we need to validate our system design and gather real-world insights. This approach allows us to:
- Test our core functionality quickly
- Identify potential issues early
- Refine our system requirements
- Begin software development in parallel
- Save time and resources
## Two-Phase Prototype Development
### Phase 1: Quick Assembly Test System
In this phase, we'll create working prototypes using off-the-shelf development boards. Think of it as building with "electronic LEGO" - quick to assemble and easy to modify.
#### Components Needed:
- **5x nRF52840 Development Boards** ([Adafruit nRF52840 Express](https://www.digikey.com/en/products/detail/adafruit-industries-llc/4062/9843410))
- Bluetooth connectivity
- Built-in USB charging
- Easy programming interface
- **5x BNO085 IMU Sensors** ([Adafruit BNO085](https://www.adafruit.com/product/4754))
- 9-axis motion sensing
- Built-in sensor fusion
- Perfect for tracking body movement
#### Assembly Plan:
1. Connect BNO085 to nRF52 boards
2. Add LiPo batteries for portability
3. 3D print simple protective cases
4. Create mounting straps for body attachment
This setup will let us:
- Start software development immediately
- Test sensor placement on the body
- Validate our audio feedback system
- Experiment with different configurations
### Phase 2: Custom PCB Development
While Phase 1 is ongoing, we'll move to creating our first custom PCB. This isn't the final product, but rather a refined prototype that will:
- Be smaller and lighter
- Use less power
- Be more reliable for extended testing
- Help us optimize component placement
#### Custom PCB Features:
- Integrated nRF52 and BNO085
- Optimized power management
- Smaller form factor
- Better durability for testing
## What This Achieves
This two-phase approach gives us several advantages:
1. **Quick Start**: We can begin testing within days of receiving components
2. **Risk Reduction**: Major issues can be identified before custom PCB design
3. **Parallel Development**: Software work can progress while hardware is being refined
4. **User Feedback**: Early testing with real golfers can guide development
5. **Cost Effective**: Changes are cheaper at the prototype stage
### Phase 3: Web Application Prototype (Cross Platform)
```mermaid
flowchart TD
classDef userNode fill:#3498DB,stroke:#000,stroke-width:2px,color:#fff
classDef deviceNode fill:#2ECC71,stroke:#000,stroke-width:2px,color:#fff
classDef featureNode fill:#9B59B6,stroke:#000,stroke-width:2px,color:#fff
classDef dataNode fill:#E74C3C,stroke:#000,stroke-width:2px,color:#fff
classDef storageNode fill:#F1C40F,stroke:#000,stroke-width:2px,color:#fff
subgraph User["User Interface Layer"]
direction TB
UI1["Device Connection\n& Management"]:::userNode
UI2["Real-time\nVisualization"]:::userNode
UI3["Analysis\nDashboard"]:::userNode
end
subgraph Devices["Sensor Layer"]
direction TB
D1["Hip Sensor\nBLE Device"]:::deviceNode
D2["Torso Sensor\nBLE Device"]:::deviceNode
D3["Club Sensor\nBLE Device"]:::deviceNode
end
subgraph Features["Processing Layer"]
direction TB
F1["Pattern\nRecognition"]:::featureNode
F2["Data\nAnalysis"]:::featureNode
F3["Performance\nMetrics"]:::featureNode
end
subgraph Storage["Data Storage"]
direction TB
S1["Session\nHistory"]:::storageNode
S2["User\nPreferences"]:::storageNode
S3["Pattern\nTemplates"]:::storageNode
end
%% Connections
Devices --> UI1
UI1 --> Features
Features --> UI2
Features --> UI3
Features <--> Storage
%% Add notes
style User fill:#fff,stroke:#000
style Devices fill:#fff,stroke:#000
style Features fill:#fff,stroke:#000
style Storage fill:#fff,stroke:#000
```
For rapid development and quick validation of our golf swing analysis system, we'll create a web-based prototype application that allows us to demonstrate core functionalities and gather user feedback efficiently.
### 1. Device Connection Interface
- Simple device scanning and connection
- Device configuration options
### 2. Real-Time Data Visualization
- Live swing data display from sensors
- Visual representation of body positions
- Simple 2D animation of swing sequence
- Basic metrics display (speed, angles, timing)
### 3. Basic Analysis Features
- Swing pattern comparison
- Simple performance metrics
- Session history view
- Basic data export
## Technology Stack
We'll use modern web technologies for rapid development:
- React for user interface
- Web Bluetooth API for sensor connection
- Canvas/SVG for visualizations
- Local storage for session data
### Planned output of the first 3 phases
Below are photos of a similar product currently in our workshop. At the end of the first 3 phases, a product similar to this product will emerge.
<div style="display: flex;">
<img src="https://hackmd.io/_uploads/rkGGoYjWJe.jpg" alt="Photo 1" style="width: 33%;">
<img src="https://hackmd.io/_uploads/rkzfsYoWJx.jpg" alt="Photo 2" style="width: 33%;">
<img src="https://hackmd.io/_uploads/HJMMsto-kx.jpg" alt="Photo 3" style="width: 33%;">
</div>
# Technical Challenges
### Placement Challenges
- Different body types require flexible mounting solutions
- Optimal sensor positions may vary by user
- Movement artifacts from loose attachments
- Need for robust yet comfortable mounting system
- Node count can be vary
# Project Timeline and Budget Estimation
## Timeline Breakdown
| Phase | Duration | Hours/Week | Total Hours | Activities |
|-------|----------|------------|-------------|------------|
| **Phase 1: Quick Assembly** | 2-3 weeks | 35 | 70-105 | - Hardware assembly<br>- Initial firmware development<br>- Basic sensor integration<br>- Testing connections |
| **Phase 2: Custom PCB** | 2-3 weeks | 35 | 70-105 | - PCB design<br>- Component optimization<br>- Power management<br>- Testing and validation |
| **Phase 3: Web Application** | 2 weeks | 35 | 70 | - UI development<br>- BLE integration<br>- Data visualization<br>- Basic analysis features |
| **Total** | 6-8 weeks | 35 | 210-280 | |
## Budget Estimation
### Hardware Costs (Phase 1)
| Component | Quantity | Unit Price ($) | Total ($) |
|-----------|----------|----------------|-----------|
| nRF52840 Dev Board | 5 | 25.95 | 129.75 |
| BNO085 Sensors | 5 | 20.95 | 104.75 |
| LiPo Batteries | 5 | 9.95 | 49.75 |
| 3D Printing Materials | - | 50.00 | 50.00 |
| Misc. Components | - | 100.00 | 100.00 |
| **Total Hardware** | | | **434.25** |
### Development Labor
| Phase | Hours | Rate ($/hr) | Total ($) |
|-------|-------|-------------|-----------|
| Phase 1 | 70-105 | 40 | Hours × Rate |
| Phase 2 | 70-105 | 40 | Hours × Rate |
| Phase 3 | 70 | 40 | Hours × Rate |
| **Total Hours** | 210-280 | | |
## Next Steps (to Kickstart our Project)
After getting your approval, we can:
1. Order the development boards and sensors
2. Begin assembly of the first test unit
3. Start basic software development
4. Design the first 3D printed cases
5. Begin preliminary PCB design
### Product Links
-> nRF52840 Development Boards (https://www.digikey.com/en/products/detail/adafruit-industries-llc/4062/9843410)
-> BNO085 -> (https://www.adafruit.com/product/4754)