File size: 11,220 Bytes
700dd75 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | # Motion Tracking and Kinematic Planner with Keyboard Controls
<figure style="margin: 1em 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/Navigation.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">In-the-wild navigation demo using the kinematic planner with keyboard controls.</figcaption>
</figure>
```{video} ../_static/Keyboard_Guidance.mp4
:width: 100%
```
*Video: Keyboard control walkthrough β starting the control system, playing reference motions, and using planner mode for real-time locomotion.*
Control the robot using keyboard commands for reference motion playback and planner-based locomotion (using `--input-type keyboard`).
```{admonition} Prerequisites
:class: note
Complete the [Quick Start](../getting_started/quickstart.md) to have the sim2sim loop running.
```
```{admonition} Emergency Stop
:class: danger
Press **`O`** at any time to immediately stop control and exit. Always keep a hand near the keyboard ready to press **`O`**.
```
## Launch
**Sim2Sim (MuJoCo):**
```bash
# Terminal 1 β MuJoCo simulator (from repo root)
source .venv_sim/bin/activate
python gear_sonic/scripts/run_sim_loop.py
# Terminal 2 β C++ deployment (from gear_sonic_deploy/)
bash deploy.sh --input-type keyboard sim
```
**Real Robot:**
```bash
# From gear_sonic_deploy/
bash deploy.sh --input-type keyboard real
```
## Step-by-Step: Normal Mode (Reference Motion Tracking)
Normal Mode plays back pre-loaded reference motions. This is the default mode when the program starts.
1. In Terminal 2, press **`]`** to start the control system.
2. In the MuJoCo window, press **`9`** to drop the robot to the ground.
3. Go back to Terminal 2, press **`T`** to play the current reference motion β the robot executes it to completion.
4. Press **`N`** to switch to the next motion sequence, or **`P`** for the previous one.
5. Press **`T`** again to play the new motion.
6. To replay the same motion, press **`T`** again after it finishes. To stop mid-motion and return to the first frame, press **`R`** β the robot pauses at the first frame without terminating the policy.
7. Use **`Q`** / **`E`** to nudge the heading left or right (Β±Ο/12 rad per press).
8. Press **`I`** to reinitialize the base quaternion and reset the heading to zero, i.e. robot will think the current facing is the facing at the first frame of the reference.
9. When done, press **`O`** to stop control and exit.
## Step-by-Step: Planner Mode (Real-time Motion Generation)
Planner Mode lets you control the robot in real time β choose a locomotion style, steer with WASD, and adjust speed and height on the fly.
1. From Normal Mode, press **`ENTER`** to switch to Planner Mode. The terminal will print `Planner enabled`.
2. The robot starts in the **Locomotion** motion set. Press **`1`** for slow walk, **`2`** for walk, or **`3`** for run.
3. Press **`W`** to walk forward. The robot uses a momentum system β holding a direction key sets momentum to full; releasing it lets the robot gradually decelerate and return to idle.
4. Steer with **`A`** / **`D`** (adjust heading and moving direction together) or turn in place with **`Q`** / **`E`** (Β±Ο/6 rad per press, only facing direction).
5. Press **`,`** / **`.`** to strafe left / right.
6. Press **`S`** to move backward.
7. Adjust speed with **`9`** (decrease) / **`0`** (increase). Speed ranges depend on the current mode (see tables below).
8. Press **`N`** to cycle to the next motion set (Locomotion β Squat β Boxing β Styled Walking β β¦). Use **`P`** to go back.
9. Within a motion set, press **`1`**β**`8`** to pick a specific mode (see the Motion Sets section below).
10. For squat-type modes, adjust body height with **`-`** (lower) / **`=`** (higher), clamped to 0.2β0.8 m.
11. If you need an immediate halt, press **`R`**, **`` ` ``**, or **`~`** β this resets movement momentum to zero instantly.
12. Press **`ENTER`** again to return to Normal Mode, or **`O`** to stop and exit.
## Control Reference
### System Controls (Both Modes)
| Key | Action |
|-----|--------|
| **]** | Start control system |
| **O** | Stop control and exit (emergency stop) |
| **ENTER** | Toggle between Normal / Planner modes |
| **I** | Reinitialize base quaternion and reset heading |
| **Z** | Toggle encoder mode (between mode 0 and mode 1, if encoder loaded) |
| **F** | Report motor temperatures (TTS voice alert) |
### Normal Mode Keys
| Key | Action |
|-----|--------|
| **T** | Play current motion to completion |
| **R** | Restart current motion from beginning (pause at frame 0) |
| **P** / **N** | Previous / Next motion sequence |
| **Q** / **E** | Adjust delta heading (at policy level) left / right (Β±Ο/12 rad) |
### Planner Mode Keys
**Movement:**
| Key | Action |
|-----|--------|
| **W** / **S** | Move forward / backward |
| **A** / **D** | Adjust heading slightly and move forward (left / right) |
| **,** / **.** | Strafe left / right |
**Heading:**
| Key | Action |
|-----|--------|
| **Q** / **E** | Adjust facing direction (at planner level) left / right (Β±Ο/6 rad) |
| **J** / **L** | Adjust delta heading (at policy level) left / right (Β±Ο/12 rad) |
**Mode & Speed:**
| Key | Action |
|-----|--------|
| **N** / **P** | Next / Previous motion set |
| **1**β**8** | Select mode within the current set |
| **9** / **0** | Decrease / Increase movement speed |
| **-** / **=** | Decrease / Increase height (non-standing sets, 0.2β0.8 m) |
| **T** | Play motion |
**Emergency:**
| Key | Action |
|-----|--------|
| **R** / **`** / **~** | Emergency stop (immediate momentum reset) |
## Motion Sets
A **motion set** is a group of related movement styles (e.g., locomotion, gestures, or crouching). Selecting a mode within a set makes the robot behave in that style. Each set contains up to eight selectable modes.
Cycle through motion sets with **`N`** (next) / **`P`** (previous). Within each set, press **`1`**β**`8`** to select a mode. For more details on the underlying planner model, mode indices, and input/output specifications, see the [Kinematic Planner ONNX Model Reference](../references/planner_onnx.md).
### Set 0 β Locomotion (Standing)
| Key | Mode | Speed Range |
|-----|------|-------------|
| **1** | Slow Walk | 0.2β0.8 m/s |
| **2** | Walk | β |
| **3** | Run | 1.5β3.0 m/s |
| **4** | Happy | β |
| **5** | Stealth | β |
| **6** | Injured | β |
```{tip}
For lateral (side-stepping) movement using **`,`** / **`.`**, we recommend keeping the target velocity at around **0.4 m/s**. Higher velocities during strafing can cause the robot's feet to collide due to the cross-legged foot placement required for lateral steps.
```
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1em; margin: 1em 0;">
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_happy.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Happy styled walking.</figcaption>
</figure>
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_stealth.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Stealth styled walking.</figcaption>
</figure>
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_injured.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Injured styled walking.</figcaption>
</figure>
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_run.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Running locomotion mode.</figcaption>
</figure>
</div>
### Set 1 β Squat / Ground
Height adjustable with **`-`** / **`=`** (0.2β0.8 m). Initial height defaults to 0.8 m when entering this set.
| Key | Mode | Speed Range |
|-----|------|-------------|
| **1** | Squat | static |
| **2** | Kneel (Two Legs) | static |
| **3** | Kneel (One Leg) | static |
| **4** | Hand Crawling | 0.4β1.0 m/s |
| **5** | Elbow Crawling | 0.7β1.0 m/s |
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1em; margin: 1em 0;">
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_kneeling.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Kneeling mode with variable height control.</figcaption>
</figure>
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/hand_crawling.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Hand crawling locomotion.</figcaption>
</figure>
<figure style="margin: 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_elbow_crawling.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Elbow crawling locomotion.</figcaption>
</figure>
</div>
### Set 2 β Boxing
| Key | Mode | Speed Range |
|-----|------|-------------|
| **1** | Idle Boxing | static |
| **2** | Walk Boxing | 0.7β1.5 m/s |
| **3** | Left Jab | 0.7β1.5 m/s |
| **4** | Right Jab | 0.7β1.5 m/s |
| **5** | Random Punches | 0.7β1.5 m/s |
| **6** | Left Hook | 0.7β1.5 m/s |
| **7** | Right Hook | 0.7β1.5 m/s |
<figure style="margin: 1em 0;">
<video width="100%" autoplay loop muted playsinline style="border-radius: 8px;">
<source src="../_static/kinematic_planner/planner_boxing.mp4" type="video/mp4">
</video>
<figcaption style="text-align: center; font-style: italic; margin-top: 0.5em;">Boxing mode demo.</figcaption>
</figure>
### Set 3 β Additional Styled Walking
| Key | Mode |
|-----|------|
| **1** | Careful |
| **2** | Object Carrying |
| **3** | Crouch |
| **4** | Happy Dance |
| **5** | Zombie |
| **6** | Point |
| **7** | Scared |
## Movement Momentum System
The planner usage in keyboard mode uses a momentum-based movement system:
- Pressing a direction key (**W/S/A/D/,/.**) sets momentum to **1.0** (full speed).
- Each frame without a direction key press, momentum decays multiplicatively (Γ0.999).
- When momentum drops below **0.1**, the robot transitions to idle (for the Locomotion set) or holds the current static pose (for Squat and Boxing sets).
- Emergency stop (**R/`/~**) instantly resets momentum to zero.
This means you don't need to hold a key down β a single press starts movement, and the robot coasts to a stop naturally.
|