coppelia_step
Execute Python code in CoppeliaSim and capture dual snapshots for visual verification of physical simulation, preventing false success from code logs.
Instructions
🚨 STRICT SUPREME DIRECTIVE FOR AI AGENT (READ THIS FIRST): NEVER CONCLUDE OR REPORT SUCCESS BASED SOLELY ON CODE LOGS OR EXIT STATUS! You are interacting with a physical 3D simulation environment. Code that executes without error often produces physically broken scenes (e.g. walls collapsing under gravity, objects intersecting, robots falling through floors or flipped upside-down).
THEREFORE, YOU ARE STRICTLY REQUIRED TO USE YOUR EYES: Every call returns TWO visual snapshots:
/tmp/coppelia_topdown.png(TOP-DOWN BIRD'S-EYE VIEW of entire board)/tmp/coppelia_snapshot.png(ISOMETRIC 3D PERSPECTIVE VIEW of structures)
MANDATORY PROTOCOL AFTER EVERY CALL:
You MUST explicitly read and inspect BOTH image files using your image viewing / file inspection capabilities.
Check
/tmp/coppelia_topdown.pngto verify: 2D room dimensions, obstacle spacing, robot heading, and boundary clearance.Check
/tmp/coppelia_snapshot.pngto verify: wall heights (e.g. 5m), roof alignment, upright robot stability, and no physical sagging or collision clipping.IF YOUR EYES SEE ANY VISUAL DEFECT (collapsed wall, misplaced robot, clipping mesh), YOU MUST NOT CLAIM COMPLETION. You must immediately self-correct your script coordinates and run again! Reporting "Task complete" without having visually verified both screenshots is a fatal protocol violation.
TOOL SUMMARY: Execute Python code directly inside CoppeliaSim simulator. Auto-launches simulator if closed, runs physics/scene code, auto-captures dual camera snapshots, and returns execution result in ONE single call.
SCENE HIERARCHY AWARENESS RULE (PREVENT DUPLICATE MODELS):
Every call returns "scene_objects": [{"name": "...", "is_model": bool, "pos": [x, y, z]}].
ALWAYS inspect scene_objects before creating/spawning:
DO NOT spawn a robot if a model with the same alias/name already exists in
scene_objects.To reuse existing robot:
robot = sim.getObject('/PioneerP3DX')(or use existing handle).To remove duplicate/old objects:
sim.removeObject(sim.getObject('/OldName')).
WALLS & ENCLOSURE VISIBILITY RULE (PREVENT GREY VOID BLINDNESS): NEVER build solid block labyrinths or closed rooms that entomb the camera/robot in solid gray geometry!
DO NOT spawn 50+ individual solid wall cuboids for mazes. Use thin perimeter borders instead (thickness 0.1m - 0.2m, NOT 0.8m thick blocks!).
Color your walls and floor distinctly (e.g. walls = light blue
[0.3, 0.6, 0.9], floor = dark grey[0.2, 0.2, 0.2]). NEVER leave all shapes default uncolored grey!If creating rooms or houses with roofs: DO NOT seal roofs with solid opaque material. Either leave roof off, or make it high and distinctly colored so internal contents remain visible.
INJECTED OBJECTS IN CODE:
sim: CoppeliaSim ZeroMQ API module.simIK: CoppeliaSim Inverse/Forward Kinematics solver module.simOMPL: Open Motion Planning Library module (RRT, RRT*, PRM path planners).load_robot(alias, position=[x,y,z], orientation=[a,b,g]): Loads robot model. Valid aliases: ['pioneer', 'youbot', 'hexapod', 'ant_hexapod', 'omni', 'quadcopter', 'asti', 'panda', 'ur5', 'ur10', 'vacuum', 'epuck'].get_scene_hierarchy(): Returns current active user models and shapes in the scene.get_floor_info(): Returns default floor size, position, and bounding box.client: RemoteAPIClient instance.
EXACT API CHEAT-SHEET (DO NOT SEARCH OR GUESS - USE THESE DIRECTLY):
Shapes & Environment:
Create cuboid:
h = sim.createPrimitiveShape(sim.primitiveshape_cuboid, [sizeX, sizeY, sizeZ], 0)Create cylinder:
h = sim.createPrimitiveShape(sim.primitiveshape_cylinder, [diameter, diameter, height], 0)Create sphere:
h = sim.createPrimitiveShape(sim.primitiveshape_sphere, [diameter, diameter, diameter], 0)Make static (walls/floors/roofs):
sim.setObjectInt32Param(h, sim.shapeintparam_static, 1)Make respondable (solid collisions):
sim.setObjectInt32Param(h, sim.shapeintparam_respondable, 1)Color shape:
sim.setShapeColor(h, None, sim.colorcomponent_ambient_diffuse, [R, G, B])# values 0.0 - 1.0
Positions & Hierarchy:
Set position:
sim.setObjectPosition(handle, -1, [x, y, z])# -1 = absolute world coordsGet position:
pos = sim.getObjectPosition(handle, -1)# returns [x, y, z]Set orientation:
sim.setObjectOrientation(handle, -1, [alpha, beta, gamma])Find object by name:
h = sim.getObject('/ObjectName', {'noError': True})Remove object:
sim.removeObject(handle)
Collision & Distance Detection:
Collision check:
result, collPair = sim.checkCollision(entity1Handle, entity2Handle)# 1 = colliding, 0 = clearDistance check:
result, distData = sim.checkDistance(entity1Handle, entity2Handle, threshold)
Path & Motion Planning (simOMPL & simIK):
simOMPL Task:
task = simOMPL.createTask('task_name')Set Algorithm:
simOMPL.setAlgorithm(task, simOMPL.Algorithm.RRTConnect)# or RRTstar, PRMCompute Path:
solved, path = simOMPL.compute(task, maxTime=4.0)simIK Solver:
env = simIK.createEnvironment(); simIK.addElementFromScene(env, ikGroup, tip, target, base)Native Path Interpolation:
pathHandle = sim.createPath(ctrlPoints, options)
Simulation & Motors:
Start simulation:
sim.startSimulation()Stop simulation:
sim.stopSimulation()Set motor velocity:
sim.setJointTargetVelocity(jointHandle, float_val)Read proximity sensor:
detected, dist, pt, obj, normal = sim.readProximitySensor(sensorHandle)
sim.stopSimulation()
# House floor
floor = sim.createPrimitiveShape(sim.primitiveshape_cuboid, [10.0, 10.0, 0.2], 0)
sim.setObjectInt32Param(floor, sim.shapeintparam_static, 1)
sim.setObjectInt32Param(floor, sim.shapeintparam_respondable, 1)
# Spawn robot inside
robot = load_robot('pioneer', [0.0, 0.0, 0.3])
sim.startSimulation()Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| reset | No | ||
| headless | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |