本文へ移動
cccskills
無料GitHub で公開

spawn-walkers

Spawns pedestrians that wander autonomously via WalkerAIController, and destroys them in the correct order. Pairs each walker.pedestrian.* with a controller.ai.walker, places them on the navigation mesh, and sends them to random navmesh points at walking speed. Use when the user asks to "spawn pedestrians/walkers", "add people/crowds", "make pedestrians walk around", or "remove the walkers". Reads the world settings first: if the world is already synchronous it never ticks it, and if it is asynchronous it makes it synchronous and drives the clock itself.

インストール方法を見る

含まれるファイル(5)

  • SKILL.md8.4 KB
  • references/walkers.md3.1 KB
  • scripts/check_env.sh2.1 KB
  • scripts/env.sh1.1 KB
  • scripts/walkers.py20.7 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Spawn wandering pedestrians

Paths. scripts/… and references/… below are relative to the directory holding this SKILL.md. Your working directory is the user's project, not that directory, so prefix them with its absolute path or the command is not found.

Populate the map with pedestrians that walk around on their own. Each is a walker.pedestrian.* body paired with a controller.ai.walker that steers it to random points on the navigation mesh. The deliverable is a live, moving crowd; destroy tears it down cleanly.

By default they wander indefinitely: on spawn every controller is start()ed, given one random navmesh destination, and a random walking speed. That single target is enough — CARLA's walker AI automatically picks a fresh random destination each time a walker arrives (confirmed in LibCarla's nav code), so the crowd roams forever with no re-targeting loop. Pass --no-wander for a stationary crowd (controllers left unstarted).

This needs a navmesh — validate it first with the debug-navmesh skill if walkers won't move.

The controllers stop when the client that started them exits. Same rule as the Traffic Manager, and it is the reason a fire-and-forget spawn leaves the crowd standing still. Pass --hold: the process stays alive and the crowd keeps walking.

It is not primarily about pumping ticks, which is what this skill used to say. The two were confounded, because --hold both keeps the client alive and pumps. Separating them needed a second client owning a synchronous clock; measured on 0.10.0, walkers spawned against a world ticked by a traffic client:

setupresult
spawn, process exits (another client ticking)0/15 move
a separate client issues start() and stays alive15/15 move, then stop when it exits
spawn --hold, observing only, never ticking10/10 move, 9.94 m in 8 s

The first row has a second symptom worth knowing: a later start() on those controllers is accepted rather than rejected as already-started, which proves the original call never landed. _ensure_walking therefore verifies by displacement and re-issues (--retries) instead of trusting start().

Ticks still have to come from somewhere, of course — that is the clock rule below, not the walkers' own business.

The clock rule

Read the world settings before doing anything:

  • already synchronous — another client owns the clock. Never call tick(); observe with wait_for_tick(). Ticking a world you do not own is what silently drops commands like start().
  • asynchronous — this client may switch it to sync (--delta, default 20 Hz) and become the ticker. --no-sync opts out.

Either way the previous settings are restored on release: a synchronous world with nothing ticking does not advance at all, and is indistinguishable from a hung server. So stop a holder with Ctrl+C (SIGINT), never kill -9 — the restore runs in a finally.

Walkers are also spawned --z-offset (default 2.0 m) above the navmesh point: spawning at the navmesh z is rejected on 0.10.0 with "Spawn failed because of collision at spawn position" (+0.5 still fails, +1.0 is the first that works).

Instructions

