flymotion / README.md
Tromset's picture
Publish FlyMotion from GitHub
090ae54 verified
|
Raw History Blame Contribute Delete
3.86 kB
metadata
license: apache-2.0
language:
  - fr
  - en
base_model:
  - Qwen/Qwen3.5-4B
  - Qwen/Qwen3.5-2B
pipeline_tag: text-generation
library_name: ollama
tags:
  - robotics
  - motion-planning
  - microduck
  - ollama
  - function-calling
datasets:
  - Tromset/flymotion-commands

FlyMotion 0.1

FlyMotion turns what you say into motion for a small robot such as Microduck (Pollen Robotics). "Avance d'un mètre, tourne à droite et frappe le ballon du pied gauche" becomes a plan that the FlyMotion bridge turns into velocity commands for the robot's walking policy. It runs locally with Ollama, on a laptop or a Raspberry Pi 5.

ollama pull Tromset/flymotion0.1        # Qwen3.5 4B, computers with 8 GB
ollama pull Tromset/flymotion0.1lite    # Qwen3.5 2B, Raspberry Pi 5
git clone https://github.com/Tromset/flymotion && cd flymotion
python3 -m flymotion "fais un carré de 50 cm puis salue"       # simulator
python3 -m flymotion --transport robot                          # on the robot
Model Base Weights Benchmark (36 requests) Median planning time, 4-core CPU
Tromset/flymotion0.1 Qwen3.5 4B 3.3 GB 35/36 18.8 s
Tromset/flymotion0.1lite Qwen3.5 2B 2.7 GB 35/36 11.7 s

What is in this repository

  • Modelfile, Modelfile.lite: the two Ollama models (base, settings, system prompt).
  • system_prompt.txt: the system prompt, built from the Microduck profile.
  • plan.schema.json: the JSON schema of a plan, passed to Ollama's structured outputs so every reply parses.
  • robots/: robot profiles (limits, cruise speeds, head angles, skills, transport).
  • bench/: benchmark results, request by request.

Version 0.1 does not retrain the weights: the gains come from the plan format, the prompt and the bridge, measured by the benchmark. The fine-tuned GGUF weights of 0.2 will be published here; the training data is Tromset/flymotion-commands.

The plan format

The model writes words, the bridge does the physics:

{"say": "Je tourne à droite et je regarde en haut.", "repeat": 1,
 "steps": [{"action": "turn", "direction": "right", "degrees": 90}, {"action": "head", "look": "up"}]}

Steps: walk (forward, backward, left, right, meters), turn (left, right, degrees), circle (left, right, radius), head (ahead, left, right, up, down and the diagonals), skill (the robot's skills), wait, stop, and repeat for shapes. Distances and angles are always positive. With signed numbers instead ("degrees": -90 for right), the 2B base confused left and right in a third of the requests: 22/32 on the first benchmark against 31/32 with words.

The bridge validates every plan, clamps it to the robot's limits (Microduck: 0.4 m/s forward, 0.3 m/s sideways, 1 rad/s turning, 3 m and 60 s per plan), re-sends robot.move at 10 Hz, and always ends with robot.stop. The language model never drives the motors: Pollen's walking policies do, at 50 Hz.

Benchmark

36 French and English requests: distances, turns, sideways steps, head, the six Microduck skills, shapes, combinations, a stop, and four requests to refuse (jump over a table, kick the cat, fly, a question). Each plan is played in a kinematic simulator and checked on the final position (10 cm), heading (10 degrees), head direction, skills and refusals.

Limits

  • Plans are open loop: the robot does not see. Distances are as accurate as the calibration of your walking policy (python3 -m flymotion calibrate vx).
  • The simulator is flat-ground kinematics; it checks the plan, not the walking.
  • Independent project, not affiliated with Pollen Robotics or the Qwen team.

Code: MIT, https://github.com/Tromset/flymotion. Weights: Apache 2.0, from Qwen3.5 by the Qwen team at Alibaba.