๐ Drone Entity#
Genesis provides specialized drone simulation with propeller physics and motor control.
Creating a Drone#
import genesis as gs
import numpy as np
gs.init(backend=gs.gpu)
scene = gs.Scene(
sim_options=gs.options.SimOptions(dt=0.01, gravity=(0, 0, -9.81)),
)
scene.add_entity(gs.morphs.Plane())
drone = scene.add_entity(
morph=gs.morphs.Drone(
file="urdf/drones/cf2x.urdf",
model="CF2X",
pos=(0.0, 0.0, 0.5),
),
)
scene.build()
Drone Morph Options#
gs.morphs.Drone(
file="urdf/drones/cf2x.urdf", # URDF file path
model="CF2X", # Model: "CF2X", "CF2P", or "RACE"
pos=(0.0, 0.0, 0.5), # Initial position
euler=(0.0, 0.0, 0.0), # Initial orientation (degrees)
propellers_link_name=('prop0_link', 'prop1_link', 'prop2_link', 'prop3_link'),
propellers_spin=(-1, 1, -1, 1), # Spin directions: 1=CCW, -1=CW
)
Motor Control#
Control propellers via RPM (revolutions per minute):
hover_rpm = 14475.8 # Approximate hover RPM for CF2X
max_rpm = 25000.0
for step in range(1000):
# Set RPM for each propeller [front-left, front-right, back-left, back-right]
rpms = np.array([hover_rpm, hover_rpm, hover_rpm, hover_rpm])
# Add differential thrust for motion
rpms[0] += 100 # Increase front-left
rpms[3] += 100 # Increase back-right
rpms = np.clip(rpms, 0, max_rpm)
drone.set_propellers_rpm(rpms) # Call ONCE per step
scene.step()
Important: set_propellers_rpm() must be called exactly once per simulation step.
Physics Model#
Thrust:
F = KF ร RPMยฒ(vertical force per propeller)Torque:
ฯ = KM ร RPMยฒ ร spin_direction(yaw moment)Control:
Differential thrust between propellers โ translation
Differential moment between pairs โ rotation
Multi-Environment#
scene.build(n_envs=32)
# Control shape: (n_envs, n_propellers)
rpms = np.tile([hover_rpm] * 4, (32, 1))
drone.set_propellers_rpm(rpms)
Available Models#
Model |
File |
Description |
|---|---|---|
CF2X |
|
Crazyflie 2.0 X-config |
CF2P |
|
Crazyflie 2.0 Plus |
RACE |
|
Racing drone |
Example: Hover Control#
import genesis as gs
import numpy as np
gs.init()
scene = gs.Scene()
scene.add_entity(gs.morphs.Plane())
drone = scene.add_entity(gs.morphs.Drone(file="urdf/drones/cf2x.urdf", pos=(0, 0, 1)))
scene.build()
target_height = 1.0
kp = 5000.0
for _ in range(500):
pos = drone.get_pos()[0]
error = target_height - pos[2].item()
base_rpm = 14475.8
correction = kp * error
rpms = np.clip([base_rpm + correction] * 4, 0, 25000)
drone.set_propellers_rpm(rpms)
scene.step()
Whatโs Next#
Hover Environment - building a complete drone hover RL environment
Locomotion - training locomotion policies with Genesis and RL