Docker Simulation Won’t Start
Symptoms: Container exits immediately, ordocker ps shows no running container.
Solutions:
- Verify Docker is running:
docker info - Check for port conflicts — simulation containers bind to specific ports. Run
docker ps -ato see if a stale container is holding the port. - Pull the latest image:
docker pull bedrockdynamics/substrate-sim:<robot-type> - Wait for the health check. Simulation containers take 30-60 seconds to fully initialize Gazebo and the middleware stack. Check logs with
docker logs -f <container>.
MCP Connection Timeout
Symptoms: The agent reports a timeout connecting to the MCP server, or tool calls fail with connection errors. Solutions: The simulation container needs up to 60 seconds to start Gazebo, spawn the robot model, and initialize ros2_control. The MCP server only becomes available after all of this is ready.”joint_names and values must have same length”
Symptoms: The arm controller throws this error when sending joint commands. Cause: The number of command channels in yourChannelManifest does not match the number of joints the robot controller expects.
Fix: Check the manifest factory function for your robot type in roz-core/src/channels.rs. The number of command channels must exactly match the robot’s joint count (e.g., 6 for a UR5).
API Key Errors
Symptoms:401 Unauthorized or invalid API key errors.
Solutions:
- Verify the
ROZ_API_KEYenvironment variable is set: - API keys use the format
roz_sk_<random>. If the key does not start withroz_sk_, it is not a valid roz API key. - Keys are passed as
Authorization: Bearer <key>in HTTP headers. - Keys do not expire by default. If a key is not working, it may have been explicitly revoked.
WASM Verification Failed
Symptoms:"verification failed on tick N" — the WASM controller was rejected before deployment.
Cause: The controller violated a safety limit during pre-deployment verification. The sandbox runs the controller for a fixed number of ticks against simulated inputs, and at least one output value exceeded the configured bounds.
Solutions:
- Check the error message for which channel and limit was exceeded (velocity, acceleration, or position).
- Review the WAT code the agent generated — look for values that exceed the limits defined in the
ChannelManifest. - If the limits are too restrictive for your use case, adjust them in the manifest. Be cautious — these limits exist to protect hardware.
Arm Doesn’t Move
Symptoms: Commands are sent but the robot arm stays stationary in simulation. Solutions:- Bridge relay not started. The Zenoh-to-ROS 2 bridge must be running for commands to reach the simulation. Check that the bridge process is active.
- Wrong container image version. Older container images may not have the correct ros2_control configuration. Pull the latest image.
- Controller not active. In the container, verify the joint controller is loaded and active:
Drone Doesn’t Fly
Symptoms: Takeoff command succeeds but the drone stays on the ground, or velocity commands have no effect. Solutions:- PX4 not ready. The PX4 SITL needs time to initialize. Wait for the
HEARTBEATmessages in the container logs before sending commands. - NaN parameters.
COMMAND_LONGMAVLink messages require all 7 parameter fields. Unset parameters must be0.0, notNaN. Check the MCP tool implementation. - NED frame sign convention. PX4 uses North-East-Down (NED) coordinates. A positive Z velocity means downward. To ascend, send a negative Z velocity in NED, or use the body-frame velocity interface which handles the conversion.