Robot Simulation Setup Skill
Version: 1.0.0 | Alignment: Constitution v6.0.0, Pyodide-Compatible Code | Purpose: Generate educational robot simulation code for browser-based learning
Purpose
Generate production-quality Python code for robot simulations that:
- •Run in Pyodide (browser environment)
- •Use NumPy, Matplotlib, and SciPy (Pyodide-compatible)
- •Visualize robot kinematics, dynamics, and control
- •Provide educational value without heavy simulation engines
- •Support InteractivePython components in Docusaurus
Key Constraint: PyBullet, MuJoCo, and Gazebo are NOT Pyodide-compatible. This skill creates simplified but educational simulations using pure Python + NumPy.
When to Activate
Activate when:
- •Creating code examples for robot kinematics (forward/inverse)
- •Visualizing robot motion, trajectories, or paths
- •Demonstrating control algorithms (PID, MPC, etc.)
- •Teaching robot dynamics concepts
- •Creating interactive robot simulations for lessons
Trigger phrases:
- •"Create robot simulation code"
- •"Generate kinematics visualization"
- •"Build robot arm simulation"
- •"Create trajectory planning example"
- •"Generate control system simulation"
Technical Capabilities
Supported Simulation Types
- •
2D Robot Arm Simulations
- •Forward/inverse kinematics
- •Workspace visualization
- •Trajectory planning
- •Joint angle animations
- •
3D Robot Visualizations
- •3D coordinate frames
- •Robot pose visualization
- •End-effector trajectories
- •Multi-link robot chains
- •
Simplified Dynamics
- •Gravity effects
- •Friction models
- •Inertia calculations
- •Force/torque relationships
- •
Control System Simulations
- •PID control loops
- •Trajectory tracking
- •Error visualization
- •Response plots
Pyodide-Compatible Libraries
✅ Supported:
- •NumPy (arrays, linear algebra, transformations)
- •Matplotlib (2D/3D plotting, animations)
- •SciPy (optimization, signal processing)
- •Math (basic math functions)
❌ NOT Supported:
- •PyBullet (physics engine)
- •MuJoCo (physics engine)
- •Gazebo (simulator)
- •File I/O (reading URDF/SDF files)
- •Subprocess (external processes)
- •Threading (parallel execution)
Code Generation Standards
Code Structure
""" [Clear description of what this simulation demonstrates] Educational Purpose: [What students will learn] Physical AI Context: [How this relates to real robots] """ import numpy as np import matplotlib.pyplot as plt from typing import Tuple, List, Optional # Type hints for all functions # Comprehensive docstrings (Google style) # Error handling (try-except where appropriate) # Clear variable names # Comments explaining physics/math
Example Template: 2D Robot Arm
"""
2D Robot Arm Forward Kinematics Simulation
Educational Purpose: Students learn how joint angles map to end-effector position
Physical AI Context: Real robot arms use this same mathematics for positioning
"""
import numpy as np
import matplotlib.pyplot as plt
from typing import Tuple
def forward_kinematics_2d(
link1_length: float,
link2_length: float,
theta1: float,
theta2: float
) -> Tuple[float, float]:
"""
Calculate end-effector position for 2D 2-link robot arm.
Args:
link1_length: Length of first link (meters)
link2_length: Length of second link (meters)
theta1: Joint angle 1 (radians)
theta2: Joint angle 2 (radians)
Returns:
(x, y) position of end-effector
"""
# Joint 1 position
x1 = link1_length * np.cos(theta1)
y1 = link1_length * np.sin(theta1)
# End-effector position
x = x1 + link2_length * np.cos(theta1 + theta2)
y = y1 + link2_length * np.sin(theta1 + theta2)
return x, y
def visualize_robot_arm(
link1_length: float = 1.0,
link2_length: float = 0.8,
theta1: float = np.pi / 4,
theta2: float = np.pi / 6
):
"""
Visualize 2D robot arm configuration.
Args:
link1_length: Length of first link
link2_length: Length of second link
theta1: Joint angle 1 (radians)
theta2: Joint angle 2 (radians)
"""
# Calculate positions
x1 = link1_length * np.cos(theta1)
y1 = link1_length * np.sin(theta1)
x_end, y_end = forward_kinematics_2d(
link1_length, link2_length, theta1, theta2
)
# Plot
fig, ax = plt.subplots(figsize=(8, 8))
# Draw links
ax.plot([0, x1], [0, y1], 'b-', linewidth=3, label='Link 1')
ax.plot([x1, x_end], [y1, y_end], 'r-', linewidth=3, label='Link 2')
# Draw joints
ax.plot(0, 0, 'ko', markersize=10, label='Base')
ax.plot(x1, y1, 'ko', markersize=10, label='Joint 1')
ax.plot(x_end, y_end, 'ro', markersize=10, label='End-effector')
# Formatting
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
ax.legend()
ax.set_xlabel('X (meters)')
ax.set_ylabel('Y (meters)')
ax.set_title('2D Robot Arm Configuration')
plt.tight_layout()
plt.show()
# Example usage
if __name__ == "__main__":
visualize_robot_arm()
Example Template: Trajectory Planning
"""
Robot Trajectory Planning Simulation
Educational Purpose: Students learn how to plan smooth robot motions
Physical AI Context: Real robots use trajectory planning to avoid jerky motions
"""
import numpy as np
import matplotlib.pyplot as plt
from typing import List, Tuple
def generate_trajectory(
start_pos: Tuple[float, float],
end_pos: Tuple[float, float],
num_points: int = 100
) -> Tuple[List[float], List[float]]:
"""
Generate smooth trajectory using cubic interpolation.
Args:
start_pos: (x, y) starting position
end_pos: (x, y) ending position
num_points: Number of trajectory points
Returns:
(x_trajectory, y_trajectory) lists
"""
t = np.linspace(0, 1, num_points)
# Cubic interpolation for smooth motion
x_traj = start_pos[0] + (end_pos[0] - start_pos[0]) * (3*t**2 - 2*t**3)
y_traj = start_pos[1] + (end_pos[1] - start_pos[1]) * (3*t**2 - 2*t**3)
return x_traj.tolist(), y_traj.tolist()
def visualize_trajectory(
start_pos: Tuple[float, float] = (0, 0),
end_pos: Tuple[float, float] = (2, 1.5)
):
"""Visualize planned trajectory."""
x_traj, y_traj = generate_trajectory(start_pos, end_pos)
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x_traj, y_traj, 'b-', linewidth=2, label='Planned Trajectory')
ax.plot(start_pos[0], start_pos[1], 'go', markersize=10, label='Start')
ax.plot(end_pos[0], end_pos[1], 'ro', markersize=10, label='End')
ax.set_xlabel('X (meters)')
ax.set_ylabel('Y (meters)')
ax.set_title('Robot Trajectory Planning')
ax.grid(True, alpha=0.3)
ax.legend()
ax.set_aspect('equal')
plt.tight_layout()
plt.show()
Best Practices
1. Educational Focus
- •Start Simple: Begin with 2D, single-link examples
- •Build Complexity: Progress to 3D, multi-link robots
- •Real-World Context: Connect to actual robot applications
- •Visual Clarity: Use clear colors, labels, legends
2. Code Quality
- •Type Hints: All functions should have type hints
- •Docstrings: Google-style docstrings for all functions
- •Error Handling: Validate inputs, handle edge cases
- •Comments: Explain physics/math concepts in comments
3. Pyodide Compatibility
- •Test in Browser: Verify code runs in InteractivePython
- •Avoid File I/O: Don't read URDF/SDF files
- •Use NumPy: Prefer NumPy arrays over Python lists for performance
- •Limit Complexity: Keep simulations lightweight for browser
4. Interactive Elements
- •Parameter Tuning: Allow students to modify joint angles, link lengths
- •Real-Time Updates: Show how changes affect robot configuration
- •Multiple Views: Provide different visualization perspectives
Common Patterns
Pattern 1: Forward Kinematics
# Calculate end-effector position from joint angles
def forward_kinematics(joint_angles, link_lengths):
# Implementation
pass
Pattern 2: Inverse Kinematics
# Calculate joint angles from desired end-effector position
def inverse_kinematics(target_pos, link_lengths):
# Implementation (may use optimization)
pass
Pattern 3: Workspace Visualization
# Show reachable positions of robot
def visualize_workspace(link_lengths):
# Generate reachable points
# Plot workspace boundary
pass
Pattern 4: Trajectory Animation
# Animate robot following a trajectory
def animate_trajectory(trajectory_points):
# For each point, calculate joint angles
# Visualize robot configuration
pass
Integration with InteractivePython
Usage in MDX Files
<InteractivePython>
{`
import numpy as np
import matplotlib.pyplot as plt
# [Generated simulation code here]
`}
</InteractivePython>
Student Modifications
Encourage students to:
- •Modify joint angles and observe effects
- •Change link lengths and see workspace changes
- •Adjust trajectory parameters
- •Experiment with different control gains
Troubleshooting
Issue: Code doesn't run in Pyodide
Solution: Check for unsupported libraries. Use only NumPy, Matplotlib, SciPy, Math.
Issue: Animation too slow
Solution: Reduce number of points, simplify calculations, use vectorized NumPy operations.
Issue: Visualization unclear
Solution: Add labels, legends, grid, adjust colors, use appropriate aspect ratios.
Output Format
When generating code:
- •Header Comment: Clear description and educational purpose
- •Imports: Only Pyodide-compatible libraries
- •Functions: Type hints, docstrings, error handling
- •Example Usage: Working example that demonstrates functionality
- •Visualization: Clear, labeled plots with appropriate formatting
Remember: You're creating educational simulations, not production robot controllers. Focus on clarity, learning, and Pyodide compatibility over realism.