A Foundation Policy for Quadrotor Control
Check out rl-tools/raptor for more details.
Supports Python >= 3.6
Usage
If you want to use your own simulator:
pip install foundation-policy
from foundation_policy import Raptor
policy = Raptor()
policy.reset()
for simulation_step in range(1000):
observation = np.array([[*sim.position, *R(sim.orientation).flatten(), *sim.linear_velocity, *sim.angular_velocity, *sim.action]])
action = policy.evaluate_step(observation)[0] # the policy works on batches by default
simulation.step(action) # simulation dt=10 ms
Note that the axis conventions are FLU (x = forward, y = left, z = up). Please convert position, orientation, linear velocity and angular velocity into these conventions. The angular velocity is in the body frame. The action motor conventions are [front-right, back-right, back-left, front-left] and the motor commands are normalized in the range [-1, 1].
Usage: L2F
The following instructions show how to use l2f, the simulator used for training the foundation policy:
pip install l2f ui-server foundation-policy
Run ui-server in background and open http://localhost:13337
ui-server
Then run the following code:
from copy import copy
import numpy as np
import asyncio, websockets, json
import l2f
from l2f import vector8 as vector
from foundation_policy import Raptor
policy = Raptor()
device = l2f.Device()
rng = vector.VectorRng()
env = vector.VectorEnvironment()
ui = l2f.UI()
params = vector.VectorParameters()
state = vector.VectorState()
observation = np.zeros((env.N_ENVIRONMENTS, env.OBSERVATION_DIM), dtype=np.float32)
next_state = vector.VectorState()
vector.initialize_rng(device, rng, 0)
vector.initialize_environment(device, env)
vector.sample_initial_parameters(device, env, params, rng)
vector.sample_initial_state(device, env, params, state, rng)
async def render(websocket, state, action):
ui_state = copy(state)
for i, s in enumerate(ui_state.states):
s.position[0] += i * 0.1 # Spacing for visualization
state_action_message = vector.set_state_action_message(device, env, params, ui, ui_state, action)
await websocket.send(state_action_message)
async def main():
uri = "ws://localhost:13337/backend" # connection to the UI server
async with websockets.connect(uri) as websocket:
handshake = json.loads(await websocket.recv(uri))
assert(handshake["channel"] == "handshake")
namespace = handshake["data"]["namespace"]
ui.ns = namespace
ui_message = vector.set_ui_message(device, env, ui)
parameters_message = vector.set_parameters_message(device, env, params, ui)
await websocket.send(ui_message)
await websocket.send(parameters_message)
await asyncio.sleep(1)
await render(websocket, state, np.zeros((8, 4)))
await asyncio.sleep(2)
policy.reset()
for _ in range(500):
vector.observe(device, env, params, state, observation, rng)
action = policy.evaluate_step(observation[:, :22])
dts = vector.step(device, env, params, state, action, next_state, rng)
state.assign(next_state)
await render(websocket, state, action)
await asyncio.sleep(dts[-1])
if __name__ == "__main__":
asyncio.run(main())
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file foundation_policy-1.0.2.tar.gz.
File metadata
- Download URL: foundation_policy-1.0.2.tar.gz
- Upload date:
- Size: 112.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.10.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd869d9603da60eaddbec08f212d32b1e23ca279ff56994a871a89dc1d2242f6
|
|
| MD5 |
e774878802f30c7f5edea8a87a6e2c10
|
|
| BLAKE2b-256 |
2effb80b9215de9df04d50e62c32a2b78d06627407dcfc1bb1808709630bf136
|