Pegasus Drones¶
EAI ships three drone platforms — the 3DR Iris, the Pegasus research quadrotor, and CF2X — with keyboard/ROS2 goal control and a default sensor suite of a forward monocular camera, an Example_Rotary 128-line LiDAR, and base sensors such as IMU/GPS. Airframe USD assets and controllers are downloaded on demand from the Hugging Face dataset by the EAI asset resolver; no extra extension is required.
Quick start¶
conda activate env_isaaclab
python simulator.py --env=pegasus_drones --device=cuda:0
The example spawns one iris_1 at 1 m and enables keyboard goal control and
ROS. Keyboard or ROS Twist linear.x/y/z updates the 3D position goal;
angular.z updates yaw. The control topic is /iris_1/cmd_vel.
iris, pegasus, and cf2x include a forward-facing monocular camera and an
aerial LiDAR by default. The sensor resources remain in the scene even when no
tool is selected. Their ROS 2 publishers are controlled by two independent Env DIY
tools. Adding Camera to an aerial robot branch publishes
/<robot>/camera/image_raw (sensor_msgs/msg/Image) and
/<robot>/camera/camera_info (sensor_msgs/msg/CameraInfo). Adding Navigation
I/O publishes /<robot>/lidar/pointcloud (sensor_msgs/msg/PointCloud2). A
Camera-only branch does not publish the LiDAR topic, a Navigation-I/O-only branch
does not publish camera topics, and selecting both tools publishes both streams.
Navigation I/O uses the internal navigation_io key in environment JSON.
After starting the simulator, run the unified sensor visualizer from a ROS 2
Humble terminal. The visualizer requires system ROS Python with rclpy,
sensor_msgs, cv_bridge, OpenCV, and NumPy, plus a working graphical display;
placing it under tools/ros2/ does not provide those dependencies
inside env_isaaclab. With no arguments it dynamically discovers every
sensor_msgs/msg/Image topic on the current ROS graph, covering the Iris,
Pegasus, and CF2X monocular cameras as well as both Orsus cameras. Cameras that
appear after the visualizer starts are subscribed automatically:
source /opt/ros/humble/setup.bash
python3 tools/ros2/vis_sensors.py
Use a namespace filter to show only one aerial robot. The built-in example uses
the iris_1 instance:
python3 tools/ros2/vis_sensors.py --sensor camera --namespace /iris_1
iris, pegasus, and cf2x also include an accelerometer and gyroscope with
white noise, random walk, turn-on bias, and first-order time-varying bias, plus
GPS, magnetometer, and barometer. These models exist by default; Navigation I/O
on the same aerial robot branch only controls their ROS topic publication.
The LiDAR on all three aerial robots uses Pegasus Simulator’s original
IsaacSensorCreateRtxLidar path with the Example_Rotary configuration and
does not reuse the ground-robot HESAI/Pandar sensor. Example_Rotary is a
128-channel 3D LiDAR, so it does not publish the 2D-only LaserScan.
Assets and configurations¶
Env DIY type |
USD |
Default controller cfg |
|---|---|---|
|
|
|
|
|
|
|
|
|
The default configurations use geometric position and yaw control. The
controller converts the goal into collective thrust and body torque, then
allocates these values to four rotor speeds using the real rotor locations for
each asset. The actuator layer retains Pegasus’s T = k * omega^2 thrust
curve, rotor reaction moment, and body-frame linear drag.
For an external algorithm that directly outputs motor speed in rad/s, select
PEGASUS_IRIS_ROTOR_CFG or PEGASUS_X4_ROTOR_CFG manually in JSON and call:
rotor_speed = torch.tensor([[650.0, 650.0, 650.0, 650.0]], device=env.device)
env.step({"iris_1": rotor_speed})
The direct input order is [rotor0, rotor1, rotor2, rotor3] in rad/s and each
value is limited to [0, 1100]. This interface can be connected to PX4,
ArduPilot, or custom flight software. The Pegasus MAVLink backends themselves
are not embedded in EAI, so an external backend must translate its outputs to
this tensor interface.
Sources and Licenses¶
Dynamics and airframe assets are derived from Pegasus Simulator (BSD-3-Clause); the 3DR Iris model comes from PX4 (BSD-3-Clause). Full attribution and license texts are available here: