Agent skill

Add Actor Animation

by lge-ros2 in lge-ros2/cloisim

Add or modify SDF actors with skeletal animation and waypoint-based navigation.

MITAuto-check passedDevelopment

Install Add Actor Animation

skills CLI
$ npx skills add lge-ros2/cloisim --skill add-actor-animation -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install lge-ros2/cloisim add-actor-animation --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/lge-ros2/cloisim.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/add-actor-animation .claude/skills/add-actor-animation && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
add-actor-animation
GitHub stars
176
Token cost
~2.4k tokens
SKILL.md length
392 words
Files
1
Skills in repo
18
Repo updated
First seen
Licence
MIT

At a glance

Add or modify SDF actors with skeletal animation and waypoint-based navigation.

  • Works in 8 steps: Skin Mesh Import → Bone Hierarchy Resolution → Animation Loading → …
  • : importing animated characters
  • SKILL.md covers When to Use, Architecture, SDF Actor Definition and Procedure, plus 2 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Add Actor Animation is an agent skill from lge-ros2/cloisim. Add or modify SDF actors with skeletal animation and waypoint-based navigation. Use when: importing animated characters, setting up trajectory waypoints, configuring NavMesh agents for actors, debugging animation playback, adding skinned mesh support, working with Assimp bone hierarchies.

Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development. The repository describes itself as: Unity 6 based multi-robot simulator for ROS 2, SDFormat/SDF, LiDAR, camera, depth, IMU, GPS, and large-scale robotics simulation. The licence is MIT.

When your agent uses it

  • : importing animated characters
  • Setting up trajectory waypoints
  • Configuring NavMesh agents for actors
  • Debugging animation playback

Example prompts

  • “/add-actor-animation”

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Skin Mesh Import
  2. Bone Hierarchy Resolution
  3. Animation Loading
  4. Keyframe Coordinate Conversion
  5. Animation Setup on Actor
  6. Trajectory Waypoint System
  7. NavMesh Agent Configuration
  8. Reset Handling

What it can do on your machine

Read from SKILL.md and the folder at commit f4c1f0b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are csharp and xml).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Add Actor Animation loads about 2.4k tokens when it runs. Until then it costs about 77 tokens; SKILL.md has 392 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~77
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from lge-ros2/cloisim at commit f4c1f0b, republished under its MIT licence (© lge-ros2). 392 words, ~2,425 tokens.

Download SKILL.mdSave it as .claude/skills/add-actor-animation/SKILL.md (or your agent's skills folder).
name
add-actor-animation
description
Add or modify SDF actors with skeletal animation and waypoint-based navigation. Use when: importing animated characters, setting up trajectory waypoints, configuring NavMesh agents for actors, debugging animation playback, adding skinned mesh support, working with Assimp bone hierarchies.

Add Actor and Animation

Procedure for adding SDF actors with skeletal animation, waypoint trajectory following, and NavMesh-based AI navigation.

When to Use

  • Adding a new animated character/actor to a simulation world
  • Importing skeletal animations from DAE/FBX files via Assimp
  • Setting up waypoint trajectory following for actors
  • Configuring NavMesh agent parameters for obstacle avoidance
  • Debugging animation playback (wrong bones, missing curves, coordinate issues)
  • Understanding the skin mesh → bone hierarchy → AnimationClip pipeline

Architecture

SDF <actor>
  │
  ├─ Import.Actor.cs: ImportActor()
  │  ├─ Create GameObject (tag="Actor")
  │  ├─ Apply SDF pose
  │  ├─ Add Helper.Actor component
  │  ├─ Create skin mesh → Implement.Actor.CreateSkin()
  │  ├─ Load animations → Implement.Actor.SetAnimation()
  │  └─ Pass script data → actorHelper.SetScript()
  │
  ├─ Implement.Actor.cs
  │  ├─ CreateSkin() → MeshLoader.CreateSkinObject()
  │  ├─ SetAnimation() → build bone hierarchy, load AnimationClip
  │  └─ GetBoneHierachy() → relative path dictionary
  │
  ├─ Assimp.Animation.cs: LoadAnimation()
  │  ├─ KeyFramesPosition → localPosition curves
  │  ├─ KeyFramesRotation → localRotation curves (quaternion XYZW)
  │  └─ KeyFramesScale → localScale curves
  │
  └─ Helper.Actor.cs (runtime)
     ├─ Waypoint following (LateUpdate)
     ├─ NavMeshAgent configuration
     └─ Reset handling

SDF Actor Definition

xml
<actor name="walking_person">
  <pose>0 0 0 0 0 0</pose>

  <skin>
    <filename>meshes/person.dae</filename>
    <scale>1.0</scale>
  </skin>

  <animation name="walk">
    <filename>meshes/walk.dae</filename>
    <scale>1.0</scale>
    <interpolate_x>true</interpolate_x>
  </animation>

  <script>
    <loop>true</loop>
    <delay_start>0.0</delay_start>
    <auto_start>true</auto_start>

    <trajectory id="0" type="walk">
      <waypoint>
        <time>0</time>
        <pose>0 0 0 0 0 0</pose>
      </waypoint>
      <waypoint>
        <time>5</time>
        <pose>5 0 0 0 0 0</pose>
      </waypoint>
    </trajectory>
  </script>
</actor>

Procedure

1. Skin Mesh Import

The skin mesh is loaded via Assimp with skeletal support:

csharp
// In Implement.Actor.cs
static GameObject CreateSkin(in string skinFilename)
{
	return MeshLoader.CreateSkinObject(skinFilename);
	// Returns GameObject with:
	//   - SkinnedMeshRenderer (bone-weighted mesh)
	//   - Bone hierarchy as child transforms
	//   - Materials applied from mesh file
}

The skin object is parented under the actor and scaled:

csharp
// In Import.Actor.cs
var newSkinObject = Implement.Actor.CreateSkin(actor.SkinFilename);
newSkinObject.transform.SetParent(actorObject.transform, false);
newSkinObject.transform.localScale = Vector3.one * (float)actor.SkinScale;
2. Bone Hierarchy Resolution

Before loading animations, the bone hierarchy is mapped to relative paths:

csharp
// GetBoneHierachy() walks all descendants of rootBone
// Builds dictionary: { "boneName": "Parent/Child/boneName" }
//
// Example:
// {
//   "Hips":        "Hips",
//   "Spine":       "Hips/Spine",
//   "LeftArm":     "Hips/Spine/LeftArm",
//   "LeftForeArm": "Hips/Spine/LeftArm/LeftForeArm"
// }

var rootBone = skinnedMeshRenderer.rootBone;
var relativePaths = GetBoneHierachy(rootBone);
3. Animation Loading

Assimp.Animation.cs extracts keyframes from the mesh file and creates Unity AnimationClip:

csharp
// LoadAnimation() workflow:
// 1. Load scene via Assimp
// 2. Create AnimationClip (legacy=true, wrapMode=Loop, frameRate=30)
// 3. For each NodeAnimationChannel (bone animation):
//    a. Look up bone path from relativePaths dictionary
//    b. Extract position keyframes → KeyFramesPosition
//    c. Extract rotation keyframes → KeyFramesRotation
//    d. Extract scale keyframes → KeyFramesScale
//    e. Bind curves via clip.SetCurve()

var clip = MeshLoader.LoadAnimation(
	animation.Name,
	animation.Filename,
	relativePaths,
	(float)animation.Scale);
4. Keyframe Coordinate Conversion

Position keyframes are converted from SDF to Unity coordinates:

csharp
// KeyFramesPosition.Add():
// SDF (X-forward, Y-left, Z-up) → Unity (X-right, Y-up, Z-forward)
// Same mapping as SDF2Unity.Position()

// Root bone special handling:
// Root X position is SKIPPED (set by trajectory system instead)
// Only Y and Z position curves are bound for root bone
if (!isRoot)
	clip.SetCurve(relativeName, typeof(Transform), "localPosition.x", curveX);
clip.SetCurve(relativeName, typeof(Transform), "localPosition.y", curveY);
clip.SetCurve(relativeName, typeof(Transform), "localPosition.z", curveZ);

// Rotation keyframes — all 4 quaternion components bound:
clip.SetCurve(relativeName, typeof(Transform), "localRotation.x", curveRotX);
clip.SetCurve(relativeName, typeof(Transform), "localRotation.y", curveRotY);
clip.SetCurve(relativeName, typeof(Transform), "localRotation.z", curveRotZ);
clip.SetCurve(relativeName, typeof(Transform), "localRotation.w", curveRotW);
5. Animation Setup on Actor
csharp
// In Implement.Actor.SetAnimation():
var animComponent = targetObject.GetComponent<Animation>();
if (animComponent == null)
	animComponent = targetObject.AddComponent<Animation>();

animComponent.AddClip(clip, animation.Name);
animComponent.clip = clip;
animComponent.wrapMode = loop ? WrapMode.Loop : WrapMode.Once;
animComponent.animatePhysics = false;
animComponent.playAutomatically = autoStart;

if (autoStart)
	animComponent.Play();
else
	animComponent.Stop();
6. Trajectory Waypoint System

Helper.Actor processes SDF trajectories into waypoints for runtime following:

csharp
// SetScript() preprocesses trajectory data:
// For each trajectory waypoint (skip first if Time==0):
//   - Compute linear speed = distance / deltaTime
//   - Compute angular speed = angle / deltaTime
//   - Store as WaypointToward { linearSpeed, angularSpeed, translateTo, rotateTo }

// Runtime following in LateUpdate():
// 1. Check delay timer (_scriptDelayStart)
// 2. Get current waypoint[_waypointTowardsIndex]
// 3. Vector3.MoveTowards(current, target, speed * deltaTime)
// 4. Quaternion.RotateTowards(current, target, speed * deltaTime)
// 5. SetActorPose(nextPos, nextRot)
// 6. Check convergence:
//    - distance < DistanceEpsilon (Vector3.kEpsilon * 10)
//    - angle < AngleEpsilon (Quaternion.kEpsilon * 50000)
// 7. If converged → advance to next waypoint
// 8. If loop && reached end → RestartWayPointFollowing()
7. NavMesh Agent Configuration

Actors automatically get a NavMeshAgent for obstacle avoidance:

csharp
// In Helper.Actor.SetAgentColliderSize() coroutine:
// 1. Wait one FixedUpdate for skinMesh bounds to settle
// 2. Compute radius from skinMesh bounds (min of X, Z extents)
// 3. Configure CapsuleCollider (direction=Y, auto-sized)
// 4. Add/configure NavMeshAgent:

_navMeshAgent.radius = capsuleRadius * AgentMarginRatio; // 1.5x margin
_navMeshAgent.height = capsuleCollider.height;
_navMeshAgent.obstacleAvoidanceType =
	ObstacleAvoidanceType.MedQualityObstacleAvoidance;
_navMeshAgent.avoidancePriority = globalCounter++; // Unique per actor
_navMeshAgent.autoBraking = true;
_navMeshAgent.autoRepath = true;
_navMeshAgent.autoTraverseOffMeshLink = false;
8. Reset Handling

Actors reset pose and restart trajectories:

csharp
// Helper.Actor.Reset():
public new void Reset()
{
	base.Reset();  // Restores initial pose via PoseControl
	GetComponent<Animation>().Rewind();
	RestartWayPointFollowing();
	// → StopWaypointFollowing()
	// → Restore initial pose from GetPose(0)
	// → ClearPose() + SetPose(initPose)
	// → StartWaypointFollowing()
}

Procedure: Adding a New Actor to a World

  1. Create the SDF <actor> element in your world file (see SDF definition above)
  2. Place skin mesh file (DAE/FBX) in the model's meshes directory
  3. Place animation file(s) in the same directory
  4. Ensure the bone hierarchy in the animation file matches the skin file
  5. Define trajectory waypoints with time-based poses
  6. Set <auto_start>true</auto_start> for immediate playback
  7. Bake NavMesh via WorldNavMeshBuilder for obstacle avoidance
Show full SKILL.md (137 more words)Show less

Common Issues

SymptomCauseFix
Actor T-poses (no animation)Bone names don't match between skin and animationVerify bone hierarchy matches in both files
Animation plays but actor doesn't moveRoot X position is skippedUse trajectory waypoints for actor movement
Actor slides without walkingAnimation speed doesn't match trajectory speedAdjust waypoint timing to match walk cycle
Actor falls through floorMissing CapsuleCollider or NavMeshVerify collider is added; bake NavMesh
Animation jittersKeyframe timing mismatchCheck TicksPerSecond in animation file (default: 25)
Bones are in wrong positionCoordinate conversion issueCheck KeyFramesPosition.Add() axis mapping
Actor doesn't avoid obstaclesNavMesh not baked or agent not configuredRun WorldNavMeshBuilder; check agent radius/height
Actor doesn't loop<loop>false</loop> in SDFSet <loop>true</loop> and wrapMode = Loop
Reset doesn't restart animationRewind() not calledEnsure Reset() calls both Rewind() and RestartWayPointFollowing()

© lge-ros2, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .github/skills/add-actor-animation of lge-ros2/cloisim.

Open the folder on GitHubat commit f4c1f0b

Compare with similar skills

Add Actor Animation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Add Actor Animation compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Actor Animation this skilllge-ros2/cloisim176—~2.4kAutomated safety check: PassMIT
Vercel Composition Patternssupabase/supabase111k58 repos~726Automated safety check: PassMIT
Finishing a Development Branchobra/superpowers297k5 repos~1.9kAutomated safety check: PassMIT
Typescript Advanced Typesrolling-scopes/rsschool-app10k25 repos~4.2kAutomated safety check: PassMPL-2.0
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k4 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Official

    React composition patterns that scale. An agent skill from supabase/supabase.

    111k GitHub starsUsed in 58 repos~726 tokens
    DevelopmentAuto-check passed
  • Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.

    297k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Typescript Advanced Types

    rolling-scopes/rsschool-app

    Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.

    10k GitHub starsUsed in 25 repos~4.2k tokens
    DevelopmentAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Code Review Checklist

    shareAI-lab/learn-claude-code

    Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.

    78k GitHub starsUsed in 4 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Greploop

    onyx-dot-app/onyx

    Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.

    32k GitHub starsUsed in 4 repos~3.3k tokens
    DevelopmentAuto-check passed

More from lge-ros2/cloisim

All 18 skills in this repo
  • Add Compute Shader

    lge-ros2/cloisim

    Add a new compute or surface shader for sensor data processing or visualization.

    176 GitHub stars~2.1k tokensUpdated 4 days ago
    Auto-check passed
  • Add Mesh Import

    lge-ros2/cloisim

    Import 3D mesh files into CLOiSim via the Assimp pipeline, including collision generation and procedural meshes.

    176 GitHub stars~2k tokensUpdated 4 days ago
    Auto-check passed
  • Add Motor Controller

    lge-ros2/cloisim

    Add a new motor or drive controller for robot locomotion. An agent skill from lge-ros2/cloisim.

    176 GitHub stars~1.4k tokensUpdated 4 days ago
    Auto-check passed
  • Add New Plugin

    lge-ros2/cloisim

    Add a new CLOiSimPlugin for bridging a device to the ROS 2 transport layer.

    176 GitHub stars~1.5k tokensUpdated 4 days ago
    Auto-check passed
  • Add New Sensor

    lge-ros2/cloisim

    Add a new sensor device to CLOiSim, including the Device subclass, SDF pipeline wiring, and transport plugin.

    176 GitHub stars~1.6k tokensUpdated 4 days ago
    Auto-check passed
  • Add Noise Model

    lge-ros2/cloisim

    Add a custom noise model for sensor data simulation. An agent skill from lge-ros2/cloisim.

    176 GitHub stars~1.5k tokensUpdated 4 days ago
    Auto-check passed

Categories

Questions about Add Actor Animation

What does Add Actor Animation do?

Add or modify SDF actors with skeletal animation and waypoint-based navigation. Add Actor Animation is an agent skill from lge-ros2/cloisim. Add or modify SDF actors with skeletal animation and waypoint-based navigation.

When should I use Add Actor Animation?

Add Actor Animation fits situations like: : importing animated characters; setting up trajectory waypoints; configuring NavMesh agents for actors; debugging animation playback.

How do I install Add Actor Animation in Claude Code?

Run `npx skills add lge-ros2/cloisim --skill add-actor-animation -a claude-code`. Or copy the skill folder (.github/skills/add-actor-animation in lge-ros2/cloisim) into .claude/skills/add-actor-animation in your project. Claude Code loads it when a task matches its description.

How do I install Add Actor Animation in Codex?

Run `npx skills add lge-ros2/cloisim --skill add-actor-animation -a codex`. Or copy the skill folder (.github/skills/add-actor-animation in lge-ros2/cloisim) into .agents/skills/add-actor-animation in your project. Codex loads it when a task matches its description.

Can I use Add Actor Animation in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add lge-ros2/cloisim --skill add-actor-animation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-actor-animation, .gemini/skills/add-actor-animation, .github/skills/add-actor-animation and .opencode/skills/add-actor-animation in your project.

What does Add Actor Animation need to run?

SKILL.md names no scripts, command-line tools or credentials: Add Actor Animation is instructions for the agent only.

Does Add Actor Animation access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Add Actor Animation safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Add Actor Animation use?

Add Actor Animation is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Add Actor Animation use?

About 2.4k tokens (SKILL.md is roughly 9.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Add Actor Animation?

Skills that share tags, products or a category with Add Actor Animation: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 297k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Add Actor Animation?

lge-ros2 (a GitHub organization) maintains it in lge-ros2/cloisim, which has 176 GitHub stars. The repository holds 18 skills in this directory. The repository was last updated on October 6, 2026.

Source: lge-ros2/cloisim on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.