Progress:
- [ ] Step 1: Check prerequisites (bash scripts/check_env.sh), clear FAILs
- [ ] Step 2: (if walkers won't move) validate the navmesh — debug-navmesh
- [ ] Step 3: Spawn N walkers with --hold (the controllers die with the client)
- [ ] Step 4: Verify visually / via the world-data skill; spawn reports its count
- [ ] Step 5: Ctrl+C the held process, then destroy (controllers first, then walkers)

Commands need CARLA_HOST/CARLA_PORT from scripts/env.sh.

Step 1: Check prerequisites

bash scripts/check_env.sh

Step 3-5: Spawn / roam / destroy

source scripts/env.sh

# 30 pedestrians wandering at 1.0-1.8 m/s — --hold keeps this client alive, and
# the controllers stop the moment it exits
python3 scripts/walkers.py spawn --count 30 --hold

# reproducible placement (still wanders forever)
python3 scripts/walkers.py spawn --count 50 --seed 42

# more road-crossing, faster walkers
python3 scripts/walkers.py spawn --count 20 --cross-factor 0.4 --speed-min 1.4 --speed-max 2.2

# a stationary crowd (no autonomous movement)
python3 scripts/walkers.py spawn --count 20 --no-wander

python3 scripts/walkers.py destroy        # correct-order teardown

Verify

The spawn command reports how many walkers + controllers it created (they should be equal). Watch them move on a rendered server; count/inspect live actors with the world-data skill. Fewer than requested is normal at high counts (navmesh points collide) — the spawn command reports the shortfall.

Examples

Example 1: add a crowd

User says: "spawn 40 pedestrians walking around"

spawn --count 40 --hold. They head to random navmesh points and keep walking for as long as that command runs; it reports how many spawned.

Example 2: a reproducible pedestrian scene

User says: "same 25 pedestrians every run"

spawn --count 25 --seed 7. They wander indefinitely; the seed fixes placement.

Example 3: clean up

User says: "remove all the pedestrians"

destroy — stops and removes controllers first, then the walkers.

Troubleshooting

Problem: walkers spawn but stand still (walk animation plays, no movement) Cause: in order of likelihood — (1) the spawning client exited, so its controllers stopped; (2) start() was dropped, which happens when the client ticked a world it did not own; (3) nothing is advancing the world at all; (4) the navmesh. It looks identical in all four cases. Solution: spawn with --hold. Obey the clock rule above — never tick() a world that is already synchronous. _ensure_walking re-issues start() automatically and reports how many are confirmed walking, so a silent failure is now a printed number. Only if that still says 0, validate the navmesh with debug-navmesh — a PASS there rules the map out.

Problem: a crowd looks frozen but get_velocity() is the evidence Cause: on this build nav-driven walkers report get_velocity() ≈ 0 the entire time they are walking — measured 10/10 walking by displacement while every one of them read below 0.1 m/s. Solution: judge movement by displacement between two samples, never by velocity. This applies to your own checks as much as to this skill's.

Problem: far fewer spawned than requested (or zero) Cause: Spawn failed because of collision at spawn position. At high counts random navmesh points collide with each other; all of them fail if the vertical offset is too small (0.10.0 rejects the bare navmesh z). Solution: keep --z-offset at its 2.0 m default — a count of 10 returning 0 is an offset problem, not a crowding one. Then retry, lower the count, or batch.

Problem: errors / ghost actors after cleanup Cause: walkers destroyed before their controllers (wrong order). Solution: always use destroy here — it stops controllers and removes them first, then the walkers.

Problem: pedestrians constantly walk into the road Cause: high --cross-factor. Solution: lower it (default 0.1); 0 keeps them on sidewalks.

Outputs

A live crowd of wandering pedestrians (walker + controller pairs) on the server. No file. destroy removes them in the safe order.

Detail (the two-phase batch spawn, controller API, navmesh dependency, sync optionality, destroy order) in references/walkers.md.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Adds a new ROS 2 message type to CARLA's native ROS 2 interface — the hand-written POD struct under LibCarla/source/carla/ros2/types/msg, its Fast-CDR serialize/deserialize pair, the RIHS01 type hash computed in Docker, the CdrTopicInfo registration and the type-hash test. Use when the user asks to "add a ROS message type", "support sensor_msgs/X in CARLA", "add a carla_msgs type", "why is my type hash warning appearing", or needs a message CARLA does not publish yet. There is no IDL codegen — every step is manual.

日本語の概要は準備中です。原文の説明を表示しています。

carla-simulator/carla-agentic-tools42026年9月12日 更新

Adds a new topic to CARLA's native ROS 2 interface — a publisher (BasePublisher + PublisherImpl, topic suffix, QoS, registration in ROS2::GetOrCreateSensor, a ProcessDataFrom* entry point and its call site in the UE4 plugin) or a subscriber that lets ROS drive an actor. Also covers adding a middleware (RMW) behind IPublisherMiddleware. Use when the user asks to "publish X to ROS from CARLA", "add a ROS topic/publisher/subscriber", "make the obstacle/lane-invasion sensor publish", "add odometry to ROS", or "add another RMW".

日本語の概要は準備中です。原文の説明を表示しています。

carla-simulator/carla-agentic-tools42026年9月12日 更新

Reads and summarises ScenarioRunner output — the criteria pass/fail tables from --output/--file, the machine-readable --json and --junit result files, and the criteria JSON written alongside a --record recording — and runs the metrics module (metrics_manager.py) to compute custom measurements over a recorded run offline, without the simulator. Use when the user asks "did the scenario pass", "why did it fail", "summarise these results", "compare these runs", or wants distance/speed/lane metrics from a recording.

日本語の概要は準備中です。原文の説明を表示しています。

carla-simulator/carla-agentic-tools42026年9月12日 更新

Gets actor and level 3D bounding boxes and projects them into a camera image as 2D boxes — the dataset-annotation workflow. Lists box geometry, draws 3D boxes in the world via debug, or captures one camera frame and writes an annotated PNG plus a JSON of 2D boxes for matching actors. Use when the user asks to "get bounding boxes", "draw boxes around the cars", "project boxes onto the camera", or "generate a detection dataset / annotations".

日本語の概要は準備中です。原文の説明を表示しています。

carla-simulator/carla-agentic-tools42026年9月12日 更新

Builds CARLA (branch ue4-dev, Unreal Engine 4.26) from source on Linux end-to-end — UE4 fork, the Carla server (editor C++ modules), the LibCarla Python client wheel, and content — then verifies them against a from-source server. Optionally builds the native ROS 2 interface in (ROS2=1 → --ros2, Fast-DDS/CycloneDDS/Zenoh), which is compile-time only and cannot be enabled later. Use when the user asks to "build CARLA from source", "compile CARLA ue4-dev", "set up CARLA on Ubuntu (incl. 24.04)", "build CARLA with ROS2 support", or "produce a CARLA server + client wheel". Cooking a distributable Dist/ package is a separate skill (package-carla-ue4); running the build is run-carla-server.

日本語の概要は準備中です。原文の説明を表示しています。

carla-simulator/carla-agentic-tools42026年9月12日 更新

Builds CARLA on Unreal Engine 5.8 from the ue58-dev branch using its CMake build system — configure a preset, then build the carla-unreal / carla-unreal-editor / carla-python-api-install / launch targets — with ROS 2, DLSS, RSS and cook-scope options, and the engine-side build of the CarlaUnreal UE 5.8 fork. There is no Makefile and no Util/BuildTools in this tree, so every UE4 `make` recipe is invalid here. Use when the user asks to "build CARLA UE5", "build ue58-dev", "compile CARLA with cmake", "rebuild the Python API", or hits a CMake configure or target failure.

日本語の概要は準備中です。原文の説明を表示しています。

carla-simulator/carla-agentic-tools42026年9月12日 更新

carla-simulator のスキルをすべて見る

このスキルの問題を報告する