arena_bringup launch¶
Entry point: arena_runtime.launch.py (runtime: sim + arena_node). Task-generator envs are attached via task_generator.launch.py; the arena launch bash composite orchestrates both.
Arguments¶
All arguments are declared with LaunchArgument (a thin wrapper around
DeclareLaunchArgument that also auto-appends to the description list and
exposes .substitution / .dict / .param).
The table below covers the combined argument surface of arena launch. Runtime
args (sim, headless, world, use_sim_time, log_level) go to
arena_runtime.launch.py; the rest go to task_generator.launch.py per env.
Old flat names (tm_robots, mobile, env_n, ...) still work with a warning, see Deprecated launch args.
| Name | Type / choices | Default | Meaning |
|---|---|---|---|
log_level |
level / {glob:lvl,…,default} / yaml path |
warn |
Per-node log level via NodeLogLevelExtension. See Log level below. |
robot |
string | auto |
Robot model; must match a directory under arena_robots/robots/. auto resolves from the selected planner's action_type + sensor_needs (canonical defaults: jackal for differential_drive, ridgeback_plus for omnidirectional, turtlebot for image/depth signatures). Composable: auto, auto[2], auto,jackal. |
robot.mobile |
string | derived from sim |
Mobile adapter kind: nav2, rosnav_rl, external, none. Empty = none for dummy, nav2 otherwise. |
robot.arm |
string | moveit |
Arm adapter kind |
robot.planner |
string | `` (empty) | Top-level planner selector; resolves to robot.mobile:=<adapter> robot.mobile.<selector>:=<name> via arena_planners.resolver |
robot.train |
bool string | false |
Training mode: robot adapters route cmd_vel from the RL agent |
robot.hearing |
none | bus | srp | seld |
none |
Robot-side hearing layer (arena_hearing): belief grid and a Nav2 speed-filter mask per fleet robot, merged into each robot's nav2 params, RViz displays. bus consumes simulator bus events, srp runs the untrained energy-onset + GCC-PHAT front-end on any array, seld runs the SELDnet front-end on the array its weights were trained on. Needs acoustics:=arena and the hearing feature (arena feature hearing install), dispatched by launch/hearing. |
robot.hearing.policy |
belief | listen | full |
full |
Hearing mask layers: belief only, plus the corner listen cap, plus creep-yield at blind bends (arena_hearing). |
robot.hearing.<param> |
node param | node default | Every other robot.hearing.<param>:=<val> reaches the hearing nodes as ROS param <param>. The launch-facing ones (robot.hearing.seld.device, robot.hearing.srp.hop_s, ...) are declared by arena_hearing's hearing.launch.py, empty = node default. Never forwarded to the robot adapters. |
robot.mobile.<key>:=<val> |
adapter-scoped | - | Override any kwarg the bound mobile adapter accepts. Lands as ROS param robot.mobile.<key> and overlays the cap-file YAML. Examples: robot.mobile.local_planner:=teb, robot.mobile.global_planner:=smac, robot.mobile.agent:=jackal_pretrained. |
robot.arm.<key>:=<val> |
adapter-scoped | - | Same shape for the arm cap. |
sim |
string | gazebo |
Physics simulator: dummy, flatsim, gazebo, isaac, or mujoco. dummy must be explicit. Standalone arena env may omit it (adopts the runtime's sim); if given explicitly it must match the running runtime. |
sim.flatsim.dynamics |
string | rigid |
sim:=flatsim only, a runtime argument. rigid = walls, obstacles and pedestrians stop or push the robot, kinematic = the robot passes through. |
headless |
bool string | False |
true = hide sim GUI (server-only). arena launch also suppresses rviz unless rviz:=true is explicit. |
viz |
bool string | true |
arena launch only: run arena viz --all after envs are up. Forced false when headless:=true unless overridden. |
human |
string | dummy for dummy sim, arena (arena_humansim) for flatsim/gazebo/isaac/mujoco |
Human-simulator backend |
human.robots.visible |
bool string | true |
false = the arena human backend does not tell its pedestrians where the robots are, so they walk as if none were there. Possessed pedestrians stay visible to the crowd. Other backends ignore it. |
complexity |
string | 1 |
1 map+position known; 2 map known AMCL; 3 SLAM |
record.dir |
string | `` (empty) | Directory for data recording; empty disables |
record.auto |
bool string | true |
false = do not auto-start the recorder even when record.dir is set (the benchmark runner starts its own) |
task.robots |
string | explore |
Robot task mode (legacy single-kind shorthand) |
task.config |
string | `` (empty) | Path to a TaskModeSpec YAML; empty -> synthesize from task.robots (wins if both set) |
task.obstacles |
string | random |
Obstacle task mode |
task.modules |
string | rviz_ui |
Comma-separated task modules to load |
task.scenario.file |
string | `` (empty) | Scenario for the scenario task modes (empty = use the task.params default) |
task.params |
string | configs/task_generator.yaml |
Task-generator ROS parameter YAML |
task.episode.count |
int string | -1 |
Stop the env after N episodes (-1 = run forever) |
task.episode.fail_on_collision |
bool string | false |
Abort the episode as FAILED on robot footprint contact |
world |
string | map_empty |
World name; resolved under arena_simulation_setup/worlds/ |
world.lighting |
string | authored |
authored renders the lights the world declares. auto also gives every zone with a ceiling and no lights of its own a calibrated ceiling rig, see AUTHORING.md. |
acoustics |
none | arena |
none |
Acoustics simulator: arena runs arena_auditory (sound propagation, robot and human sound emission, rendering, playback). The auditory.* sub-keys below take effect only with arena, see arena_auditory/README.md and launch/acoustics. arena needs the auditory feature (arena feature auditory install). |
auditory.<param> |
node param | node default | Every auditory.<param>:=<val> reaches each auditory node as ROS param <param>, coerced to the type of its default in arena_auditory/params.py. The rows below are declared by arena_auditory.launch.py, an empty value keeps the node default shown. |
auditory.output.device |
string | auto |
PortAudio output device for workstation playback. auto tries pulse, pipewire, default, then the PortAudio default. none starts no listener renderer. |
auditory.output.block_size |
int string | 512 |
Workstation audio callback block size. |
auditory.output.buffer_s |
float string | 0.04 |
Workstation jitter buffer target, raise it on repeated underflows. |
auditory.output.motor.enabled / auditory.output.ambient.enabled |
bool string | true |
Play robot motor or environment audio on the workstation. Emission, propagation and robot hearing continue when false. |
auditory.viz.enabled |
bool string | false |
Start the propagation visualizer and publish its markers. |
auditory.propagation.backend |
pyroomacoustics | level3 | legacy |
pyroomacoustics |
Propagation backend. |
auditory.portal.multi_hop.enabled |
bool string | true |
Allow pyroomacoustics RIRs across multi-hop portal routes. |
auditory.rir.max_order |
int string | 3 |
Image-source reflection order of every RIR. |
auditory.pedestrian_listeners.enabled |
bool string | false |
Pedestrians are propagation listeners and receive sound stimuli through the human simulator. |
auditory.motor.enabled |
bool string | true |
Robots emit drivetrain audio. |
auditory.motor.model |
procedural | wav |
procedural |
Robot motor audio source. |
auditory.motor.trim_db |
float string | 0.0 |
Live offset on the motor asset level_db, which sets the motor level everywhere (the procedural drivetrain at 1 m/s). |
auditory.motor.structural_share |
float string | 0.2 |
Live share of a robot's own drivetrain power at each of its array microphones that arrives structure-borne, incoherent across the microphones. 0 leaves the airborne field from the drive points. |
auditory.motor.drive_points_m |
float list string | [0.0, 0.1878, 0.0345, 0.0, -0.1878, 0.0345] |
Points the left and right drivetrain of a robot radiate from to its own array, x y z left then right in the array mount frame. |
auditory.listener.id |
string | `` (empty) | Microphone listener id of the listener renderer, the RViz auditory panel switches it at run time. |
auditory.viewport.height_m |
float string | 1.6 |
Listening height of the viewport down-projection microphone. |
auditory.array.spec |
stereo | four_mic | mono | path |
stereo, four_mic when robot.hearing is srp or seld |
Robot microphone array rendered by array_renderer. |
auditory.array.mount_frame |
string | `` (empty) | TF frame the robot microphone array is mounted on, {prefix} and {base_frame} expand, a bare leaf joins the robot prefix, empty uses the robot base frame. |
auditory.microphones |
YAML string | [] |
Robot microphone mappings (owner, robot, placement, frame, index). |
auditory.static_sounds |
YAML string | [] |
World-independent sound entities (radios, alarms), as a flat list of the same Sound schema used in world.yaml. Non-empty adds sounds to task.modules (already on whenever acoustics is not none). With acoustics:=none nothing hears them and the launch warns once. |
use_sim_time |
bool string | true |
Use sim clock instead of wall clock |
env.n |
int string | 1 |
Number of task-generator environments arena launch will spawn this invocation. Additive: if the runtime already has envs, these add to them rather than replace. |
env_d |
float string | 50 |
Spacing (metres) between environments on the snail grid |
debug |
bool string | False |
Enable debug features |
task.episode.auto_reset |
bool expression | true |
true = standalone: node auto-advances episodes; false = managed: external controller drives resets via lifecycle/reset_episode |
optim |
comma-separated tokens | $ARENA_OPTIM or `` (empty) |
Strip matching <sensor> blocks from each robot's URDF after xacro expansion (affects both Gazebo and Isaac via urdf.py). Tokens: no_camera (strips camera/depth/rgbd_camera), no_lidar (strips ray/gpu_lidar). Unknown tokens warn and are ignored. Default reads $ARENA_OPTIM so you can set export ARENA_OPTIM=no_camera,no_lidar once per shell; CLI optim:=... overrides. |
Log level¶
The log_level arg drives NodeLogLevelExtension, which injects --log-level
into each Node action based on the node's fully-qualified name. Four input
forms are accepted:
| Form | Example | Meaning |
|---|---|---|
| bare scalar | log_level:=info |
Same level for every node (back-compat). |
| inline rule set | log_level:='{**/nav2*/**:fatal, /dummy/node:warn, info}' |
Comma-separated <glob>:<level> entries inside {...}. A bare last entry is the default and expands to **/*:<level>. Replaces any prior rule set. |
| inline merge | log_level:='+[/foo:debug, /bar/**:warn]' (prepend) or '[<rules>]+' (append) |
Comma-separated <glob>:<level> entries inside [...]. Merges into the current rule set; if the rule set is empty (e.g. when the merge form is used directly from the CLI), the action seeds it with the base default first (warn unless overridden) so a catch-all is always present. |
| YAML file | log_level:=/path/to/rules.yaml with default: warn and ordered rules: [{match, level}, ...] |
Same semantics as the inline rule set. |
Rules match against the node's FQN (<namespace>/<name>) with first-match-wins
order. Globs are gitignore-style: ** matches zero or more /-separated path
segments, * matches within one segment, leading / in patterns is stripped so
ROS-style FQNs (/dummy/node) match the same as bare paths. Levels are the ROS
canonical set: debug | info | warn | error | fatal (no aliases).
SetGlobalLogLevelAction is also invoked further down the launch tree (e.g. by
task_generator's robot launcher to silence nav2 nodes by default) - those
later calls can use the merge form to layer rules on top of the user's spec
without clobbering it.
Simulator dispatch¶
- simulator/sim/README.md - physics simulator backends (
dummy,flatsim,gazebo,isaac,mujoco). - Human-simulation backends: see
task_generator/launch/human/README.md(moved alongside theirBaseHumanSimulatoradapters).
Top-level composition¶
arena_runtime.launch.py assembles the following in order:
SetGlobalLogLevelAction- storeslog_levelin the launch context soNodeLogLevelExtensioncan inject--log-levelinto every subsequentNodeaction.IsolatedGroupAction->sim.launch.py- the physics simulator.world_generatornode (arena_simulation_setup) - generates world assets.arena_node(LifecycleNode) - the multi-env orchestrator.
Task-generator envs are not included here. Each env is started separately via
task_generator.launch.py (either manually via arena env or orchestrated by
arena launch). Each env includes:
human.launch.py- starts the human simulator (if any) for that environment.- The
task_generator_nodewith all forwarded args plusnamespaceandprefix.
Environments are positioned on a snail grid (snail_grid(d)) that spirals
outward from the origin with spacing d, so multiple parallel environments do
not overlap.
The simulator is paused during setup and the entire Task._reset_episode body -
see Sim-paused invariant.
utils/¶
| File | Purpose |
|---|---|
utils/fake_localization.launch.py |
Publishes a static map -> odom TF (zero transform). Args: global_frame_id (default map), odom_frame_id (default odom). Used for complexity=1 (position known). |
utils/map_server.launch.py |
Starts nav2_map_server with nav2_lifecycle_manager (autostart, bond_timeout=0). No launch args - callers remap parameters directly. |