{
 "lanes": [
  {
   "id": "free",
   "label": "Free driving (start square)"
  },
  {
   "id": "cable",
   "label": "1. 1 cm cable"
  },
  {
   "id": "threshold",
   "label": "2. 3 cm threshold"
  },
  {
   "id": "step6",
   "label": "3. 6 cm step"
  },
  {
   "id": "curb12",
   "label": "4. 12 cm curb"
  },
  {
   "id": "stairs",
   "label": "5. Stairs, 3 × 7 cm"
  },
  {
   "id": "ramp15",
   "label": "6. 15° ramp"
  },
  {
   "id": "ramp30",
   "label": "7. 30° ramp"
  },
  {
   "id": "gaps",
   "label": "8. Gaps of 5 and 12 cm"
  },
  {
   "id": "gravel",
   "label": "9. Gravel, 1–1.5 cm stones"
  },
  {
   "id": "corridor",
   "label": "10. 60 cm corridor, sharp turn"
  },
  {
   "id": "door",
   "label": "11. Door with a handle"
  },
  {
   "id": "track",
   "label": "12. ε track with small hills (a loop)"
  }
 ],
 "robots": [
  {
   "robot": "wheeled",
   "page": "index2Wheels.php",
   "name": "Self-balancing robot (wheeled)",
   "title": "Wheeled",
   "text": "Two wheels on one axle, self-balancing",
   "category": "Drive types",
   "image": "img/wheeled.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Left wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Right wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "fell",
    "bottle_fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "tiltDeg": 2,
    "fallen": false,
    "balancing": true,
    "bottleOn": true,
    "bottleRisk": 0.5,
    "waterLitres": 1
   }
  },
  {
   "robot": "bike",
   "page": "indexBike.php",
   "name": "Self-Balancing Bicycle Simulator",
   "title": "Balancing bike",
   "text": "Two wheels in a line",
   "category": "Drive types",
   "image": "img/bike.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "drive",
     "name": "Drive motor (rear wheel)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "rw",
     "name": "Reaction wheel motor",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "steer",
     "name": "Steering servo",
     "type": "servo",
     "overridable": true,
     "range": [
      -35,
      35
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "leanDeg": 1,
    "steerDeg": 0,
    "reactionWheelRpm": 0,
    "speed": 0,
    "fallen": false,
    "mode": "both"
   }
  },
  {
   "robot": "synchro",
   "page": "indexSynchro.php",
   "name": "Synchro Drive Simulator",
   "title": "Synchro drive",
   "text": "All wheels steer together",
   "category": "Drive types",
   "image": "img/synchro.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "strafe"
   ],
   "motors": [
    {
     "id": "drive",
     "name": "Drive motor (all wheels)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "steer",
     "name": "Steering motor (encoder)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "steerDeg": 0
   }
  },
  {
   "robot": "mecanum",
   "page": "indexOmni.php?variant=mecanum",
   "name": "Omnidirectional Simulator",
   "title": "Omnidirectional",
   "text": "Swedish, omni wheels or 8 motors",
   "category": "Drive types",
   "image": "img/omni.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Front left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Front right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Rear left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Rear right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {}
  },
  {
   "robot": "kiwi",
   "page": "indexOmni.php?variant=kiwi",
   "name": "Omnidirectional Simulator",
   "title": "Omnidirectional",
   "text": "Swedish, omni wheels or 8 motors",
   "category": "Drive types",
   "image": "img/omni.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "M1",
     "name": "Front left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "M2",
     "name": "Rear",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "M3",
     "name": "Front right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {}
  },
  {
   "robot": "swerve",
   "page": "indexOmni.php?variant=swerve",
   "name": "Omnidirectional Simulator",
   "title": "Omnidirectional",
   "text": "Swedish, omni wheels or 8 motors",
   "category": "Drive types",
   "image": "img/omni.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "D1",
     "name": "Front left drive",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "D2",
     "name": "Front right drive",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "D3",
     "name": "Rear left drive",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "D4",
     "name": "Rear right drive",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "S1",
     "name": "Front left steer",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "S2",
     "name": "Front right steer",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "S3",
     "name": "Rear left steer",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "S4",
     "name": "Rear right steer",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {}
  },
  {
   "robot": "tracked",
   "page": "indexTracked.php",
   "name": "Tracked Robot Simulator",
   "title": "Tracked",
   "text": "Caterpillar tracks",
   "category": "Drive types",
   "image": "img/tracked.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Left track",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Right track",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "chi": 1.77
   }
  },
  {
   "robot": "skid",
   "page": "indexSkid.php",
   "name": "Skid Steer Simulator",
   "title": "Skid steer",
   "text": "Steering by slipping",
   "category": "Drive types",
   "image": "img/skid.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Front left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Front right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Rear left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Rear right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "chi": 1.69
   }
  },
  {
   "robot": "ackermann",
   "page": "indexAckermann.php",
   "name": "Ackermann Simulator",
   "title": "Ackermann",
   "text": "Car steering",
   "category": "Drive types",
   "image": "img/ackermann.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "drive",
     "name": "Drive motor (rear)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "steer",
     "name": "Steering servo",
     "type": "servo",
     "overridable": true,
     "range": [
      -40,
      40
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "radius": null
   }
  },
  {
   "robot": "4wd",
   "page": "index4WD.php",
   "name": "4WD Simulator",
   "title": "4WD",
   "text": "Four driven wheels",
   "category": "Drive types",
   "image": "img/4wd.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Front left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Front right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Rear left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Rear right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "steerF",
     "name": "Front steering servo",
     "type": "servo",
     "overridable": true,
     "range": [
      -35,
      35
     ]
    },
    {
     "id": "steerR",
     "name": "Rear steering servo",
     "type": "servo",
     "overridable": true,
     "range": [
      -35,
      35
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {}
  },
  {
   "robot": "whegs",
   "page": "indexWhegs.php",
   "name": "Walk Wheels Simulator",
   "title": "Walk wheels",
   "text": "Half wheel, half leg",
   "category": "Drive types",
   "image": "img/whegs.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Left side (3 whegs)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Right side (3 whegs)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {}
  },
  {
   "robot": "quadruped",
   "page": "indexQuadruped.php",
   "name": "Quadruped (XL430)",
   "title": "Quadruped",
   "text": "Go2 clone with an OpenMANIPULATOR-X arm",
   "category": "Legged robots",
   "image": "img/quadruped.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "arm_joint1",
     "name": "Arm base",
     "type": "servo",
     "overridable": true,
     "range": [
      -162,
      162
     ]
    },
    {
     "id": "arm_joint2",
     "name": "Arm shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -103,
      90
     ]
    },
    {
     "id": "arm_joint3",
     "name": "Arm elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -54,
      79
     ]
    },
    {
     "id": "arm_joint4",
     "name": "Arm wrist",
     "type": "servo",
     "overridable": true,
     "range": [
      -103,
      117
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      0,
      70
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "door"
   ],
   "skills": [
    "lie_down",
    "stand_up",
    "pick",
    "to_back",
    "to_box",
    "walk_to_door",
    "open_door",
    "walk_through",
    "close_door",
    "walk_to_table"
   ],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "bodyHeight": 0.333,
    "walking": false,
    "message": "",
    "reach": {
     "tip": [
      0.134,
      0,
      0.241
     ],
     "target": null
    },
    "arm": {
     "holding": null,
     "busy": false,
     "grasp": {
      "x": 0.186,
      "y": 0.617,
      "z": 0
     }
    },
    "cubes": [
     {
      "id": "red",
      "x": 0.3,
      "y": 0.015,
      "z": -0.105,
      "held": false,
      "onBack": false,
      "inBox": null
     },
     {
      "id": "green",
      "x": 0.3,
      "y": 0.015,
      "z": -0.035,
      "held": false,
      "onBack": false,
      "inBox": null
     },
     {
      "id": "blue",
      "x": 0.3,
      "y": 0.015,
      "z": 0.035,
      "held": false,
      "onBack": false,
      "inBox": null
     },
     {
      "id": "yellow",
      "x": 0.3,
      "y": 0.015,
      "z": 0.105,
      "held": false,
      "onBack": false,
      "inBox": null
     }
    ]
   }
  },
  {
   "robot": "mini",
   "page": "indexSmall.php",
   "name": "Mini quadruped (AD002)",
   "title": "Mini quadruped",
   "text": "With Adeept AD002 micro servos",
   "category": "Legged robots",
   "image": "img/mini.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "bodyHeight": 0.122,
    "walking": false,
    "message": ""
   }
  },
  {
   "robot": "wheellegs",
   "page": "indexWheelLegs.php",
   "name": "Wheel-Legged Robot Simulator",
   "title": "Wheel-legged",
   "text": "Wheels on its feet, like the Go2-W",
   "category": "Legged robots",
   "image": "img/wheellegs.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FLw",
     "name": "Front left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FRw",
     "name": "Front right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RLw",
     "name": "Rear left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RRw",
     "name": "Rear right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FLt",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "FLk",
     "name": "Front left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "FRt",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "FRk",
     "name": "Front right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "RLt",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "RLk",
     "name": "Rear left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "RRt",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "RRk",
     "name": "Rear right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "bodyHeight": 0.385,
    "lifted": [],
    "level": true
   }
  },
  {
   "robot": "ostrich",
   "page": "indexOstrich.php",
   "name": "Wheeled Ostrich Simulator",
   "title": "Wheeled ostrich",
   "text": "Two legs with wheels, balancing",
   "category": "Legged robots",
   "image": "img/ostrich.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "wL",
     "name": "Left wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "wR",
     "name": "Right wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "hipL",
     "name": "Left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "kneeL",
     "name": "Left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "hipR",
     "name": "Right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "kneeR",
     "name": "Right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "fell",
    "jump"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "tiltDeg": 1,
    "speed": 0.008,
    "legLength": 0.28,
    "mode": "ground",
    "fallen": false,
    "autoJump": true
   }
  },
  {
   "robot": "humanoid",
   "page": "indexHumanoid.php",
   "name": "Humanoid Legs Simulator",
   "title": "Humanoid legs",
   "text": "From the pelvis down",
   "category": "Legged robots",
   "image": "img/humanoid.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "L_yaw",
     "name": "Left hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "L_roll",
     "name": "Left hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -45,
      45
     ]
    },
    {
     "id": "L_pitch",
     "name": "Left hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -120,
      120
     ]
    },
    {
     "id": "L_knee",
     "name": "Left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "L_ankleP",
     "name": "Left ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "L_ankleR",
     "name": "Left ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -45,
      45
     ]
    },
    {
     "id": "R_yaw",
     "name": "Right hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "R_roll",
     "name": "Right hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -45,
      45
     ]
    },
    {
     "id": "R_pitch",
     "name": "Right hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -120,
      120
     ]
    },
    {
     "id": "R_knee",
     "name": "Right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -135,
      135
     ]
    },
    {
     "id": "R_ankleP",
     "name": "Right ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "R_ankleR",
     "name": "Right ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -45,
      45
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "comInside": true,
    "comMarginMm": 64,
    "feetOnFloor": [
     true,
     true
    ],
    "stepHeight": 0.03,
    "stepLength": 0.06,
    "sway": 0.045
   }
  },
  {
   "robot": "snake",
   "page": "indexSnake.php",
   "name": "Snake Robot Simulator",
   "title": "Snake robot",
   "text": "4 to 12 Dynamixel XL430 in a chain",
   "category": "Snake robot",
   "image": "img/snake.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "J1",
     "name": "J1 · ID 1 · pitch",
     "type": "servo",
     "overridable": true,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "J2",
     "name": "J2 · ID 2 · yaw",
     "type": "servo",
     "overridable": true,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "J3",
     "name": "J3 · ID 3 · pitch",
     "type": "servo",
     "overridable": true,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "J4",
     "name": "J4 · ID 4 · yaw",
     "type": "servo",
     "overridable": true,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "J5",
     "name": "J5 · ID 5 · pitch",
     "type": "servo",
     "overridable": true,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "J6",
     "name": "J6 · ID 6 · yaw",
     "type": "servo",
     "overridable": true,
     "range": [
      -90,
      90
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "gait": null,
    "servos": 6,
    "underside": "wheels",
    "touching": 7,
    "blocked": "",
    "waveHz": 0,
    "speed": 0
   }
  },
  {
   "robot": "create3",
   "page": "indexCreate3.php",
   "name": "iRobot Create 3 Simulator",
   "title": "iRobot Create 3",
   "text": "Educational robot with real sensors",
   "category": "Drive types",
   "image": "img/create3.jpg",
   "interfaces": [],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "bump",
    "cliff"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [],
   "telemetry": {
    "bumpers": {
     "left": false,
     "right": false
    },
    "bumpZones": {
     "left": false,
     "front_left": false,
     "front_center": false,
     "front_right": false,
     "right": false
    },
    "irIntensity": {
     "side_left": 0,
     "left": 0,
     "front_left": 0,
     "front_center_left": 0,
     "front_center_right": 0,
     "front_right": 0,
     "right": 0
    },
    "cliff": {
     "side_left": false,
     "front_left": false,
     "front_right": false,
     "side_right": false
    },
    "wheelDrop": {
     "left": false,
     "right": false
    }
   }
  },
  {
   "robot": "go2",
   "page": "indexGo2.php",
   "name": "Unitree Go2 Simulator",
   "title": "Unitree Go2 Pro",
   "text": "Robot dog: sport mode, tricks, lights and obstacle avoidance",
   "category": "Real robots, real interfaces",
   "image": "img/go2.jpg",
   "interfaces": [
    {
     "key": "webrtc",
     "family": "Unitree WebRTC"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "webrtc"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Posture",
     "label": "Stand up",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1004})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1004
      }
     }
    },
    {
     "group": "Posture",
     "label": "Balance stand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1002})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1002
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stand down",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1005})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1005
      }
     }
    },
    {
     "group": "Posture",
     "label": "Recovery stand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1006})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1006
      }
     }
    },
    {
     "group": "Posture",
     "label": "Sit",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1009})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1009
      }
     }
    },
    {
     "group": "Posture",
     "label": "Rise from sit",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1010})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1010
      }
     }
    },
    {
     "group": "Posture",
     "label": "Damp",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1001})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1001
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stop",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1003})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1003
      }
     }
    },
    {
     "group": "Walk",
     "label": "Move 0.5 m/s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1008,\"parameter\":{\"x\":0.5,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1008,
       "parameter": {
        "x": 0.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Move ↺ 1 rad/s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1008,\"parameter\":{\"x\":0,\"y\":0,\"z\":1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1008,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 1
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Speed slow",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1015,\"parameter\":{\"data\":-1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1015,
       "parameter": {
        "data": -1
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Speed normal",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1015,\"parameter\":{\"data\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1015,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Speed fast",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1015,\"parameter\":{\"data\":1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1015,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Run",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1062,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1062,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Static walk",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1061,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1061,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Classic walk",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2049,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2049,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Continuous gait",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1019,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1019,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Look up",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1007,\"parameter\":{\"x\":0,\"y\":-0.3,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1007,
       "parameter": {
        "x": 0,
        "y": -0.3,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Lean left",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1007,\"parameter\":{\"x\":-0.3,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1007,
       "parameter": {
        "x": -0.3,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Euler 0",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1007,\"parameter\":{\"x\":0,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1007,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Pose mode",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1028,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1028,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Hello",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1016})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1016
      }
     }
    },
    {
     "group": "Actions",
     "label": "Stretch",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1017})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1017
      }
     }
    },
    {
     "group": "Actions",
     "label": "Content",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1020})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1020
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dance 1",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1022})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1022
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dance 2",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1023})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1023
      }
     }
    },
    {
     "group": "Actions",
     "label": "Scrape",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1029})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1029
      }
     }
    },
    {
     "group": "Actions",
     "label": "Heart",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1036})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1036
      }
     }
    },
    {
     "group": "Actions",
     "label": "Front jump",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1031})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1031
      }
     }
    },
    {
     "group": "Actions",
     "label": "Front pounce",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1032})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1032
      }
     }
    },
    {
     "group": "Agile",
     "label": "Handstand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2044,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2044,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Handstand off",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2044,\"parameter\":{\"data\":false}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2044,
       "parameter": {
        "data": false
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Back stand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2050,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2050,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Back stand off",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2050,\"parameter\":{\"data\":false}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2050,
       "parameter": {
        "data": false
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Front flip",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1030,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1030,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Back flip",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2043,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2043,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Left flip",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2041,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2041,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Bound",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2046,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2046,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Jump gait",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2047,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2047,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Cross step",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2051,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2051,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Agile",
     "label": "Free walk",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2045,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2045,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "LED purple",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1007,\"parameter\":{\"color\":\"purple\",\"time\":5}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1007,
       "parameter": {
        "color": "purple",
        "time": 5
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "LED cyan flash",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1007,\"parameter\":{\"color\":\"cyan\",\"time\":5,\"flash_cycle\":1000}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1007,
       "parameter": {
        "color": "cyan",
        "time": 5,
        "flash_cycle": 1000
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Brightness 10",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1005,\"parameter\":{\"brightness\":10}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1005,
       "parameter": {
        "brightness": 10
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Brightness 0",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1005,\"parameter\":{\"brightness\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1005,
       "parameter": {
        "brightness": 0
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Avoid on",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/obstacles_avoid/request\", {\"api_id\":1001,\"parameter\":{\"enable\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/obstacles_avoid/request",
       "api_id": 1001,
       "parameter": {
        "enable": true
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Avoid off",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/obstacles_avoid/request\", {\"api_id\":1001,\"parameter\":{\"enable\":false}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/obstacles_avoid/request",
       "api_id": 1001,
       "parameter": {
        "enable": false
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Get state",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1034,\"parameter\":[\"state\",\"bodyHeight\",\"speedLevel\",\"gait\",\"continuousGait\",\"economicGait\"]})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1034,
       "parameter": [
        "state",
        "bodyHeight",
        "speedLevel",
        "gait",
        "continuousGait",
        "economicGait"
       ]
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Motion mode?",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/motion_switcher/request\", {\"api_id\":1001})",
     "action": {
      "webrtc": {
       "topic": "rt/api/motion_switcher/request",
       "api_id": 1001
      }
     }
    }
   ],
   "telemetry": {
    "sportmodestate": {
     "mode": 1,
     "gait_type": 0,
     "body_height": 0.31,
     "foot_raise_height": 0.08,
     "velocity": [
      0,
      0,
      0
     ],
     "yaw_speed": 0,
     "range_obstacle": [
      2,
      2,
      2,
      2
     ]
    },
    "state": {
     "state": "stand",
     "bodyHeight": 0.31,
     "speedLevel": 0,
     "gait": 1,
     "continuousGait": false,
     "economicGait": false
    },
    "motionMode": "mcf",
    "avoid": false,
    "webrtc": []
   }
  },
  {
   "robot": "g1",
   "page": "indexG1.php",
   "name": "Unitree G1 Simulator",
   "title": "Unitree G1",
   "text": "Humanoid: FSM states, walking and arm gestures",
   "category": "Real robots, real interfaces",
   "image": "img/g1.jpg",
   "interfaces": [
    {
     "key": "webrtc",
     "family": "Unitree WebRTC"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "left_hip_pitch",
     "name": "left hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_roll",
     "name": "left hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_yaw",
     "name": "left hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_knee",
     "name": "left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_ankle_pitch",
     "name": "left ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_ankle_roll",
     "name": "left ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_pitch",
     "name": "right hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_roll",
     "name": "right hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_yaw",
     "name": "right hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_knee",
     "name": "right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_ankle_pitch",
     "name": "right ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_ankle_roll",
     "name": "right ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "waist_yaw",
     "name": "waist yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -150,
      150
     ]
    },
    {
     "id": "left_shoulder_pitch",
     "name": "left shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_roll",
     "name": "left shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_yaw",
     "name": "left shoulder yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_elbow",
     "name": "left elbow",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_wrist_roll",
     "name": "left wrist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_pitch",
     "name": "right shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_roll",
     "name": "right shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_yaw",
     "name": "right shoulder yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_elbow",
     "name": "right elbow",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_wrist_roll",
     "name": "right wrist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "webrtc",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "FSM state (7101)",
     "label": "Zero torque 0",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Damp 1",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Squat 2",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 2
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Sit 3",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":3}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 3
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Lock stand 4",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":4}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 4
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Start (walk) 200",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":200}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 200
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Walk 500",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":500}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 500
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Walk + waist 501",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":501}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 501
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Run 801",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":801}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 801
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Lie → stand 702",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":702}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 702
       }
      }
     }
    },
    {
     "group": "FSM state (7101)",
     "label": "Squat ↔ stand 706",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":706}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 706
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Forward 0.5 m/s, 2 s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7105,\"parameter\":{\"velocity\":[0.5,0,0],\"duration\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0.5,
         0,
         0
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Sideways 0.3 m/s, 2 s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7105,\"parameter\":{\"velocity\":[0,0.3,0],\"duration\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0.3,
         0
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Turn 0.8 rad/s, 2 s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7105,\"parameter\":{\"velocity\":[0,0,0.8],\"duration\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0,
         0.8
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Joystick: turn right",
     "line": "conn.datachannel.pub_sub.publish_without_callback(\"rt/wirelesscontroller\", {\"lx\":0,\"ly\":0,\"rx\":0.6,\"ry\":0,\"keys\":0})",
     "action": {
      "webrtc": {
       "topic": "rt/wirelesscontroller",
       "data": {
        "lx": 0,
        "ly": 0,
        "rx": 0.6,
        "ry": 0,
        "keys": 0
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Joystick: forward",
     "line": "conn.datachannel.pub_sub.publish_without_callback(\"rt/wirelesscontroller\", {\"lx\":0,\"ly\":0.6,\"rx\":0,\"ry\":0,\"keys\":0})",
     "action": {
      "webrtc": {
       "topic": "rt/wirelesscontroller",
       "data": {
        "lx": 0,
        "ly": 0.6,
        "rx": 0,
        "ry": 0,
        "keys": 0
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Joystick: stop",
     "line": "conn.datachannel.pub_sub.publish_without_callback(\"rt/wirelesscontroller\", {\"lx\":0,\"ly\":0,\"rx\":0,\"ry\":0,\"keys\":0})",
     "action": {
      "webrtc": {
       "topic": "rt/wirelesscontroller",
       "data": {
        "lx": 0,
        "ly": 0,
        "rx": 0,
        "ry": 0,
        "keys": 0
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Get FSM id",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7001})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7001
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Left kiss 12",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":12}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 12
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Hands up 15",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":15}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 15
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Clap 17",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":17}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 17
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "High five 18",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":18}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 18
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Hug 19",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":19}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 19
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Arm heart 20",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":20}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 20
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Right heart 21",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":21}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 21
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Reject 22",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":22}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 22
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Right hand up 23",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":23}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 23
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "X-ray 24",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":24}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 24
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Face wave 25",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":25}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 25
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "High wave 26",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":26}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 26
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Handshake 27",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":27}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 27
       }
      }
     }
    },
    {
     "group": "Arm actions (7106)",
     "label": "Release 99",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":99}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 99
       }
      }
     }
    }
   ],
   "telemetry": {
    "fsm_id": 3,
    "fsm_name": "sit",
    "fsm_mode": 0,
    "posture": "chair",
    "arm_action": null,
    "velocity": [
     0,
     0,
     0
    ],
    "webrtc": []
   }
  },
  {
   "robot": "turtlebot4",
   "page": "indexTurtleBot4.php",
   "name": "TurtleBot 4 Simulator",
   "title": "TurtleBot 4 / Lite",
   "text": "The ROS 2 robot: Create 3 base, LiDAR, OAK-D camera and a dock",
   "category": "Real robots, real interfaces",
   "image": "img/turtlebot4.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros",
    "bump",
    "cliff"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel",
     "label": "Forward 0.2 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.2,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Turn left 1 rad/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 1
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Undock",
     "line": "ros2 action send_goal /undock irobot_create_msgs/action/Undock \"{}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/undock",
       "type": "irobot_create_msgs/action/Undock",
       "msg": {}
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dock",
     "line": "ros2 action send_goal /dock irobot_create_msgs/action/Dock \"{}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/dock",
       "type": "irobot_create_msgs/action/Dock",
       "msg": {}
      }
     }
    },
    {
     "group": "Actions",
     "label": "Drive 0.5 m",
     "line": "ros2 action send_goal /drive_distance irobot_create_msgs/action/DriveDistance \"{distance: 0.5, max_translation_speed: 0.2}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/drive_distance",
       "type": "irobot_create_msgs/action/DriveDistance",
       "msg": {
        "distance": 0.5,
        "max_translation_speed": 0.2
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Rotate 90°",
     "line": "ros2 action send_goal /rotate_angle irobot_create_msgs/action/RotateAngle \"{angle: 1.57, max_rotation_speed: 1}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/rotate_angle",
       "type": "irobot_create_msgs/action/RotateAngle",
       "msg": {
        "angle": 1.57,
        "max_rotation_speed": 1
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Arc 90°, r 0.3 m",
     "line": "ros2 action send_goal /drive_arc irobot_create_msgs/action/DriveArc \"{translate_direction: 1, angle: 1.57, radius: 0.3, max_translation_speed: 0.2}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/drive_arc",
       "type": "irobot_create_msgs/action/DriveArc",
       "msg": {
        "translate_direction": 1,
        "angle": 1.57,
        "radius": 0.3,
        "max_translation_speed": 0.2
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Go to (1, 0.5)",
     "line": "ros2 action send_goal /navigate_to_position irobot_create_msgs/action/NavigateToPosition \"{achieve_goal_heading: true, goal_pose: {pose: {position: {x: 1, y: 0.5, z: 0}, orientation: {x: 0, y: 0, z: 0, w: 1}}}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/navigate_to_position",
       "type": "irobot_create_msgs/action/NavigateToPosition",
       "msg": {
        "achieve_goal_heading": true,
        "goal_pose": {
         "pose": {
          "position": {
           "x": 1,
           "y": 0.5,
           "z": 0
          },
          "orientation": {
           "x": 0,
           "y": 0,
           "z": 0,
           "w": 1
          }
         }
        }
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Wall follow left 15 s",
     "line": "ros2 action send_goal /wall_follow irobot_create_msgs/action/WallFollow \"{follow_side: 1, max_runtime: {sec: 15, nanosec: 0}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/wall_follow",
       "type": "irobot_create_msgs/action/WallFollow",
       "msg": {
        "follow_side": 1,
        "max_runtime": {
         "sec": 15,
         "nanosec": 0
        }
       }
      }
     }
    },
    {
     "group": "Light ring · sound · display",
     "label": "Ring blue",
     "line": "ros2 topic pub --once /cmd_lightring irobot_create_msgs/msg/LightringLeds \"{override_system: true, leds: [{red: 0, green: 80, blue: 255}, {red: 0, green: 80, blue: 255}, {red: 0, green: 80, blue: 255}, {red: 0, green: 80, blue: 255}, {red: 0, green: 80, blue: 255}, {red: 0, green: 80, blue: 255}]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_lightring",
       "type": "irobot_create_msgs/msg/LightringLeds",
       "msg": {
        "override_system": true,
        "leds": [
         {
          "red": 0,
          "green": 80,
          "blue": 255
         },
         {
          "red": 0,
          "green": 80,
          "blue": 255
         },
         {
          "red": 0,
          "green": 80,
          "blue": 255
         },
         {
          "red": 0,
          "green": 80,
          "blue": 255
         },
         {
          "red": 0,
          "green": 80,
          "blue": 255
         },
         {
          "red": 0,
          "green": 80,
          "blue": 255
         }
        ]
       }
      }
     }
    },
    {
     "group": "Light ring · sound · display",
     "label": "Ring rainbow",
     "line": "ros2 topic pub --once /cmd_lightring irobot_create_msgs/msg/LightringLeds \"{override_system: true, leds: [{red: 255, green: 0, blue: 0}, {red: 255, green: 150, blue: 0}, {red: 255, green: 255, blue: 0}, {red: 0, green: 255, blue: 0}, {red: 0, green: 80, blue: 255}, {red: 160, green: 0, blue: 255}]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_lightring",
       "type": "irobot_create_msgs/msg/LightringLeds",
       "msg": {
        "override_system": true,
        "leds": [
         {
          "red": 255,
          "green": 0,
          "blue": 0
         },
         {
          "red": 255,
          "green": 150,
          "blue": 0
         },
         {
          "red": 255,
          "green": 255,
          "blue": 0
         },
         {
          "red": 0,
          "green": 255,
          "blue": 0
         },
         {
          "red": 0,
          "green": 80,
          "blue": 255
         },
         {
          "red": 160,
          "green": 0,
          "blue": 255
         }
        ]
       }
      }
     }
    },
    {
     "group": "Light ring · sound · display",
     "label": "Ring system",
     "line": "ros2 topic pub --once /cmd_lightring irobot_create_msgs/msg/LightringLeds \"{override_system: false, leds: []}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_lightring",
       "type": "irobot_create_msgs/msg/LightringLeds",
       "msg": {
        "override_system": false,
        "leds": []
       }
      }
     }
    },
    {
     "group": "Light ring · sound · display",
     "label": "Beep",
     "line": "ros2 topic pub --once /cmd_audio irobot_create_msgs/msg/AudioNoteVector \"{notes: [{frequency: 880, max_runtime: {sec: 0, nanosec: 200000000}}, {frequency: 660, max_runtime: {sec: 0, nanosec: 300000000}}], append: false}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_audio",
       "type": "irobot_create_msgs/msg/AudioNoteVector",
       "msg": {
        "notes": [
         {
          "frequency": 880,
          "max_runtime": {
           "sec": 0,
           "nanosec": 200000000
          }
         },
         {
          "frequency": 660,
          "max_runtime": {
           "sec": 0,
           "nanosec": 300000000
          }
         }
        ],
        "append": false
       }
      }
     }
    },
    {
     "group": "Light ring · sound · display",
     "label": "Display \"Hello\"",
     "line": "ros2 topic pub --once /hmi/display/message std_msgs/msg/String \"{data: \"Hello from ROS 2\"}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/hmi/display/message",
       "type": "std_msgs/msg/String",
       "msg": {
        "data": "Hello from ROS 2"
       }
      }
     }
    },
    {
     "group": "Services · parameters",
     "label": "E-stop on",
     "line": "ros2 service call /e_stop irobot_create_msgs/srv/EStop \"{e_stop_on: true}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/e_stop",
       "type": "irobot_create_msgs/srv/EStop",
       "msg": {
        "e_stop_on": true
       }
      }
     }
    },
    {
     "group": "Services · parameters",
     "label": "E-stop off",
     "line": "ros2 service call /e_stop irobot_create_msgs/srv/EStop \"{e_stop_on: false}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/e_stop",
       "type": "irobot_create_msgs/srv/EStop",
       "msg": {
        "e_stop_on": false
       }
      }
     }
    },
    {
     "group": "Services · parameters",
     "label": "Reset odom",
     "line": "ros2 service call /reset_pose irobot_create_msgs/srv/ResetPose \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/reset_pose",
       "type": "irobot_create_msgs/srv/ResetPose",
       "msg": {}
      }
     }
    },
    {
     "group": "Services · parameters",
     "label": "Safety full",
     "line": "ros2 param set /motion_control safety_override full",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/motion_control",
       "name": "safety_override",
       "value": "full"
      }
     }
    },
    {
     "group": "Services · parameters",
     "label": "Safety none",
     "line": "ros2 param set /motion_control safety_override none",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/motion_control",
       "name": "safety_override",
       "value": "none"
      }
     }
    }
   ],
   "telemetry": {
    "model": "standard",
    "topics": {
     "/odom": {
      "header": "{…}",
      "child_frame_id": "base_link",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/scan": {
      "header": "{…}",
      "angle_min": -3.142,
      "angle_max": 3.142,
      "angle_increment": 0.017,
      "scan_time": 0.182,
      "range_min": 0.15,
      "range_max": 12,
      "ranges": [
       10.224,
       10.311,
       10.191,
       10.349,
       "…"
      ]
     },
     "/hazard_detection": {
      "detections": []
     },
     "/ir_intensity": {
      "readings": [
       "{…}",
       "{…}",
       "{…}",
       "{…}",
       "…"
      ]
     },
     "/battery_state": {
      "voltage": 16.29,
      "percentage": 0.87,
      "current": -0.4,
      "power_supply_status": 2
     },
     "/dock_status": {
      "dock_visible": true,
      "is_docked": false
     },
     "/wheel_vels": {
      "velocity_left": 0,
      "velocity_right": 0
     }
    },
    "goal": null,
    "estop": false,
    "safety_override": "none",
    "ros": []
   }
  },
  {
   "robot": "go2w",
   "page": "indexGo2W.php",
   "name": "Unitree Go2-W Simulator",
   "title": "Unitree Go2-W",
   "text": "Wheel-legged Go2: rolls like a car, steps like a dog",
   "category": "Real robots, real interfaces",
   "image": "img/go2w.jpg",
   "interfaces": [
    {
     "key": "webrtc",
     "family": "Unitree WebRTC"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FL_wheel",
     "name": "Front left wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR_wheel",
     "name": "Front right wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL_wheel",
     "name": "Rear left wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR_wheel",
     "name": "Rear right wheel",
     "type": "dc",
     "overridable": false,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "webrtc"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Posture",
     "label": "Stand up",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1004})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1004
      }
     }
    },
    {
     "group": "Posture",
     "label": "Balance stand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1002})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1002
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stand down",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1005})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1005
      }
     }
    },
    {
     "group": "Posture",
     "label": "Recovery stand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1006})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1006
      }
     }
    },
    {
     "group": "Posture",
     "label": "Sit",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1009})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1009
      }
     }
    },
    {
     "group": "Posture",
     "label": "Rise from sit",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1010})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1010
      }
     }
    },
    {
     "group": "Posture",
     "label": "Damp",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1001})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1001
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stop",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1003})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1003
      }
     }
    },
    {
     "group": "Drive",
     "label": "Move 0.5 m/s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1008,\"parameter\":{\"x\":0.5,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1008,
       "parameter": {
        "x": 0.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Drive",
     "label": "Move 1.5 m/s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1008,\"parameter\":{\"x\":1.5,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1008,
       "parameter": {
        "x": 1.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Drive",
     "label": "Move ↺ 1 rad/s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1008,\"parameter\":{\"x\":0,\"y\":0,\"z\":1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1008,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 1
       }
      }
     }
    },
    {
     "group": "Drive",
     "label": "Speed slow",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1015,\"parameter\":{\"data\":-1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1015,
       "parameter": {
        "data": -1
       }
      }
     }
    },
    {
     "group": "Drive",
     "label": "Speed normal",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1015,\"parameter\":{\"data\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1015,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Drive",
     "label": "Speed fast",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1015,\"parameter\":{\"data\":1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1015,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Look up",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1007,\"parameter\":{\"x\":0,\"y\":-0.3,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1007,
       "parameter": {
        "x": 0,
        "y": -0.3,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Lean left",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1007,\"parameter\":{\"x\":-0.3,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1007,
       "parameter": {
        "x": -0.3,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Euler 0",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1007,\"parameter\":{\"x\":0,\"y\":0,\"z\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1007,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Pose mode",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1028,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1028,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Actions",
     "label": "Hello",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1016})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1016
      }
     }
    },
    {
     "group": "Actions",
     "label": "Stretch",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1017})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1017
      }
     }
    },
    {
     "group": "Actions",
     "label": "Content",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1020})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1020
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dance 1",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1022})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1022
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dance 2",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1023})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1023
      }
     }
    },
    {
     "group": "Actions",
     "label": "Front jump",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1031})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1031
      }
     }
    },
    {
     "group": "Handstand",
     "label": "Handstand",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2044,\"parameter\":{\"data\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2044,
       "parameter": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Handstand",
     "label": "Handstand off",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":2044,\"parameter\":{\"data\":false}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 2044,
       "parameter": {
        "data": false
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "LED purple",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1007,\"parameter\":{\"color\":\"purple\",\"time\":5}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1007,
       "parameter": {
        "color": "purple",
        "time": 5
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "LED cyan flash",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1007,\"parameter\":{\"color\":\"cyan\",\"time\":5,\"flash_cycle\":1000}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1007,
       "parameter": {
        "color": "cyan",
        "time": 5,
        "flash_cycle": 1000
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Brightness 10",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1005,\"parameter\":{\"brightness\":10}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1005,
       "parameter": {
        "brightness": 10
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Brightness 0",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/vui/request\", {\"api_id\":1005,\"parameter\":{\"brightness\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/vui/request",
       "api_id": 1005,
       "parameter": {
        "brightness": 0
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Avoid on",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/obstacles_avoid/request\", {\"api_id\":1001,\"parameter\":{\"enable\":true}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/obstacles_avoid/request",
       "api_id": 1001,
       "parameter": {
        "enable": true
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Avoid off",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/obstacles_avoid/request\", {\"api_id\":1001,\"parameter\":{\"enable\":false}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/obstacles_avoid/request",
       "api_id": 1001,
       "parameter": {
        "enable": false
       }
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Get state",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":1034,\"parameter\":[\"state\",\"bodyHeight\",\"speedLevel\",\"gait\",\"continuousGait\",\"economicGait\"]})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 1034,
       "parameter": [
        "state",
        "bodyHeight",
        "speedLevel",
        "gait",
        "continuousGait",
        "economicGait"
       ]
      }
     }
    },
    {
     "group": "Lights · obstacles · state",
     "label": "Motion mode?",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/motion_switcher/request\", {\"api_id\":1001})",
     "action": {
      "webrtc": {
       "topic": "rt/api/motion_switcher/request",
       "api_id": 1001
      }
     }
    }
   ],
   "telemetry": {
    "sportmodestate": {
     "mode": 1,
     "gait_type": 0,
     "body_height": 0.39,
     "wheel_speed": [
      0,
      0,
      0,
      0
     ],
     "velocity": [
      0,
      0,
      0
     ],
     "yaw_speed": 0,
     "range_obstacle": [
      2,
      2,
      2,
      2
     ]
    },
    "state": {
     "state": "stand",
     "bodyHeight": 0.39,
     "speedLevel": 0,
     "gait": 1,
     "continuousGait": false,
     "economicGait": false
    },
    "motionMode": "mcf",
    "avoid": false,
    "lifting": [],
    "webrtc": []
   }
  },
  {
   "robot": "r1",
   "page": "indexR1.php",
   "name": "Unitree R1 Simulator",
   "title": "Unitree R1 / R1 Air",
   "text": "Light humanoid with its own state machine: Lock, Run, dances and kung fu",
   "category": "Real robots, real interfaces",
   "image": "img/r1.jpg",
   "interfaces": [
    {
     "key": "webrtc",
     "family": "Unitree WebRTC"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "left_hip_pitch",
     "name": "left hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_roll",
     "name": "left hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_yaw",
     "name": "left hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_knee",
     "name": "left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_ankle_pitch",
     "name": "left ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_ankle_roll",
     "name": "left ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_pitch",
     "name": "right hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_roll",
     "name": "right hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_yaw",
     "name": "right hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_knee",
     "name": "right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_ankle_pitch",
     "name": "right ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_ankle_roll",
     "name": "right ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "waist_yaw",
     "name": "waist yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -150,
      150
     ]
    },
    {
     "id": "waist_pitch",
     "name": "waist pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "head_yaw",
     "name": "head yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "head_pitch",
     "name": "head pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -45,
      45
     ]
    },
    {
     "id": "left_shoulder_pitch",
     "name": "left shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_roll",
     "name": "left shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_yaw",
     "name": "left shoulder yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_elbow",
     "name": "left elbow",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_wrist_roll",
     "name": "left wrist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_pitch",
     "name": "right shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_roll",
     "name": "right shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_yaw",
     "name": "right shoulder yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_elbow",
     "name": "right elbow",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_wrist_roll",
     "name": "right wrist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "webrtc",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "States in the app (7101)",
     "label": "Damping 1",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":1}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "States in the app (7101)",
     "label": "Lock 4",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":4}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 4
       }
      }
     }
    },
    {
     "group": "States in the app (7101)",
     "label": "ZeroTorque 0",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":0}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "States in the app (7101)",
     "label": "Run 811",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":811}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 811
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "SitDown 7",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":7}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 7
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "LieDown 702",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":702}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 702
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "StandUp 701",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":701}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 701
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "Dance1 601",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":601}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 601
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "Dance2 602",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":602}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 602
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "Dance3 603",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":603}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 603
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "Twist 604",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":604}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 604
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "KungFu 607",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":607}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 607
       }
      }
     }
    },
    {
     "group": "Motions, from Lock (7101)",
     "label": "JeetKuneDo 608",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":608}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 608
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "Keep 5",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":5}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 5
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "MoveTo 6",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":6}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 6
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "Motion 800",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":800}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 800
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "AmpMotion 812",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":812}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 812
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "WalkStraightKnee 813",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":813}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 813
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "Walk 814",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":814}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 814
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "AmpLocomotion 815",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":815}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 815
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "ArmSdkLoco 816",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":816}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 816
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "Loco20Dof 830",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":830}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 830
       }
      }
     }
    },
    {
     "group": "Other states (7101)",
     "label": "LocoArmSdk 831",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7101,\"parameter\":{\"data\":831}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7101,
       "parameter": {
        "data": 831
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Forward 0.5 m/s, 2 s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7105,\"parameter\":{\"velocity\":[0.5,0,0],\"duration\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0.5,
         0,
         0
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Sideways 0.3 m/s, 2 s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7105,\"parameter\":{\"velocity\":[0,0.3,0],\"duration\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0.3,
         0
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Turn 0.8 rad/s, 2 s",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7105,\"parameter\":{\"velocity\":[0,0,0.8],\"duration\":2}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0,
         0.8
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Joystick: forward",
     "line": "conn.datachannel.pub_sub.publish_without_callback(\"rt/wirelesscontroller\", {\"lx\":0,\"ly\":0.6,\"rx\":0,\"ry\":0,\"keys\":0})",
     "action": {
      "webrtc": {
       "topic": "rt/wirelesscontroller",
       "data": {
        "lx": 0,
        "ly": 0.6,
        "rx": 0,
        "ry": 0,
        "keys": 0
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Joystick: turn right",
     "line": "conn.datachannel.pub_sub.publish_without_callback(\"rt/wirelesscontroller\", {\"lx\":0,\"ly\":0,\"rx\":0.6,\"ry\":0,\"keys\":0})",
     "action": {
      "webrtc": {
       "topic": "rt/wirelesscontroller",
       "data": {
        "lx": 0,
        "ly": 0,
        "rx": 0.6,
        "ry": 0,
        "keys": 0
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Joystick: stop",
     "line": "conn.datachannel.pub_sub.publish_without_callback(\"rt/wirelesscontroller\", {\"lx\":0,\"ly\":0,\"rx\":0,\"ry\":0,\"keys\":0})",
     "action": {
      "webrtc": {
       "topic": "rt/wirelesscontroller",
       "data": {
        "lx": 0,
        "ly": 0,
        "rx": 0,
        "ry": 0,
        "keys": 0
       }
      }
     }
    },
    {
     "group": "Velocity (7105) · joystick",
     "label": "Get FSM id",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/sport/request\", {\"api_id\":7001})",
     "action": {
      "webrtc": {
       "topic": "rt/api/sport/request",
       "api_id": 7001
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Left kiss 12",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":12}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 12
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Hands up 15",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":15}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 15
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Clap 17",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":17}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 17
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "High five 18",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":18}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 18
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Hug 19",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":19}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 19
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Reject 22",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":22}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 22
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Right hand up 23",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":23}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 23
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "X-ray 24",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":24}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 24
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Face wave 25",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":25}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 25
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "High wave 26",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":26}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 26
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Handshake 27",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":27}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 27
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Forward push 36",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":36}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 36
       }
      }
     }
    },
    {
     "group": "Arm gestures (7106)",
     "label": "Release 99",
     "line": "await conn.datachannel.pub_sub.publish_request_new(\"rt/api/arm/request\", {\"api_id\":7106,\"parameter\":{\"data\":99}})",
     "action": {
      "webrtc": {
       "topic": "rt/api/arm/request",
       "api_id": 7106,
       "parameter": {
        "data": 99
       }
      }
     }
    }
   ],
   "telemetry": {
    "model": "R1",
    "fsm_id": 4,
    "fsm_name": "Lock",
    "fsm_reported": 4,
    "reporting": true,
    "posture": "stand",
    "arm_action": null,
    "velocity": [
     0,
     0,
     0
    ],
    "webrtc": []
   }
  },
  {
   "robot": "rosbotxl",
   "page": "indexROSbotXL.php",
   "name": "ROSbot XL Simulator",
   "title": "Husarion ROSbot XL",
   "text": "The ROS 2 platform with mecanum or rubber wheels, LiDAR and camera",
   "category": "Real robots, real interfaces",
   "image": "img/rosbotxl.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Front left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Front right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Rear left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Rear right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Sideways left 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0.3, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0.3,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Diagonal",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.25, y: 0.25, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.25,
         "y": 0.25,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Turn left 1 rad/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 1
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "LEDs · EKF · controllers",
     "label": "LED1 on",
     "line": "ros2 topic pub --once /leds std_msgs/msg/UInt8 \"{data: 1}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/leds",
       "type": "std_msgs/msg/UInt8",
       "msg": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "LEDs · EKF · controllers",
     "label": "LED1 + LED2",
     "line": "ros2 topic pub --once /leds std_msgs/msg/UInt8 \"{data: 3}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/leds",
       "type": "std_msgs/msg/UInt8",
       "msg": {
        "data": 3
       }
      }
     }
    },
    {
     "group": "LEDs · EKF · controllers",
     "label": "LEDs off",
     "line": "ros2 topic pub --once /leds std_msgs/msg/UInt8 \"{data: 0}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/leds",
       "type": "std_msgs/msg/UInt8",
       "msg": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "LEDs · EKF · controllers",
     "label": "EKF pose → 0",
     "line": "ros2 topic pub --once /set_pose geometry_msgs/msg/PoseWithCovarianceStamped \"{header: {frame_id: \"odom\"}, pose: {pose: {position: {x: 0, y: 0, z: 0}, orientation: {x: 0, y: 0, z: 0, w: 1}}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/set_pose",
       "type": "geometry_msgs/msg/PoseWithCovarianceStamped",
       "msg": {
        "header": {
         "frame_id": "odom"
        },
        "pose": {
         "pose": {
          "position": {
           "x": 0,
           "y": 0,
           "z": 0
          },
          "orientation": {
           "x": 0,
           "y": 0,
           "z": 0,
           "w": 1
          }
         }
        }
       }
      }
     }
    },
    {
     "group": "LEDs · EKF · controllers",
     "label": "List controllers",
     "line": "ros2 service call /controller_manager/list_controllers controller_manager_msgs/srv/ListControllers \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/controller_manager/list_controllers",
       "type": "controller_manager_msgs/srv/ListControllers",
       "msg": {}
      }
     }
    }
   ],
   "telemetry": {
    "variant": "mecanum",
    "topics": {
     "/odometry/filtered": {
      "header": "{…}",
      "child_frame_id": "base_link",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/rosbot_xl_base_controller/odom": {
      "header": "{…}",
      "child_frame_id": "base_link",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/scan": {
      "header": "{…}",
      "angle_min": -3.142,
      "angle_max": 3.142,
      "angle_increment": 0.017,
      "scan_time": 0.1,
      "range_min": 0.05,
      "range_max": 40,
      "ranges": [
       null,
       null,
       null,
       10.412,
       "…"
      ]
     },
     "/joint_states": {
      "header": "{…}",
      "name": [
       "fl_wheel_joint",
       "fr_wheel_joint",
       "rl_wheel_joint",
       "rr_wheel_joint"
      ],
      "position": [
       0,
       0,
       0,
       0
      ],
      "velocity": [
       0,
       0,
       0,
       0
      ],
      "effort": []
     },
     "/battery_state": {
      "header": "{…}",
      "voltage": 11.95,
      "current": -0.6,
      "percentage": 0.82,
      "power_supply_status": 2,
      "present": true
     }
    },
    "leds": 0,
    "ros": []
   }
  },
  {
   "robot": "leorover",
   "page": "indexLeoRover.php",
   "name": "Leo Rover Simulator",
   "title": "Leo Rover",
   "text": "Outdoor ROS 2 rover with rocker suspension and four hub motors",
   "category": "Real robots, real interfaces",
   "image": "img/leorover.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Wheel FL",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Wheel RL",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Wheel FR",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Wheel RR",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Turn left 0.8 rad/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.8}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0.8
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Straight, heading held",
     "line": "ros2 topic pub --once /heading_controller/cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/heading_controller/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Wheels · /firmware",
     "label": "FL 5 rad/s",
     "line": "ros2 topic pub --once /firmware/wheel_FL/cmd_velocity std_msgs/msg/Float32 \"{data: 5}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/firmware/wheel_FL/cmd_velocity",
       "type": "std_msgs/msg/Float32",
       "msg": {
        "data": 5
       }
      }
     }
    },
    {
     "group": "Wheels · /firmware",
     "label": "Right side back",
     "line": "ros2 topic pub --once /firmware/wheel_FR/cmd_velocity std_msgs/msg/Float32 \"{data: -4}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/firmware/wheel_FR/cmd_velocity",
       "type": "std_msgs/msg/Float32",
       "msg": {
        "data": -4
       }
      }
     }
    },
    {
     "group": "Wheels · /firmware",
     "label": "RR PWM 40 %",
     "line": "ros2 topic pub --once /firmware/wheel_RR/cmd_pwm_duty std_msgs/msg/Float32 \"{data: 40}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/firmware/wheel_RR/cmd_pwm_duty",
       "type": "std_msgs/msg/Float32",
       "msg": {
        "data": 40
       }
      }
     }
    },
    {
     "group": "Services",
     "label": "Reset odometry",
     "line": "ros2 service call /reset_odometry std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/reset_odometry",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "Services",
     "label": "Board type",
     "line": "ros2 service call /firmware/get_board_type std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/firmware/get_board_type",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "Services",
     "label": "Firmware version",
     "line": "ros2 service call /firmware/get_firmware_version std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/firmware/get_firmware_version",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "Services",
     "label": "Reset IMU calibration",
     "line": "ros2 service call /imu_filter/reset_calibration std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/imu_filter/reset_calibration",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "Services",
     "label": "Reboot",
     "line": "ros2 service call /system/reboot std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/system/reboot",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "Parameters",
     "label": "Slow acceleration",
     "line": "ros2 param set /firmware_parameter_bridge controller.linear_acceleration 0.2",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/firmware_parameter_bridge",
       "name": "controller.linear_acceleration",
       "value": "0.2"
      }
     }
    },
    {
     "group": "Parameters",
     "label": "Normal acceleration",
     "line": "ros2 param set /firmware_parameter_bridge controller.linear_acceleration 0.5",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/firmware_parameter_bridge",
       "name": "controller.linear_acceleration",
       "value": "0.5"
      }
     }
    },
    {
     "group": "Parameters",
     "label": "Timeout 2 s",
     "line": "ros2 param set /firmware_parameter_bridge controller.input_timeout 2000",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/firmware_parameter_bridge",
       "name": "controller.input_timeout",
       "value": "2000"
      }
     }
    }
   ],
   "telemetry": {
    "topics": {
     "/wheel_odom": {
      "header": "{…}",
      "child_frame_id": "base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/merged_odom": {
      "header": "{…}",
      "child_frame_id": "base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/imu/rpy": {
      "header": "{…}",
      "vector": "{…}"
     },
     "/firmware/battery": {
      "data": 11.901
     },
     "/joint_states": {
      "header": "{…}",
      "name": [
       "wheel_FL_joint",
       "wheel_RL_joint",
       "wheel_FR_joint",
       "wheel_RR_joint"
      ],
      "position": [
       0,
       0,
       0,
       0
      ],
      "velocity": [
       0,
       0,
       0,
       0
      ],
      "effort": [
       0,
       0,
       0,
       0
      ]
     }
    },
    "lidar": false,
    "ros": []
   }
  },
  {
   "robot": "bittle",
   "page": "indexBittle.php",
   "name": "Petoi Bittle X Simulator",
   "title": "Petoi Bittle X",
   "text": "Palm-sized robot dog with its real OpenCat skills, driven by serial tokens",
   "category": "Real robots, real interfaces",
   "image": "img/bittle.jpg",
   "interfaces": [
    {
     "key": "serial",
     "family": "Serial protocol"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "j0",
     "name": "0 head pan",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j8",
     "name": "8 left front shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j9",
     "name": "9 right front shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j10",
     "name": "10 right back shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j11",
     "name": "11 left back shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j12",
     "name": "12 left front knee",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j13",
     "name": "13 right front knee",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j14",
     "name": "14 right back knee",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "j15",
     "name": "15 left back knee",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "serial"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Walk",
     "line": "> kwkF",
     "action": {
      "serial": "kwkF"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Walk left",
     "line": "> kwkL",
     "action": {
      "serial": "kwkL"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Walk right",
     "line": "> kwkR",
     "action": {
      "serial": "kwkR"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Trot",
     "line": "> ktrF",
     "action": {
      "serial": "ktrF"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Crawl",
     "line": "> kcrF",
     "action": {
      "serial": "kcrF"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Bound",
     "line": "> kbdF",
     "action": {
      "serial": "kbdF"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Step on the spot",
     "line": "> kvtF",
     "action": {
      "serial": "kvtF"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Back",
     "line": "> kbk",
     "action": {
      "serial": "kbk"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Back left",
     "line": "> kbkL",
     "action": {
      "serial": "kbkL"
     }
    },
    {
     "group": "Gaits (keep going until the next token)",
     "label": "Jump forward",
     "line": "> kjpF",
     "action": {
      "serial": "kjpF"
     }
    },
    {
     "group": "Postures",
     "label": "Balance",
     "line": "> kbalance",
     "action": {
      "serial": "kbalance"
     }
    },
    {
     "group": "Postures",
     "label": "Sit",
     "line": "> ksit",
     "action": {
      "serial": "ksit"
     }
    },
    {
     "group": "Postures",
     "label": "Rest",
     "line": "> d",
     "action": {
      "serial": "d"
     }
    },
    {
     "group": "Postures",
     "label": "Stretch",
     "line": "> kstr",
     "action": {
      "serial": "kstr"
     }
    },
    {
     "group": "Postures",
     "label": "Butt up",
     "line": "> kbuttUp",
     "action": {
      "serial": "kbuttUp"
     }
    },
    {
     "group": "Postures",
     "label": "Calibration",
     "line": "> kcalib",
     "action": {
      "serial": "kcalib"
     }
    },
    {
     "group": "Postures",
     "label": "Pause",
     "line": "> p",
     "action": {
      "serial": "p"
     }
    },
    {
     "group": "Skills",
     "label": "Hi",
     "line": "> khi",
     "action": {
      "serial": "khi"
     }
    },
    {
     "group": "Skills",
     "label": "Handshake",
     "line": "> khsk",
     "action": {
      "serial": "khsk"
     }
    },
    {
     "group": "Skills",
     "label": "High five",
     "line": "> kfiv",
     "action": {
      "serial": "kfiv"
     }
    },
    {
     "group": "Skills",
     "label": "Pee",
     "line": "> kpee",
     "action": {
      "serial": "kpee"
     }
    },
    {
     "group": "Skills",
     "label": "Push-ups",
     "line": "> kpu",
     "action": {
      "serial": "kpu"
     }
    },
    {
     "group": "Skills",
     "label": "One-arm push-up",
     "line": "> kpu1",
     "action": {
      "serial": "kpu1"
     }
    },
    {
     "group": "Skills",
     "label": "Check around",
     "line": "> kck",
     "action": {
      "serial": "kck"
     }
    },
    {
     "group": "Skills",
     "label": "Sniff",
     "line": "> ksnf",
     "action": {
      "serial": "ksnf"
     }
    },
    {
     "group": "Skills",
     "label": "Scratch",
     "line": "> kscrh",
     "action": {
      "serial": "kscrh"
     }
    },
    {
     "group": "Skills",
     "label": "Cheers",
     "line": "> kchr",
     "action": {
      "serial": "kchr"
     }
    },
    {
     "group": "Skills",
     "label": "Nod",
     "line": "> knd",
     "action": {
      "serial": "knd"
     }
    },
    {
     "group": "Skills",
     "label": "Wave head",
     "line": "> kwh",
     "action": {
      "serial": "kwh"
     }
    },
    {
     "group": "Skills",
     "label": "Hands up",
     "line": "> khu",
     "action": {
      "serial": "khu"
     }
    },
    {
     "group": "Skills",
     "label": "Hug",
     "line": "> khg",
     "action": {
      "serial": "khg"
     }
    },
    {
     "group": "Skills",
     "label": "Good boy",
     "line": "> kgdb",
     "action": {
      "serial": "kgdb"
     }
    },
    {
     "group": "Skills",
     "label": "Angry",
     "line": "> kang",
     "action": {
      "serial": "kang"
     }
    },
    {
     "group": "Skills",
     "label": "Dig",
     "line": "> kdg",
     "action": {
      "serial": "kdg"
     }
    },
    {
     "group": "Skills",
     "label": "Kick",
     "line": "> kkc",
     "action": {
      "serial": "kkc"
     }
    },
    {
     "group": "Skills",
     "label": "Boxing",
     "line": "> kbx",
     "action": {
      "serial": "kbx"
     }
    },
    {
     "group": "Skills",
     "label": "Moonwalk",
     "line": "> kmw",
     "action": {
      "serial": "kmw"
     }
    },
    {
     "group": "Skills",
     "label": "Jump",
     "line": "> kjmp",
     "action": {
      "serial": "kjmp"
     }
    },
    {
     "group": "Skills",
     "label": "Play dead",
     "line": "> kpd",
     "action": {
      "serial": "kpd"
     }
    },
    {
     "group": "Skills",
     "label": "Roll",
     "line": "> krl",
     "action": {
      "serial": "krl"
     }
    },
    {
     "group": "Skills",
     "label": "Recover",
     "line": "> krc",
     "action": {
      "serial": "krc"
     }
    },
    {
     "group": "Skills",
     "label": "Handstand",
     "line": "> khds",
     "action": {
      "serial": "khds"
     }
    },
    {
     "group": "Skills",
     "label": "Backflip",
     "line": "> kbf",
     "action": {
      "serial": "kbf"
     }
    },
    {
     "group": "Skills",
     "label": "Table",
     "line": "> ktbl",
     "action": {
      "serial": "ktbl"
     }
    },
    {
     "group": "Skills",
     "label": "Come here",
     "line": "> kcmh",
     "action": {
      "serial": "kcmh"
     }
    },
    {
     "group": "Skills",
     "label": "Test",
     "line": "> kts",
     "action": {
      "serial": "kts"
     }
    },
    {
     "group": "Skills",
     "label": "Fist bump",
     "line": "> kff",
     "action": {
      "serial": "kff"
     }
    },
    {
     "group": "Skills",
     "label": "Sleep",
     "line": "> kzz",
     "action": {
      "serial": "kzz"
     }
    },
    {
     "group": "Joints",
     "label": "Head left",
     "line": "> m0 45",
     "action": {
      "serial": "m0 45"
     }
    },
    {
     "group": "Joints",
     "label": "Head right",
     "line": "> m0 -45",
     "action": {
      "serial": "m0 -45"
     }
    },
    {
     "group": "Joints",
     "label": "Head centre",
     "line": "> m0 0",
     "action": {
      "serial": "m0 0"
     }
    },
    {
     "group": "Joints",
     "label": "Front paws up",
     "line": "> i 8 -70 9 -70",
     "action": {
      "serial": "i 8 -70 9 -70"
     }
    },
    {
     "group": "Joints",
     "label": "Read angles",
     "line": "> j",
     "action": {
      "serial": "j"
     }
    },
    {
     "group": "Joints",
     "label": "Beep",
     "line": "> b 12 8 14 8 16 8 17 4",
     "action": {
      "serial": "b 12 8 14 8 16 8 17 4"
     }
    }
   ],
   "telemetry": {
    "skill": "balance",
    "gait": null,
    "paused": false,
    "gyro": true,
    "joints": {
     "0": 0,
     "8": 30,
     "9": 30,
     "10": 30,
     "11": 30,
     "12": 30,
     "13": 30,
     "14": 30,
     "15": 30
    },
    "bodyHeight": 0.1,
    "blocked": "",
    "serial": []
   }
  },
  {
   "robot": "roboworks",
   "page": "indexRoboworks.php",
   "name": "Roboworks Simulator",
   "title": "Roboworks Rosbot 2 / Mecabot 2",
   "text": "ROS 2 education kits: car steering or mecanum wheels, LSLiDAR and Astra camera",
   "category": "Real robots, real interfaces",
   "image": "img/roboworks.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Rear left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Rear right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "steer",
     "name": "Steering servo (S20F)",
     "type": "servo",
     "overridable": true,
     "range": [
      -22.6,
      22.6
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Curve left 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.35}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0.35
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Curve right 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.35}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": -0.35
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Backward 0.2 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: -0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": -0.2,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Read · parameters",
     "label": "Battery voltage",
     "line": "ros2 topic echo --once /PowerVoltage",
     "action": {
      "ros": {
       "kind": "get",
       "name": "/PowerVoltage"
      }
     }
    },
    {
     "group": "Read · parameters",
     "label": "Odometry",
     "line": "ros2 topic echo --once /odom",
     "action": {
      "ros": {
       "kind": "get",
       "name": "/odom"
      }
     }
    },
    {
     "group": "Read · parameters",
     "label": "Odom frame → odom",
     "line": "ros2 param set /wheeltec_robot odom_frame_id odom",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/wheeltec_robot",
       "name": "odom_frame_id",
       "value": "odom"
      }
     }
    }
   ],
   "telemetry": {
    "model": "rosbot2",
    "topics": {
     "/odom": {
      "header": "{…}",
      "child_frame_id": "base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/scan": {
      "header": "{…}",
      "angle_min": -3.142,
      "angle_max": 3.142,
      "angle_increment": 0.017,
      "scan_time": 0.083,
      "range_min": 0.05,
      "range_max": 30,
      "ranges": [
       10.417,
       10.404,
       10.415,
       10.421,
       "…"
      ]
     },
     "/PowerVoltage": {
      "data": 24.73
     }
    },
    "steerDeg": 0,
    "ros": []
   }
  },
  {
   "robot": "mecabot",
   "page": "indexRoboworks.php?variant=mecabot",
   "name": "Roboworks Simulator",
   "title": "Roboworks Rosbot 2 / Mecabot 2",
   "text": "ROS 2 education kits: car steering or mecanum wheels, LSLiDAR and Astra camera",
   "category": "Real robots, real interfaces",
   "image": "img/mecabot.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Front left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Front right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Rear left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Rear right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Sideways left 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0.3, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0.3,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Diagonal",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.25, y: 0.25, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.25,
         "y": 0.25,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Turn left 1 rad/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 1
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Read · parameters",
     "label": "Battery voltage",
     "line": "ros2 topic echo --once /PowerVoltage",
     "action": {
      "ros": {
       "kind": "get",
       "name": "/PowerVoltage"
      }
     }
    },
    {
     "group": "Read · parameters",
     "label": "Odometry",
     "line": "ros2 topic echo --once /odom",
     "action": {
      "ros": {
       "kind": "get",
       "name": "/odom"
      }
     }
    },
    {
     "group": "Read · parameters",
     "label": "Odom frame → odom",
     "line": "ros2 param set /wheeltec_robot odom_frame_id odom",
     "action": {
      "ros": {
       "kind": "param",
       "node": "/wheeltec_robot",
       "name": "odom_frame_id",
       "value": "odom"
      }
     }
    }
   ],
   "telemetry": {
    "model": "mecabot2",
    "topics": {
     "/odom": {
      "header": "{…}",
      "child_frame_id": "base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/scan": {
      "header": "{…}",
      "angle_min": -3.142,
      "angle_max": 3.142,
      "angle_increment": 0.017,
      "scan_time": 0.083,
      "range_min": 0.05,
      "range_max": 30,
      "ranges": [
       10.42,
       10.416,
       10.415,
       10.42,
       "…"
      ]
     },
     "/PowerVoltage": {
      "data": 24.73
     }
    },
    "ros": []
   }
  },
  {
   "robot": "ugvrover",
   "page": "indexUGVRover.php",
   "name": "UGV Rover Simulator",
   "title": "Waveshare UGV Rover",
   "text": "Six-wheel ROS 2 rover with LiDAR and a pan-tilt camera, also driven by ESP32 JSON",
   "category": "Real robots, real interfaces",
   "image": "img/ugvrover.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    },
    {
     "key": "serial",
     "family": "Serial protocol"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "L",
     "name": "Left side (2 motors)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "R",
     "name": "Right side (2 motors)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros",
    "serial"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.3,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Turn left 1 rad/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 1
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs",
     "label": "Look left 45°",
     "line": "ros2 topic pub --once /ugv/joint_states sensor_msgs/msg/JointState \"{name: [\"pt_base_link_to_pt_link1\", \"pt_link1_to_pt_link2\"], position: [0.785, 0]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/ugv/joint_states",
       "type": "sensor_msgs/msg/JointState",
       "msg": {
        "name": [
         "pt_base_link_to_pt_link1",
         "pt_link1_to_pt_link2"
        ],
        "position": [
         0.785,
         0
        ]
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs",
     "label": "Look down 20°",
     "line": "ros2 topic pub --once /ugv/joint_states sensor_msgs/msg/JointState \"{name: [\"pt_base_link_to_pt_link1\", \"pt_link1_to_pt_link2\"], position: [0, -0.35]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/ugv/joint_states",
       "type": "sensor_msgs/msg/JointState",
       "msg": {
        "name": [
         "pt_base_link_to_pt_link1",
         "pt_link1_to_pt_link2"
        ],
        "position": [
         0,
         -0.35
        ]
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs",
     "label": "Look ahead",
     "line": "ros2 topic pub --once /ugv/joint_states sensor_msgs/msg/JointState \"{name: [\"pt_base_link_to_pt_link1\", \"pt_link1_to_pt_link2\"], position: [0, 0]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/ugv/joint_states",
       "type": "sensor_msgs/msg/JointState",
       "msg": {
        "name": [
         "pt_base_link_to_pt_link1",
         "pt_link1_to_pt_link2"
        ],
        "position": [
         0,
         0
        ]
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs",
     "label": "LEDs on",
     "line": "ros2 topic pub --once /ugv/led_ctrl std_msgs/msg/Float32MultiArray \"{data: [255, 255]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/ugv/led_ctrl",
       "type": "std_msgs/msg/Float32MultiArray",
       "msg": {
        "data": [
         255,
         255
        ]
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs",
     "label": "LEDs off",
     "line": "ros2 topic pub --once /ugv/led_ctrl std_msgs/msg/Float32MultiArray \"{data: [0, 0]}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/ugv/led_ctrl",
       "type": "std_msgs/msg/Float32MultiArray",
       "msg": {
        "data": [
         0,
         0
        ]
       }
      }
     }
    },
    {
     "group": "Motion",
     "label": "Wheels 0.2 m/s",
     "line": "{\"T\":1,\"L\":0.2,\"R\":0.2}",
     "action": {
      "serial": {
       "json": {
        "T": 1,
        "L": 0.2,
        "R": 0.2
       }
      }
     }
    },
    {
     "group": "Motion",
     "label": "Spin left",
     "line": "{\"T\":1,\"L\":-0.2,\"R\":0.2}",
     "action": {
      "serial": {
       "json": {
        "T": 1,
        "L": -0.2,
        "R": 0.2
       }
      }
     }
    },
    {
     "group": "Motion",
     "label": "Drive X 0.3, Z 0.5",
     "line": "{\"T\":13,\"X\":0.3,\"Z\":0.5}",
     "action": {
      "serial": {
       "json": {
        "T": 13,
        "X": 0.3,
        "Z": 0.5
       }
      }
     }
    },
    {
     "group": "Motion",
     "label": "PWM 100 / 100",
     "line": "{\"T\":11,\"L\":100,\"R\":100}",
     "action": {
      "serial": {
       "json": {
        "T": 11,
        "L": 100,
        "R": 100
       }
      }
     }
    },
    {
     "group": "Motion",
     "label": "Stop",
     "line": "{\"T\":1,\"L\":0,\"R\":0}",
     "action": {
      "serial": {
       "json": {
        "T": 1,
        "L": 0,
        "R": 0
       }
      }
     }
    },
    {
     "group": "Motion",
     "label": "Heartbeat 1 s",
     "line": "{\"T\":136,\"cmd\":1000}",
     "action": {
      "serial": {
       "json": {
        "T": 136,
        "cmd": 1000
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "Gimbal X 90, Y 20",
     "line": "{\"T\":133,\"X\":90,\"Y\":20,\"SPD\":0,\"ACC\":0}",
     "action": {
      "serial": {
       "json": {
        "T": 133,
        "X": 90,
        "Y": 20,
        "SPD": 0,
        "ACC": 0
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "Gimbal slow to X -60",
     "line": "{\"T\":134,\"X\":-60,\"Y\":0,\"SX\":300,\"SY\":300}",
     "action": {
      "serial": {
       "json": {
        "T": 134,
        "X": -60,
        "Y": 0,
        "SX": 300,
        "SY": 300
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "Gimbal centre",
     "line": "{\"T\":133,\"X\":0,\"Y\":0,\"SPD\":0,\"ACC\":0}",
     "action": {
      "serial": {
       "json": {
        "T": 133,
        "X": 0,
        "Y": 0,
        "SPD": 0,
        "ACC": 0
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "Gimbal stop",
     "line": "{\"T\":135}",
     "action": {
      "serial": {
       "json": {
        "T": 135
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "LEDs 255",
     "line": "{\"T\":132,\"IO4\":255,\"IO5\":255}",
     "action": {
      "serial": {
       "json": {
        "T": 132,
        "IO4": 255,
        "IO5": 255
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "LEDs off",
     "line": "{\"T\":132,\"IO4\":0,\"IO5\":0}",
     "action": {
      "serial": {
       "json": {
        "T": 132,
        "IO4": 0,
        "IO5": 0
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "OLED \"Hello\"",
     "line": "{\"T\":3,\"lineNum\":0,\"Text\":\"Hello from JSON\"}",
     "action": {
      "serial": {
       "json": {
        "T": 3,
        "lineNum": 0,
        "Text": "Hello from JSON"
       }
      }
     }
    },
    {
     "group": "Pan-tilt · LEDs · OLED",
     "label": "OLED default",
     "line": "{\"T\":-3}",
     "action": {
      "serial": {
       "json": {
        "T": -3
       }
      }
     }
    },
    {
     "group": "Feedback",
     "label": "Base feedback",
     "line": "{\"T\":130}",
     "action": {
      "serial": {
       "json": {
        "T": 130
       }
      }
     }
    },
    {
     "group": "Feedback",
     "label": "IMU",
     "line": "{\"T\":126}",
     "action": {
      "serial": {
       "json": {
        "T": 126
       }
      }
     }
    },
    {
     "group": "Feedback",
     "label": "Feedback flow on",
     "line": "{\"T\":131,\"cmd\":1}",
     "action": {
      "serial": {
       "json": {
        "T": 131,
        "cmd": 1
       }
      }
     }
    },
    {
     "group": "Feedback",
     "label": "Feedback flow off",
     "line": "{\"T\":131,\"cmd\":0}",
     "action": {
      "serial": {
       "json": {
        "T": 131,
        "cmd": 0
       }
      }
     }
    },
    {
     "group": "Feedback",
     "label": "Reboot ESP32",
     "line": "{\"T\":600}",
     "action": {
      "serial": {
       "json": {
        "T": 600
       }
      }
     }
    }
   ],
   "telemetry": {
    "topics": {
     "/odom": {
      "header": "{…}",
      "child_frame_id": "base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/odom/odom_raw": {
      "data": [
       0,
       0
      ]
     },
     "/voltage": {
      "data": 12.1
     },
     "/scan": {
      "header": "{…}",
      "angle_min": -3.142,
      "angle_max": 3.142,
      "angle_increment": 0.017,
      "scan_time": 0.1,
      "range_min": 0.15,
      "range_max": 12,
      "ranges": [
       10.207,
       10.329,
       10.187,
       10.226,
       "…"
      ]
     }
    },
    "feedback": {
     "T": 1001,
     "L": 0,
     "R": 0,
     "ax": 0,
     "ay": 0,
     "az": 8200,
     "gx": 0,
     "gy": 0,
     "gz": 0,
     "mx": 300,
     "my": 0,
     "mz": -400
    },
    "gimbal": {
     "pan": 0,
     "tilt": 0
    },
    "leds": [
     0,
     0
    ],
    "mode": null,
    "ros": [],
    "serial": []
   }
  },
  {
   "robot": "jetbot",
   "page": "indexJetBot.php",
   "name": "JetBot Simulator",
   "title": "JetBot",
   "text": "NVIDIA's Jetson Nano robot kit, driven with the jetbot Python library",
   "category": "Real robots, real interfaces",
   "image": "img/jetbot.jpg",
   "interfaces": [
    {
     "key": "python",
     "family": "Python library"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "left",
     "name": "Left motor",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "right",
     "name": "Right motor",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "python"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Robot()",
     "label": "robot = Robot()",
     "line": "from jetbot import Robot\nrobot = Robot()",
     "action": {
      "python": {
       "code": "from jetbot import Robot\nrobot = Robot()"
      }
     }
    },
    {
     "group": "Robot()",
     "label": "forward(0.3)",
     "line": "robot.forward(0.3)",
     "action": {
      "python": {
       "code": "robot.forward(0.3)"
      }
     }
    },
    {
     "group": "Robot()",
     "label": "backward(0.3)",
     "line": "robot.backward(0.3)",
     "action": {
      "python": {
       "code": "robot.backward(0.3)"
      }
     }
    },
    {
     "group": "Robot()",
     "label": "left(0.3)",
     "line": "robot.left(0.3)",
     "action": {
      "python": {
       "code": "robot.left(0.3)"
      }
     }
    },
    {
     "group": "Robot()",
     "label": "right(0.3)",
     "line": "robot.right(0.3)",
     "action": {
      "python": {
       "code": "robot.right(0.3)"
      }
     }
    },
    {
     "group": "Robot()",
     "label": "stop()",
     "line": "robot.stop()",
     "action": {
      "python": {
       "code": "robot.stop()"
      }
     }
    },
    {
     "group": "Robot()",
     "label": "set_motors(0.3, 0.5)",
     "line": "robot.set_motors(0.3, 0.5)",
     "action": {
      "python": {
       "code": "robot.set_motors(0.3, 0.5)"
      }
     }
    },
    {
     "group": "Motors · camera · script",
     "label": "left_motor.value = 0.4",
     "line": "robot.left_motor.value = 0.4",
     "action": {
      "python": {
       "code": "robot.left_motor.value = 0.4"
      }
     }
    },
    {
     "group": "Motors · camera · script",
     "label": "right_motor.alpha = 0.9",
     "line": "robot.right_motor.alpha = 0.9",
     "action": {
      "python": {
       "code": "robot.right_motor.alpha = 0.9"
      }
     }
    },
    {
     "group": "Motors · camera · script",
     "label": "print values",
     "line": "print(robot.left_motor.value)\nprint(robot.right_motor.value)",
     "action": {
      "python": {
       "code": "print(robot.left_motor.value)\nprint(robot.right_motor.value)"
      }
     }
    },
    {
     "group": "Motors · camera · script",
     "label": "camera.value",
     "line": "from jetbot import Camera\ncamera = Camera.instance(width=224, height=224)\ncamera.value",
     "action": {
      "python": {
       "code": "from jetbot import Camera\ncamera = Camera.instance(width=224, height=224)\ncamera.value"
      }
     }
    },
    {
     "group": "Motors · camera · script",
     "label": "Square (script)",
     "line": "import time\nrobot.forward(0.3)\ntime.sleep(1)\nrobot.left(0.3)\ntime.sleep(0.62)\nrobot.forward(0.3)\ntime.sleep(1)\nrobot.left(0.3)\ntime.sleep(0.62)\nrobot.stop()",
     "action": {
      "python": {
       "code": "import time\nrobot.forward(0.3)\ntime.sleep(1)\nrobot.left(0.3)\ntime.sleep(0.62)\nrobot.forward(0.3)\ntime.sleep(1)\nrobot.left(0.3)\ntime.sleep(0.62)\nrobot.stop()"
      }
     }
    }
   ],
   "telemetry": {
    "motors": {
     "left": {
      "value": 0,
      "alpha": 1,
      "beta": 0
     },
     "right": {
      "value": 0,
      "alpha": 1,
      "beta": 0
     }
    },
    "script": false,
    "python": []
   }
  },
  {
   "robot": "jetracer",
   "page": "indexJetRacer.php",
   "name": "JetRacer Simulator",
   "title": "JetRacer",
   "text": "Jetson Nano RC car: NvidiaRacecar steering and throttle in Python",
   "category": "Real robots, real interfaces",
   "image": "img/jetracer.jpg",
   "interfaces": [
    {
     "key": "python",
     "family": "Python library"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "throttle",
     "name": "Drive motor (rear)",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "steering",
     "name": "Steering servo",
     "type": "servo",
     "overridable": true,
     "range": [
      -28,
      28
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "python"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "NvidiaRacecar()",
     "label": "car = NvidiaRacecar()",
     "line": "from jetracer.nvidia_racecar import NvidiaRacecar\ncar = NvidiaRacecar()",
     "action": {
      "python": {
       "code": "from jetracer.nvidia_racecar import NvidiaRacecar\ncar = NvidiaRacecar()"
      }
     }
    },
    {
     "group": "NvidiaRacecar()",
     "label": "throttle = 0.25",
     "line": "car.throttle = 0.25",
     "action": {
      "python": {
       "code": "car.throttle = 0.25"
      }
     }
    },
    {
     "group": "NvidiaRacecar()",
     "label": "throttle = 0",
     "line": "car.throttle = 0.0",
     "action": {
      "python": {
       "code": "car.throttle = 0.0"
      }
     }
    },
    {
     "group": "NvidiaRacecar()",
     "label": "throttle = -0.2",
     "line": "car.throttle = -0.2",
     "action": {
      "python": {
       "code": "car.throttle = -0.2"
      }
     }
    },
    {
     "group": "NvidiaRacecar()",
     "label": "steering = 0.5",
     "line": "car.steering = 0.5",
     "action": {
      "python": {
       "code": "car.steering = 0.5"
      }
     }
    },
    {
     "group": "NvidiaRacecar()",
     "label": "steering = 0",
     "line": "car.steering = 0.0",
     "action": {
      "python": {
       "code": "car.steering = 0.0"
      }
     }
    },
    {
     "group": "NvidiaRacecar()",
     "label": "steering = -0.5",
     "line": "car.steering = -0.5",
     "action": {
      "python": {
       "code": "car.steering = -0.5"
      }
     }
    },
    {
     "group": "Calibration · script",
     "label": "steering_offset = 0.05",
     "line": "car.steering_offset = 0.05",
     "action": {
      "python": {
       "code": "car.steering_offset = 0.05"
      }
     }
    },
    {
     "group": "Calibration · script",
     "label": "steering_gain = -0.65",
     "line": "car.steering_gain = -0.65",
     "action": {
      "python": {
       "code": "car.steering_gain = -0.65"
      }
     }
    },
    {
     "group": "Calibration · script",
     "label": "throttle_gain = 0.5",
     "line": "car.throttle_gain = 0.5",
     "action": {
      "python": {
       "code": "car.throttle_gain = 0.5"
      }
     }
    },
    {
     "group": "Calibration · script",
     "label": "print gains",
     "line": "print(car.steering_gain)\nprint(car.steering_offset)\nprint(car.throttle_gain)",
     "action": {
      "python": {
       "code": "print(car.steering_gain)\nprint(car.steering_offset)\nprint(car.throttle_gain)"
      }
     }
    },
    {
     "group": "Calibration · script",
     "label": "Figure eight (script)",
     "line": "import time\ncar.throttle = 0.2\ncar.steering = 1.0\ntime.sleep(3.2)\ncar.steering = -1.0\ntime.sleep(3.2)\ncar.steering = 0.0\ncar.throttle = 0.0",
     "action": {
      "python": {
       "code": "import time\ncar.throttle = 0.2\ncar.steering = 1.0\ntime.sleep(3.2)\ncar.steering = -1.0\ntime.sleep(3.2)\ncar.steering = 0.0\ncar.throttle = 0.0"
      }
     }
    }
   ],
   "telemetry": {
    "car": {
     "steering": 0,
     "throttle": 0,
     "steering_gain": -0.65,
     "steering_offset": 0,
     "throttle_gain": 0.8
    },
    "script": false,
    "python": []
   }
  },
  {
   "robot": "xarm5",
   "page": "indexXArm6.php?model=5",
   "name": "UFACTORY xArm 5 Lite",
   "title": "UFACTORY xArm 5 Lite / 6 / 7 / 850",
   "text": "On a table with coloured blocks: four models from 5 to 7 joints, 70 or 85 cm reach",
   "category": "Robot arms",
   "image": "img/xarm5.jpg",
   "interfaces": [],
   "drive": [],
   "motors": [
    {
     "id": "joint1",
     "name": "Base",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint2",
     "name": "Shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -118,
      120
     ]
    },
    {
     "id": "joint3",
     "name": "Elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -225,
      11
     ]
    },
    {
     "id": "joint4",
     "name": "Wrist",
     "type": "servo",
     "overridable": true,
     "range": [
      -97,
      180
     ]
    },
    {
     "id": "joint5",
     "name": "Flange roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      0,
      85
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask",
    "external"
   ],
   "commands": [],
   "telemetry": {
    "tcp": {
     "x": 0.3,
     "y": 0,
     "z": 0.42,
     "yawDeg": 0
    },
    "holding": null,
    "busy": false,
    "blocks": [
     {
      "id": "red1",
      "color": "red",
      "x": -0.328,
      "y": -0.014,
      "z": 0.02,
      "yawDeg": 99,
      "held": false
     },
     {
      "id": "red2",
      "color": "red",
      "x": -0.498,
      "y": -0.118,
      "z": 0.02,
      "yawDeg": 77.1,
      "held": false
     },
     {
      "id": "green1",
      "color": "green",
      "x": 0.242,
      "y": -0.252,
      "z": 0.02,
      "yawDeg": 82.6,
      "held": false
     },
     {
      "id": "green2",
      "color": "green",
      "x": -0.271,
      "y": -0.14,
      "z": 0.02,
      "yawDeg": 129.4,
      "held": false
     },
     "…"
    ]
   }
  },
  {
   "robot": "xarm850",
   "page": "indexXArm6.php?model=850",
   "name": "UFACTORY 850",
   "title": "UFACTORY xArm 5 Lite / 6 / 7 / 850",
   "text": "On a table with coloured blocks: four models from 5 to 7 joints, 70 or 85 cm reach",
   "category": "Robot arms",
   "image": "img/xarm850.jpg",
   "interfaces": [],
   "drive": [],
   "motors": [
    {
     "id": "joint1",
     "name": "Base",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint2",
     "name": "Shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -132,
      132
     ]
    },
    {
     "id": "joint3",
     "name": "Elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -242,
      3.5
     ]
    },
    {
     "id": "joint4",
     "name": "Forearm roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint5",
     "name": "Wrist",
     "type": "servo",
     "overridable": true,
     "range": [
      -124,
      124
     ]
    },
    {
     "id": "joint6",
     "name": "Flange roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      0,
      85
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask",
    "external"
   ],
   "commands": [],
   "telemetry": {
    "tcp": {
     "x": 0.3,
     "y": 0,
     "z": 0.42,
     "yawDeg": 0
    },
    "holding": null,
    "busy": false,
    "blocks": [
     {
      "id": "red1",
      "color": "red",
      "x": -0.495,
      "y": 0.09,
      "z": 0.02,
      "yawDeg": 115.3,
      "held": false
     },
     {
      "id": "red2",
      "color": "red",
      "x": -0.139,
      "y": 0.447,
      "z": 0.02,
      "yawDeg": 128.1,
      "held": false
     },
     {
      "id": "green1",
      "color": "green",
      "x": 0.218,
      "y": 0.37,
      "z": 0.02,
      "yawDeg": 123.5,
      "held": false
     },
     {
      "id": "green2",
      "color": "green",
      "x": -0.333,
      "y": 0.429,
      "z": 0.02,
      "yawDeg": 50.1,
      "held": false
     },
     "…"
    ]
   }
  },
  {
   "robot": "sespro",
   "page": "indexSESPro.php",
   "name": "Lynxmotion SES-PRO 900 mm 5DoF",
   "title": "Lynxmotion SES-PRO",
   "text": "900 mm 5DoF arm with smart servos, driven by the LSS serial protocol",
   "category": "Robot arms",
   "image": "img/sespro.jpg",
   "interfaces": [
    {
     "key": "serial",
     "family": "Serial protocol"
    }
   ],
   "drive": [],
   "motors": [
    {
     "id": "joint1",
     "name": "Base",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "joint2",
     "name": "Shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -125,
      125
     ]
    },
    {
     "id": "joint3",
     "name": "Elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -150,
      150
     ]
    },
    {
     "id": "joint4",
     "name": "Wrist pitch",
     "type": "servo",
     "overridable": true,
     "range": [
      -120,
      120
     ]
    },
    {
     "id": "joint5",
     "name": "Wrist rotate",
     "type": "servo",
     "overridable": true,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      0,
      85
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "serial"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask",
    "external"
   ],
   "commands": [
    {
     "group": "More actions",
     "label": "Servo 2 to 45.0° in 1.5 s",
     "action": {
      "serial": "#2D450T1500"
     }
    },
    {
     "group": "More actions",
     "label": "Ask the positions",
     "action": {
      "serial": "#1QD#2QD#3QD"
     }
    },
    {
     "group": "More actions",
     "label": "All servos limp",
     "action": {
      "serial": "#254L"
     }
    },
    {
     "group": "More actions",
     "label": "All servos hold",
     "action": {
      "serial": "#254H"
     }
    },
    {
     "group": "More actions",
     "label": "Gripper open",
     "action": {
      "serial": "#6D900"
     }
    },
    {
     "group": "More actions",
     "label": "Servo 3 LED blue",
     "action": {
      "serial": "#3LED3"
     }
    }
   ],
   "telemetry": {
    "tcp": {
     "x": 0.3,
     "y": 0,
     "z": 0.42,
     "yawDeg": 180
    },
    "holding": null,
    "busy": false,
    "lss": {
     "limp": [],
     "status": [
      6,
      6,
      6,
      6,
      "…"
     ],
     "led": [
      2,
      2,
      2,
      2,
      "…"
     ]
    },
    "serial": [],
    "blocks": [
     {
      "id": "red1",
      "color": "red",
      "x": -0.166,
      "y": 0.325,
      "z": 0.02,
      "yawDeg": 16,
      "held": false
     },
     {
      "id": "red2",
      "color": "red",
      "x": 0.384,
      "y": -0.314,
      "z": 0.02,
      "yawDeg": 101.6,
      "held": false
     },
     {
      "id": "green1",
      "color": "green",
      "x": 0.39,
      "y": 0.374,
      "z": 0.02,
      "yawDeg": 163.6,
      "held": false
     },
     {
      "id": "green2",
      "color": "green",
      "x": 0.028,
      "y": 0.528,
      "z": 0.02,
      "yawDeg": 25.1,
      "held": false
     },
     "…"
    ]
   }
  },
  {
   "robot": "xgo",
   "page": "indexXGO.php",
   "name": "XGO-Lite3 Simulator",
   "title": "XGO-Lite3 / Mini2",
   "text": "Desktop robot dog with an arm and gripper, programmed in Python with xgolib",
   "category": "Real robots, real interfaces",
   "image": "img/xgo.jpg",
   "interfaces": [
    {
     "key": "xgo",
     "family": "xgolib (Python)"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "m11",
     "name": "11 left front lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m12",
     "name": "12 left front middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m13",
     "name": "13 left front upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m21",
     "name": "21 right front lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m22",
     "name": "22 right front middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m23",
     "name": "23 right front upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m31",
     "name": "31 right hind lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m32",
     "name": "32 right hind middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m33",
     "name": "33 right hind upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m41",
     "name": "41 left hind lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m42",
     "name": "42 left hind middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m43",
     "name": "43 left hind upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m51",
     "name": "51 gripper",
     "type": "servo",
     "overridable": false,
     "range": [
      -65,
      65
     ]
    },
    {
     "id": "m52",
     "name": "52 arm lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -120,
      120
     ]
    },
    {
     "id": "m53",
     "name": "53 arm upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -120,
      120
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "xgo"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_x(15)",
     "line": ">>> dog.move_x(15)",
     "action": {
      "xgo": "dog.move_x(15)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_x(-10)",
     "line": ">>> dog.move_x(-10)",
     "action": {
      "xgo": "dog.move_x(-10)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_y(10)",
     "line": ">>> dog.move_y(10)",
     "action": {
      "xgo": "dog.move_y(10)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_y(-10)",
     "line": ">>> dog.move_y(-10)",
     "action": {
      "xgo": "dog.move_y(-10)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "turn(50)",
     "line": ">>> dog.turn(50)",
     "action": {
      "xgo": "dog.turn(50)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "turn(-50)",
     "line": ">>> dog.turn(-50)",
     "action": {
      "xgo": "dog.turn(-50)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_x(15, runtime=2)",
     "line": ">>> dog.move_x(15, runtime=2)",
     "action": {
      "xgo": "dog.move_x(15, runtime=2)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "stop()",
     "line": ">>> dog.stop()",
     "action": {
      "xgo": "dog.stop()"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "mark_time(20)",
     "line": ">>> dog.mark_time(20)",
     "action": {
      "xgo": "dog.mark_time(20)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "mark_time(0)",
     "line": ">>> dog.mark_time(0)",
     "action": {
      "xgo": "dog.mark_time(0)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Lie down 1",
     "line": ">>> dog.action(1)",
     "action": {
      "xgo": "dog.action(1)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Stand up 2",
     "line": ">>> dog.action(2)",
     "action": {
      "xgo": "dog.action(2)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Crawl 3",
     "line": ">>> dog.action(3)",
     "action": {
      "xgo": "dog.action(3)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Turn around 4",
     "line": ">>> dog.action(4)",
     "action": {
      "xgo": "dog.action(4)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Mark time 5",
     "line": ">>> dog.action(5)",
     "action": {
      "xgo": "dog.action(5)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Squat 6",
     "line": ">>> dog.action(6)",
     "action": {
      "xgo": "dog.action(6)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Roll 7",
     "line": ">>> dog.action(7)",
     "action": {
      "xgo": "dog.action(7)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Pitch 8",
     "line": ">>> dog.action(8)",
     "action": {
      "xgo": "dog.action(8)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Yaw 9",
     "line": ">>> dog.action(9)",
     "action": {
      "xgo": "dog.action(9)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "3-axis 10",
     "line": ">>> dog.action(10)",
     "action": {
      "xgo": "dog.action(10)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Pee 11",
     "line": ">>> dog.action(11)",
     "action": {
      "xgo": "dog.action(11)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Sit 12",
     "line": ">>> dog.action(12)",
     "action": {
      "xgo": "dog.action(12)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Wave 13",
     "line": ">>> dog.action(13)",
     "action": {
      "xgo": "dog.action(13)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Stretch 14",
     "line": ">>> dog.action(14)",
     "action": {
      "xgo": "dog.action(14)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Wave body 15",
     "line": ">>> dog.action(15)",
     "action": {
      "xgo": "dog.action(15)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Swing 16",
     "line": ">>> dog.action(16)",
     "action": {
      "xgo": "dog.action(16)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Pray 17",
     "line": ">>> dog.action(17)",
     "action": {
      "xgo": "dog.action(17)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Look for food 18",
     "line": ">>> dog.action(18)",
     "action": {
      "xgo": "dog.action(18)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Handshake 19",
     "line": ">>> dog.action(19)",
     "action": {
      "xgo": "dog.action(19)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Chicken head 20",
     "line": ">>> dog.action(20)",
     "action": {
      "xgo": "dog.action(20)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Push-ups 21",
     "line": ">>> dog.action(21)",
     "action": {
      "xgo": "dog.action(21)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Look around 22",
     "line": ">>> dog.action(22)",
     "action": {
      "xgo": "dog.action(22)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Dance 23",
     "line": ">>> dog.action(23)",
     "action": {
      "xgo": "dog.action(23)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Naughty 24",
     "line": ">>> dog.action(24)",
     "action": {
      "xgo": "dog.action(24)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "reset()",
     "line": ">>> dog.reset()",
     "action": {
      "xgo": "dog.reset()"
     }
    },
    {
     "group": "Body",
     "label": "attitude('p', 10)",
     "line": ">>> dog.attitude('p', 10)",
     "action": {
      "xgo": "dog.attitude('p', 10)"
     }
    },
    {
     "group": "Body",
     "label": "attitude('r', 15)",
     "line": ">>> dog.attitude('r', 15)",
     "action": {
      "xgo": "dog.attitude('r', 15)"
     }
    },
    {
     "group": "Body",
     "label": "attitude('y', -10)",
     "line": ">>> dog.attitude('y', -10)",
     "action": {
      "xgo": "dog.attitude('y', -10)"
     }
    },
    {
     "group": "Body",
     "label": "attitude(['r', 'p', 'y'], [0, 0, 0])",
     "line": ">>> dog.attitude(['r', 'p', 'y'], [0, 0, 0])",
     "action": {
      "xgo": "dog.attitude(['r', 'p', 'y'], [0, 0, 0])"
     }
    },
    {
     "group": "Body",
     "label": "translation('z', 65)",
     "line": ">>> dog.translation('z', 65)",
     "action": {
      "xgo": "dog.translation('z', 65)"
     }
    },
    {
     "group": "Body",
     "label": "translation('z', 95)",
     "line": ">>> dog.translation('z', 95)",
     "action": {
      "xgo": "dog.translation('z', 95)"
     }
    },
    {
     "group": "Body",
     "label": "translation('x', 15)",
     "line": ">>> dog.translation('x', 15)",
     "action": {
      "xgo": "dog.translation('x', 15)"
     }
    },
    {
     "group": "Body",
     "label": "periodic_rot('r', 2)",
     "line": ">>> dog.periodic_rot('r', 2)",
     "action": {
      "xgo": "dog.periodic_rot('r', 2)"
     }
    },
    {
     "group": "Body",
     "label": "periodic_rot('r', 0)",
     "line": ">>> dog.periodic_rot('r', 0)",
     "action": {
      "xgo": "dog.periodic_rot('r', 0)"
     }
    },
    {
     "group": "Body",
     "label": "gait_type('walk')",
     "line": ">>> dog.gait_type('walk')",
     "action": {
      "xgo": "dog.gait_type('walk')"
     }
    },
    {
     "group": "Body",
     "label": "gait_type('trot')",
     "line": ">>> dog.gait_type('trot')",
     "action": {
      "xgo": "dog.gait_type('trot')"
     }
    },
    {
     "group": "Body",
     "label": "pace('slow')",
     "line": ">>> dog.pace('slow')",
     "action": {
      "xgo": "dog.pace('slow')"
     }
    },
    {
     "group": "Body",
     "label": "imu(1)",
     "line": ">>> dog.imu(1)",
     "action": {
      "xgo": "dog.imu(1)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "arm(130, 0)",
     "line": ">>> dog.arm(130, 0)",
     "action": {
      "xgo": "dog.arm(130, 0)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "arm(80, 100)",
     "line": ">>> dog.arm(80, 100)",
     "action": {
      "xgo": "dog.arm(80, 100)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "arm(110, 15)",
     "line": ">>> dog.arm(110, 15)",
     "action": {
      "xgo": "dog.arm(110, 15)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "claw(0)",
     "line": ">>> dog.claw(0)",
     "action": {
      "xgo": "dog.claw(0)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "claw(255)",
     "line": ">>> dog.claw(255)",
     "action": {
      "xgo": "dog.claw(255)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "Grab high 128",
     "line": ">>> dog.action(128)",
     "action": {
      "xgo": "dog.action(128)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "Grab middle 129",
     "line": ">>> dog.action(129)",
     "action": {
      "xgo": "dog.action(129)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "Grab low 130",
     "line": ">>> dog.action(130)",
     "action": {
      "xgo": "dog.action(130)"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_battery())",
     "line": ">>> print(dog.read_battery())",
     "action": {
      "xgo": "print(dog.read_battery())"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_pitch())",
     "line": ">>> print(dog.read_pitch())",
     "action": {
      "xgo": "print(dog.read_pitch())"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_motor())",
     "line": ">>> print(dog.read_motor())",
     "action": {
      "xgo": "print(dog.read_motor())"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_firmware())",
     "line": ">>> print(dog.read_firmware())",
     "action": {
      "xgo": "print(dog.read_firmware())"
     }
    }
   ],
   "telemetry": {
    "model": "XGO-Lite3",
    "action": null,
    "actionName": null,
    "move": {
     "x": 0,
     "y": 0,
     "turn": 0
    },
    "gait": "trot",
    "pace": "normal",
    "markTime": 0,
    "height_mm": 95,
    "attitude": {
     "r": 0,
     "p": 0,
     "y": 0
    },
    "imu": false,
    "lying": false,
    "arm": {
     "x": 110,
     "z": 15,
     "claw": 0
    }
   }
  },
  {
   "robot": "xgomini",
   "page": "indexXGO.php?variant=mini",
   "name": "XGO-Mini2 Simulator",
   "title": "XGO-Lite3 / Mini2",
   "text": "Desktop robot dog with an arm and gripper, programmed in Python with xgolib",
   "category": "Real robots, real interfaces",
   "image": "img/xgo.jpg",
   "interfaces": [
    {
     "key": "xgo",
     "family": "xgolib (Python)"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "m11",
     "name": "11 left front lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m12",
     "name": "12 left front middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m13",
     "name": "13 left front upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m21",
     "name": "21 right front lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m22",
     "name": "22 right front middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m23",
     "name": "23 right front upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m31",
     "name": "31 right hind lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m32",
     "name": "32 right hind middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m33",
     "name": "33 right hind upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m41",
     "name": "41 left hind lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "m42",
     "name": "42 left hind middle",
     "type": "servo",
     "overridable": false,
     "range": [
      -95,
      95
     ]
    },
    {
     "id": "m43",
     "name": "43 left hind upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -31,
      31
     ]
    },
    {
     "id": "m51",
     "name": "51 gripper",
     "type": "servo",
     "overridable": false,
     "range": [
      -65,
      65
     ]
    },
    {
     "id": "m52",
     "name": "52 arm lower",
     "type": "servo",
     "overridable": false,
     "range": [
      -120,
      120
     ]
    },
    {
     "id": "m53",
     "name": "53 arm upper",
     "type": "servo",
     "overridable": false,
     "range": [
      -120,
      120
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "xgo"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_x(15)",
     "line": ">>> dog.move_x(15)",
     "action": {
      "xgo": "dog.move_x(15)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_x(-10)",
     "line": ">>> dog.move_x(-10)",
     "action": {
      "xgo": "dog.move_x(-10)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_y(10)",
     "line": ">>> dog.move_y(10)",
     "action": {
      "xgo": "dog.move_y(10)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_y(-10)",
     "line": ">>> dog.move_y(-10)",
     "action": {
      "xgo": "dog.move_y(-10)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "turn(50)",
     "line": ">>> dog.turn(50)",
     "action": {
      "xgo": "dog.turn(50)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "turn(-50)",
     "line": ">>> dog.turn(-50)",
     "action": {
      "xgo": "dog.turn(-50)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "move_x(15, runtime=2)",
     "line": ">>> dog.move_x(15, runtime=2)",
     "action": {
      "xgo": "dog.move_x(15, runtime=2)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "stop()",
     "line": ">>> dog.stop()",
     "action": {
      "xgo": "dog.stop()"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "mark_time(20)",
     "line": ">>> dog.mark_time(20)",
     "action": {
      "xgo": "dog.mark_time(20)"
     }
    },
    {
     "group": "Move (steps: 1 = 1 cm/s, turn in °/s)",
     "label": "mark_time(0)",
     "line": ">>> dog.mark_time(0)",
     "action": {
      "xgo": "dog.mark_time(0)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Lie down 1",
     "line": ">>> dog.action(1)",
     "action": {
      "xgo": "dog.action(1)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Stand up 2",
     "line": ">>> dog.action(2)",
     "action": {
      "xgo": "dog.action(2)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Crawl 3",
     "line": ">>> dog.action(3)",
     "action": {
      "xgo": "dog.action(3)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Turn around 4",
     "line": ">>> dog.action(4)",
     "action": {
      "xgo": "dog.action(4)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Mark time 5",
     "line": ">>> dog.action(5)",
     "action": {
      "xgo": "dog.action(5)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Squat 6",
     "line": ">>> dog.action(6)",
     "action": {
      "xgo": "dog.action(6)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Roll 7",
     "line": ">>> dog.action(7)",
     "action": {
      "xgo": "dog.action(7)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Pitch 8",
     "line": ">>> dog.action(8)",
     "action": {
      "xgo": "dog.action(8)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Yaw 9",
     "line": ">>> dog.action(9)",
     "action": {
      "xgo": "dog.action(9)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "3-axis 10",
     "line": ">>> dog.action(10)",
     "action": {
      "xgo": "dog.action(10)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Pee 11",
     "line": ">>> dog.action(11)",
     "action": {
      "xgo": "dog.action(11)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Sit 12",
     "line": ">>> dog.action(12)",
     "action": {
      "xgo": "dog.action(12)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Wave 13",
     "line": ">>> dog.action(13)",
     "action": {
      "xgo": "dog.action(13)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Stretch 14",
     "line": ">>> dog.action(14)",
     "action": {
      "xgo": "dog.action(14)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Wave body 15",
     "line": ">>> dog.action(15)",
     "action": {
      "xgo": "dog.action(15)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Swing 16",
     "line": ">>> dog.action(16)",
     "action": {
      "xgo": "dog.action(16)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Pray 17",
     "line": ">>> dog.action(17)",
     "action": {
      "xgo": "dog.action(17)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Look for food 18",
     "line": ">>> dog.action(18)",
     "action": {
      "xgo": "dog.action(18)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Handshake 19",
     "line": ">>> dog.action(19)",
     "action": {
      "xgo": "dog.action(19)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Chicken head 20",
     "line": ">>> dog.action(20)",
     "action": {
      "xgo": "dog.action(20)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Push-ups 21",
     "line": ">>> dog.action(21)",
     "action": {
      "xgo": "dog.action(21)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Look around 22",
     "line": ">>> dog.action(22)",
     "action": {
      "xgo": "dog.action(22)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Dance 23",
     "line": ">>> dog.action(23)",
     "action": {
      "xgo": "dog.action(23)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "Naughty 24",
     "line": ">>> dog.action(24)",
     "action": {
      "xgo": "dog.action(24)"
     }
    },
    {
     "group": "Actions · dog.action(id)",
     "label": "reset()",
     "line": ">>> dog.reset()",
     "action": {
      "xgo": "dog.reset()"
     }
    },
    {
     "group": "Body",
     "label": "attitude('p', 10)",
     "line": ">>> dog.attitude('p', 10)",
     "action": {
      "xgo": "dog.attitude('p', 10)"
     }
    },
    {
     "group": "Body",
     "label": "attitude('r', 15)",
     "line": ">>> dog.attitude('r', 15)",
     "action": {
      "xgo": "dog.attitude('r', 15)"
     }
    },
    {
     "group": "Body",
     "label": "attitude('y', -10)",
     "line": ">>> dog.attitude('y', -10)",
     "action": {
      "xgo": "dog.attitude('y', -10)"
     }
    },
    {
     "group": "Body",
     "label": "attitude(['r', 'p', 'y'], [0, 0, 0])",
     "line": ">>> dog.attitude(['r', 'p', 'y'], [0, 0, 0])",
     "action": {
      "xgo": "dog.attitude(['r', 'p', 'y'], [0, 0, 0])"
     }
    },
    {
     "group": "Body",
     "label": "translation('z', 80)",
     "line": ">>> dog.translation('z', 80)",
     "action": {
      "xgo": "dog.translation('z', 80)"
     }
    },
    {
     "group": "Body",
     "label": "translation('z', 105)",
     "line": ">>> dog.translation('z', 105)",
     "action": {
      "xgo": "dog.translation('z', 105)"
     }
    },
    {
     "group": "Body",
     "label": "translation('x', 15)",
     "line": ">>> dog.translation('x', 15)",
     "action": {
      "xgo": "dog.translation('x', 15)"
     }
    },
    {
     "group": "Body",
     "label": "periodic_rot('r', 2)",
     "line": ">>> dog.periodic_rot('r', 2)",
     "action": {
      "xgo": "dog.periodic_rot('r', 2)"
     }
    },
    {
     "group": "Body",
     "label": "periodic_rot('r', 0)",
     "line": ">>> dog.periodic_rot('r', 0)",
     "action": {
      "xgo": "dog.periodic_rot('r', 0)"
     }
    },
    {
     "group": "Body",
     "label": "gait_type('walk')",
     "line": ">>> dog.gait_type('walk')",
     "action": {
      "xgo": "dog.gait_type('walk')"
     }
    },
    {
     "group": "Body",
     "label": "gait_type('trot')",
     "line": ">>> dog.gait_type('trot')",
     "action": {
      "xgo": "dog.gait_type('trot')"
     }
    },
    {
     "group": "Body",
     "label": "pace('slow')",
     "line": ">>> dog.pace('slow')",
     "action": {
      "xgo": "dog.pace('slow')"
     }
    },
    {
     "group": "Body",
     "label": "imu(1)",
     "line": ">>> dog.imu(1)",
     "action": {
      "xgo": "dog.imu(1)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "arm(130, 0)",
     "line": ">>> dog.arm(130, 0)",
     "action": {
      "xgo": "dog.arm(130, 0)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "arm(80, 100)",
     "line": ">>> dog.arm(80, 100)",
     "action": {
      "xgo": "dog.arm(80, 100)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "arm(110, 15)",
     "line": ">>> dog.arm(110, 15)",
     "action": {
      "xgo": "dog.arm(110, 15)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "claw(0)",
     "line": ">>> dog.claw(0)",
     "action": {
      "xgo": "dog.claw(0)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "claw(255)",
     "line": ">>> dog.claw(255)",
     "action": {
      "xgo": "dog.claw(255)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "Grab high 128",
     "line": ">>> dog.action(128)",
     "action": {
      "xgo": "dog.action(128)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "Grab middle 129",
     "line": ">>> dog.action(129)",
     "action": {
      "xgo": "dog.action(129)"
     }
    },
    {
     "group": "Arm and gripper",
     "label": "Grab low 130",
     "line": ">>> dog.action(130)",
     "action": {
      "xgo": "dog.action(130)"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_battery())",
     "line": ">>> print(dog.read_battery())",
     "action": {
      "xgo": "print(dog.read_battery())"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_pitch())",
     "line": ">>> print(dog.read_pitch())",
     "action": {
      "xgo": "print(dog.read_pitch())"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_motor())",
     "line": ">>> print(dog.read_motor())",
     "action": {
      "xgo": "print(dog.read_motor())"
     }
    },
    {
     "group": "Read",
     "label": "print(dog.read_firmware())",
     "line": ">>> print(dog.read_firmware())",
     "action": {
      "xgo": "print(dog.read_firmware())"
     }
    }
   ],
   "telemetry": {
    "model": "XGO-Mini2",
    "action": null,
    "actionName": null,
    "move": {
     "x": 0,
     "y": 0,
     "turn": 0
    },
    "gait": "trot",
    "pace": "normal",
    "markTime": 0,
    "height_mm": 105,
    "attitude": {
     "r": 0,
     "p": 0,
     "y": 0
    },
    "imu": false,
    "lying": false,
    "arm": {
     "x": 110,
     "z": 15,
     "claw": 0
    }
   }
  },
  {
   "robot": "a2",
   "page": "indexA2.php",
   "name": "Unitree A2 Simulator",
   "title": "Unitree A2 / AS2",
   "text": "Industrial quadrupeds driven with the unitree_sdk2 sport API",
   "category": "Real robots, real interfaces",
   "image": "img/a2.jpg",
   "interfaces": [
    {
     "key": "sdk",
     "family": "Maker SDK"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "sdk"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Posture",
     "label": "Stand up",
     "line": "sport_client.StandUp();",
     "action": {
      "sdk": {
       "api_id": 1004
      }
     }
    },
    {
     "group": "Posture",
     "label": "Balance stand",
     "line": "sport_client.BalanceStand();",
     "action": {
      "sdk": {
       "api_id": 1002
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stand down",
     "line": "sport_client.StandDown();",
     "action": {
      "sdk": {
       "api_id": 1005
      }
     }
    },
    {
     "group": "Posture",
     "label": "Recovery stand",
     "line": "sport_client.RecoveryStand();",
     "action": {
      "sdk": {
       "api_id": 1006
      }
     }
    },
    {
     "group": "Posture",
     "label": "Damp",
     "line": "sport_client.Damp();",
     "action": {
      "sdk": {
       "api_id": 1001
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stop",
     "line": "sport_client.StopMove();",
     "action": {
      "sdk": {
       "api_id": 1003
      }
     }
    },
    {
     "group": "Walk",
     "label": "Move 0.5 m/s",
     "line": "sport_client.Move(0.5f, 0.0f, 0.0f);",
     "action": {
      "sdk": {
       "api_id": 1008,
       "parameter": {
        "x": 0.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Turn 0.5 rad/s",
     "line": "sport_client.Move(0.0f, 0.0f, 0.5f);",
     "action": {
      "sdk": {
       "api_id": 1008,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 0.5
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Gait: default",
     "line": "sport_client.SwitchGait(0);",
     "action": {
      "sdk": {
       "api_id": 1011,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Gait: running",
     "line": "sport_client.SwitchGait(1);",
     "action": {
      "sdk": {
       "api_id": 1011,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Gait: climb",
     "line": "sport_client.SwitchGait(2);",
     "action": {
      "sdk": {
       "api_id": 1011,
       "parameter": {
        "data": 2
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Speed level 1",
     "line": "sport_client.SpeedLevel(1);",
     "action": {
      "sdk": {
       "api_id": 1015,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Square path",
     "line": "sport_client.Trajectory(path /* 5 PathPoints */, 1);",
     "action": {
      "sdk": {
       "api_id": 1035,
       "parameter": {
        "path": [
         {
          "t_from_start": 0,
          "x": 0,
          "y": 0,
          "yaw": 0
         },
         {
          "t_from_start": 3,
          "x": 0.8,
          "y": 0,
          "yaw": 0
         },
         {
          "t_from_start": 6,
          "x": 0.8,
          "y": 0.8,
          "yaw": 0
         },
         {
          "t_from_start": 9,
          "x": 0,
          "y": 0.8,
          "yaw": 0
         },
         {
          "t_from_start": 12,
          "x": 0,
          "y": 0,
          "yaw": 0
         }
        ],
        "feedback_mode": 1
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Body low",
     "line": "sport_client.BodyHeight(-0.1f);",
     "action": {
      "sdk": {
       "api_id": 1013,
       "parameter": {
        "data": -0.1
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Body normal",
     "line": "sport_client.BodyHeight(0.0f);",
     "action": {
      "sdk": {
       "api_id": 1013,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Euler",
     "line": "sport_client.Euler(0.2f, 0.3f, 0.3f);",
     "action": {
      "sdk": {
       "api_id": 1007,
       "parameter": {
        "x": 0.2,
        "y": 0.3,
        "z": 0.3
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Euler 0",
     "line": "sport_client.Euler(0.0f, 0.0f, 0.0f);",
     "action": {
      "sdk": {
       "api_id": 1007,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Body position",
     "line": "sport_client.BodyPosition(0.1f, 0.05f, -0.05f, 0.2f);",
     "action": {
      "sdk": {
       "api_id": 1009,
       "parameter": {
        "x": 0.1,
        "y": 0.05,
        "z": -0.05,
        "yaw": 0.2
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Left side gait",
     "line": "sport_client.LeftSideGait(1);",
     "action": {
      "sdk": {
       "api_id": 1016,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.LeftSideGait(0);",
     "action": {
      "sdk": {
       "api_id": 1016,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Right side gait",
     "line": "sport_client.RightSideGait(1);",
     "action": {
      "sdk": {
       "api_id": 1017,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.RightSideGait(0);",
     "action": {
      "sdk": {
       "api_id": 1017,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Handstand",
     "line": "sport_client.HandStand(1);",
     "action": {
      "sdk": {
       "api_id": 1018,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.HandStand(0);",
     "action": {
      "sdk": {
       "api_id": 1018,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Biped stand",
     "line": "sport_client.BipedStand(1);",
     "action": {
      "sdk": {
       "api_id": 1019,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.BipedStand(0);",
     "action": {
      "sdk": {
       "api_id": 1019,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Front flip",
     "line": "sport_client.FrontFlip();",
     "action": {
      "sdk": {
       "api_id": 1020
      }
     }
    },
    {
     "group": "Special",
     "label": "Back flip",
     "line": "sport_client.BackFlip();",
     "action": {
      "sdk": {
       "api_id": 1021
      }
     }
    },
    {
     "group": "State",
     "label": "Get state",
     "line": "sport_client.GetState(state_map);",
     "action": {
      "sdk": {
       "api_id": 1034
      }
     }
    },
    {
     "group": "State",
     "label": "Auto recovery off",
     "line": "sport_client.SetAutoRecovery(0);",
     "action": {
      "sdk": {
       "api_id": 1040,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "State",
     "label": "Reset estimator",
     "line": "sport_client.ResetEstimator();",
     "action": {
      "sdk": {
       "api_id": 1111
      }
     }
    }
   ],
   "telemetry": {
    "model": "a2",
    "sportmodestate": {
     "mode": 3,
     "mode_name": "DEFAULT_MODE",
     "progress": 0,
     "position": [
      0,
      0,
      0
     ],
     "velocity": [
      0,
      0,
      0
     ],
     "yaw_speed": 0,
     "body_height": 0.43
    },
    "gait": "trot",
    "speed_level": 0,
    "trajectory": false,
    "sdk": []
   }
  },
  {
   "robot": "as2",
   "page": "indexA2.php?variant=as2",
   "name": "Unitree AS2 Simulator",
   "title": "Unitree A2 / AS2",
   "text": "Industrial quadrupeds driven with the unitree_sdk2 sport API",
   "category": "Real robots, real interfaces",
   "image": "img/as2.jpg",
   "interfaces": [
    {
     "key": "sdk",
     "family": "Maker SDK"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "sdk"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Posture",
     "label": "Stand up",
     "line": "sport_client.StandUp();",
     "action": {
      "sdk": {
       "api_id": 1004
      }
     }
    },
    {
     "group": "Posture",
     "label": "Balance stand",
     "line": "sport_client.BalanceStand();",
     "action": {
      "sdk": {
       "api_id": 1002
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stand down",
     "line": "sport_client.StandDown();",
     "action": {
      "sdk": {
       "api_id": 1005
      }
     }
    },
    {
     "group": "Posture",
     "label": "Recovery stand",
     "line": "sport_client.RecoveryStand();",
     "action": {
      "sdk": {
       "api_id": 1006
      }
     }
    },
    {
     "group": "Posture",
     "label": "Damp",
     "line": "sport_client.Damp();",
     "action": {
      "sdk": {
       "api_id": 1001
      }
     }
    },
    {
     "group": "Posture",
     "label": "Stop",
     "line": "sport_client.StopMove();",
     "action": {
      "sdk": {
       "api_id": 1003
      }
     }
    },
    {
     "group": "Posture",
     "label": "Sit",
     "line": "sport_client.Sit(1);",
     "action": {
      "sdk": {
       "api_id": 1029,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Posture",
     "label": "Rise",
     "line": "sport_client.Sit(0);",
     "action": {
      "sdk": {
       "api_id": 1029,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Move 0.5 m/s",
     "line": "sport_client.Move(0.5f, 0.0f, 0.0f);",
     "action": {
      "sdk": {
       "api_id": 1008,
       "parameter": {
        "x": 0.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Turn 0.5 rad/s",
     "line": "sport_client.Move(0.0f, 0.0f, 0.5f);",
     "action": {
      "sdk": {
       "api_id": 1008,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 0.5
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Gait: default",
     "line": "sport_client.SwitchGait(0);",
     "action": {
      "sdk": {
       "api_id": 1011,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Gait: running",
     "line": "sport_client.SwitchGait(1);",
     "action": {
      "sdk": {
       "api_id": 1011,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Gait: climb",
     "line": "sport_client.SwitchGait(2);",
     "action": {
      "sdk": {
       "api_id": 1011,
       "parameter": {
        "data": 2
       }
      }
     }
    },
    {
     "group": "Walk",
     "label": "Speed level 1",
     "line": "sport_client.SpeedLevel(1);",
     "action": {
      "sdk": {
       "api_id": 1015,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Body low",
     "line": "sport_client.BodyHeight(-0.1f);",
     "action": {
      "sdk": {
       "api_id": 1013,
       "parameter": {
        "data": -0.1
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Body normal",
     "line": "sport_client.BodyHeight(0.0f);",
     "action": {
      "sdk": {
       "api_id": 1013,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Euler",
     "line": "sport_client.Euler(0.2f, 0.3f, 0.3f);",
     "action": {
      "sdk": {
       "api_id": 1007,
       "parameter": {
        "x": 0.2,
        "y": 0.3,
        "z": 0.3
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Euler 0",
     "line": "sport_client.Euler(0.0f, 0.0f, 0.0f);",
     "action": {
      "sdk": {
       "api_id": 1007,
       "parameter": {
        "x": 0,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Body",
     "label": "Body position",
     "line": "sport_client.BodyPosition(0.1f, 0.05f, -0.05f, 0.2f);",
     "action": {
      "sdk": {
       "api_id": 1009,
       "parameter": {
        "x": 0.1,
        "y": 0.05,
        "z": -0.05,
        "yaw": 0.2
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Left side gait",
     "line": "sport_client.LeftSideGait(1);",
     "action": {
      "sdk": {
       "api_id": 1016,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.LeftSideGait(0);",
     "action": {
      "sdk": {
       "api_id": 1016,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Right side gait",
     "line": "sport_client.RightSideGait(1);",
     "action": {
      "sdk": {
       "api_id": 1017,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.RightSideGait(0);",
     "action": {
      "sdk": {
       "api_id": 1017,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Handstand",
     "line": "sport_client.HandStand(1);",
     "action": {
      "sdk": {
       "api_id": 1018,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.HandStand(0);",
     "action": {
      "sdk": {
       "api_id": 1018,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Biped stand",
     "line": "sport_client.BipedStand(1);",
     "action": {
      "sdk": {
       "api_id": 1019,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "…off",
     "line": "sport_client.BipedStand(0);",
     "action": {
      "sdk": {
       "api_id": 1019,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Special",
     "label": "Front flip",
     "line": "sport_client.FrontFlip();",
     "action": {
      "sdk": {
       "api_id": 1020
      }
     }
    },
    {
     "group": "Special",
     "label": "Back flip",
     "line": "sport_client.BackFlip();",
     "action": {
      "sdk": {
       "api_id": 1021
      }
     }
    },
    {
     "group": "Actions",
     "label": "Greeting",
     "line": "sport_client.Greeting();",
     "action": {
      "sdk": {
       "api_id": 1022
      }
     }
    },
    {
     "group": "Actions",
     "label": "Handshake",
     "line": "sport_client.Handshake();",
     "action": {
      "sdk": {
       "api_id": 1027
      }
     }
    },
    {
     "group": "Actions",
     "label": "Heart",
     "line": "sport_client.Heart();",
     "action": {
      "sdk": {
       "api_id": 1023
      }
     }
    },
    {
     "group": "Actions",
     "label": "Content",
     "line": "sport_client.Content();",
     "action": {
      "sdk": {
       "api_id": 1024
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dance 1",
     "line": "sport_client.Dance1();",
     "action": {
      "sdk": {
       "api_id": 1025
      }
     }
    },
    {
     "group": "Actions",
     "label": "Dance 2",
     "line": "sport_client.Dance2();",
     "action": {
      "sdk": {
       "api_id": 1026
      }
     }
    },
    {
     "group": "Actions",
     "label": "Stretch",
     "line": "sport_client.Stretch();",
     "action": {
      "sdk": {
       "api_id": 1028
      }
     }
    },
    {
     "group": "Actions",
     "label": "Front jump",
     "line": "sport_client.FrontJump();",
     "action": {
      "sdk": {
       "api_id": 1030
      }
     }
    },
    {
     "group": "Actions",
     "label": "Push-ups",
     "line": "sport_client.PushUp();",
     "action": {
      "sdk": {
       "api_id": 1031
      }
     }
    },
    {
     "group": "Actions",
     "label": "Jump up",
     "line": "sport_client.UpJump();",
     "action": {
      "sdk": {
       "api_id": 1032
      }
     }
    },
    {
     "group": "State",
     "label": "Get state",
     "line": "sport_client.GetState(state_map);",
     "action": {
      "sdk": {
       "api_id": 1034
      }
     }
    },
    {
     "group": "State",
     "label": "Auto recovery off",
     "line": "sport_client.SetAutoRecovery(0);",
     "action": {
      "sdk": {
       "api_id": 1040,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "State",
     "label": "Joystick off",
     "line": "sport_client.SwitchJoystick(0);",
     "action": {
      "sdk": {
       "api_id": 1041,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "State",
     "label": "Joystick on",
     "line": "sport_client.SwitchJoystick(1);",
     "action": {
      "sdk": {
       "api_id": 1041,
       "parameter": {
        "data": 1
       }
      }
     }
    }
   ],
   "telemetry": {
    "model": "as2",
    "sportmodestate": {
     "mode": 3,
     "mode_name": "DEFAULT_MODE",
     "progress": 0,
     "position": [
      0,
      0,
      0
     ],
     "velocity": [
      0,
      0,
      0
     ],
     "yaw_speed": 0,
     "body_height": 0.35
    },
    "gait": "trot",
    "speed_level": 0,
    "trajectory": false,
    "sdk": []
   }
  },
  {
   "robot": "agibotd1",
   "page": "indexAgiBotD1.php",
   "name": "AgiBot D1 Simulator",
   "title": "AgiBot D1 Edu",
   "text": "Robot dog driven with the HighLevel functions of AgiBot's official SDK",
   "category": "Real robots, real interfaces",
   "image": "img/agibotd1.jpg",
   "interfaces": [
    {
     "key": "sdk",
     "family": "Maker SDK"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL_hip",
     "name": "Front left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FL_thigh",
     "name": "Front left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FL_calf",
     "name": "Front left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "FR_hip",
     "name": "Front right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "FR_thigh",
     "name": "Front right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "FR_calf",
     "name": "Front right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "RL_hip",
     "name": "Rear left hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RL_thigh",
     "name": "Rear left thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RL_calf",
     "name": "Rear left calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    },
    {
     "id": "RR_hip",
     "name": "Rear right hip",
     "type": "servo",
     "overridable": false,
     "range": [
      -60,
      60
     ]
    },
    {
     "id": "RR_thigh",
     "name": "Rear right thigh",
     "type": "servo",
     "overridable": false,
     "range": [
      -260,
      260
     ]
    },
    {
     "id": "RR_calf",
     "name": "Rear right calf",
     "type": "servo",
     "overridable": false,
     "range": [
      -170,
      170
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "sdk"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Posture",
     "label": "Stand up",
     "line": "app.standUp()",
     "action": {
      "sdk": {
       "fn": "standUp",
       "args": []
      }
     }
    },
    {
     "group": "Posture",
     "label": "Lie down",
     "line": "app.lieDown()",
     "action": {
      "sdk": {
       "fn": "lieDown",
       "args": []
      }
     }
    },
    {
     "group": "Posture",
     "label": "Passive (damp)",
     "line": "app.passive()",
     "action": {
      "sdk": {
       "fn": "passive",
       "args": []
      }
     }
    },
    {
     "group": "Move",
     "label": "Forward 0.5",
     "line": "app.move(0.5, 0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "move",
       "args": [
        0.5,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Move",
     "label": "Left 0.3",
     "line": "app.move(0.0, 0.3, 0.0)",
     "action": {
      "sdk": {
       "fn": "move",
       "args": [
        0,
        0.3,
        0
       ]
      }
     }
    },
    {
     "group": "Move",
     "label": "Turn 0.8",
     "line": "app.move(0.0, 0.0, 0.8)",
     "action": {
      "sdk": {
       "fn": "move",
       "args": [
        0,
        0,
        0.8
       ]
      }
     }
    },
    {
     "group": "Move",
     "label": "Stop",
     "line": "app.move(0.0, 0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "move",
       "args": [
        0,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Move",
     "label": "Too fast",
     "line": "app.move(4.0, 0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "move",
       "args": [
        4,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Tricks",
     "label": "Jump",
     "line": "app.jump()",
     "action": {
      "sdk": {
       "fn": "jump",
       "args": []
      }
     }
    },
    {
     "group": "Tricks",
     "label": "Front jump",
     "line": "app.frontJump()",
     "action": {
      "sdk": {
       "fn": "frontJump",
       "args": []
      }
     }
    },
    {
     "group": "Tricks",
     "label": "Backflip",
     "line": "app.backflip()",
     "action": {
      "sdk": {
       "fn": "backflip",
       "args": []
      }
     }
    },
    {
     "group": "Tricks",
     "label": "Shake hand",
     "line": "app.shakeHand()",
     "action": {
      "sdk": {
       "fn": "shakeHand",
       "args": []
      }
     }
    },
    {
     "group": "Tricks",
     "label": "Two-leg stand",
     "line": "app.twoLegStand(0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "twoLegStand",
       "args": [
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Tricks",
     "label": "…walk 0.3",
     "line": "app.twoLegStand(0.3, 0.0)",
     "action": {
      "sdk": {
       "fn": "twoLegStand",
       "args": [
        0.3,
        0
       ]
      }
     }
    },
    {
     "group": "Tricks",
     "label": "Cancel two-leg",
     "line": "app.cancelTwoLegStand()",
     "action": {
      "sdk": {
       "fn": "cancelTwoLegStand",
       "args": []
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Pitch up",
     "line": "app.attitudeControl(0.0, -0.3, 0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "attitudeControl",
       "args": [
        0,
        -0.3,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Roll",
     "line": "app.attitudeControl(0.3, 0.0, 0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "attitudeControl",
       "args": [
        0.3,
        0,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Lower",
     "line": "app.attitudeControl(0.0, 0.0, 0.0, -0.2)",
     "action": {
      "sdk": {
       "fn": "attitudeControl",
       "args": [
        0,
        0,
        0,
        -0.2
       ]
      }
     }
    },
    {
     "group": "Attitude",
     "label": "Hold",
     "line": "app.attitudeControl(0.0, 0.0, 0.0, 0.0)",
     "action": {
      "sdk": {
       "fn": "attitudeControl",
       "args": [
        0,
        0,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Read",
     "label": "CurrentCtrlmode",
     "line": "app.getCurrentCtrlmode()",
     "action": {
      "sdk": {
       "fn": "getCurrentCtrlmode",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "RPY",
     "line": "app.getRPY()",
     "action": {
      "sdk": {
       "fn": "getRPY",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "Position",
     "line": "app.getPosition()",
     "action": {
      "sdk": {
       "fn": "getPosition",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "BodyVelocity",
     "line": "app.getBodyVelocity()",
     "action": {
      "sdk": {
       "fn": "getBodyVelocity",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "BatteryPower",
     "line": "app.getBatteryPower()",
     "action": {
      "sdk": {
       "fn": "getBatteryPower",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "LegHipJoint",
     "line": "app.getLegHipJoint()",
     "action": {
      "sdk": {
       "fn": "getLegHipJoint",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "LegKneeJoint",
     "line": "app.getLegKneeJoint()",
     "action": {
      "sdk": {
       "fn": "getLegKneeJoint",
       "args": []
      }
     }
    },
    {
     "group": "Read",
     "label": "checkConnection",
     "line": "app.checkConnection()",
     "action": {
      "sdk": {
       "fn": "checkConnection",
       "args": []
      }
     }
    }
   ],
   "telemetry": {
    "ctrl_mode": 1,
    "position": [
     0,
     0,
     0.3
    ],
    "body_velocity": [
     0,
     0,
     0
    ],
    "battery": 86,
    "move": [
     0,
     0,
     0
    ],
    "two_leg": false,
    "sdk": []
   }
  },
  {
   "robot": "h2",
   "page": "indexH2.php",
   "name": "Unitree H2 Simulator",
   "title": "Unitree H2",
   "text": "Full-size 1.82 m humanoid, programmed with unitree_sdk2's high-level API",
   "category": "Real robots, real interfaces",
   "image": "img/h2.jpg",
   "interfaces": [
    {
     "key": "sdk",
     "family": "Maker SDK"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "left_hip_pitch",
     "name": "left hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_roll",
     "name": "left hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_yaw",
     "name": "left hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_knee",
     "name": "left knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_ankle_pitch",
     "name": "left ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_ankle_roll",
     "name": "left ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_pitch",
     "name": "right hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_roll",
     "name": "right hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_yaw",
     "name": "right hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_knee",
     "name": "right knee",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_ankle_pitch",
     "name": "right ankle pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_ankle_roll",
     "name": "right ankle roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "waist_yaw",
     "name": "waist yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -150,
      150
     ]
    },
    {
     "id": "waist_roll",
     "name": "waist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -150,
      150
     ]
    },
    {
     "id": "waist_pitch",
     "name": "waist pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -150,
      150
     ]
    },
    {
     "id": "left_shoulder_pitch",
     "name": "left shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_roll",
     "name": "left shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_yaw",
     "name": "left shoulder yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_elbow",
     "name": "left elbow",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_wrist_roll",
     "name": "left wrist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_wrist_pitch",
     "name": "left wrist pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_wrist_yaw",
     "name": "left wrist yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_pitch",
     "name": "right shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_roll",
     "name": "right shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_yaw",
     "name": "right shoulder yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_elbow",
     "name": "right elbow",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_wrist_roll",
     "name": "right wrist roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_wrist_pitch",
     "name": "right wrist pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_wrist_yaw",
     "name": "right wrist yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "head_yaw",
     "name": "head yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "head_pitch",
     "name": "head pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "sdk",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "FSM (SetFsmId, 7101)",
     "label": "ZeroTorque 0",
     "line": "loco.ZeroTorque();   // SetFsmId(0)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7101,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "FSM (SetFsmId, 7101)",
     "label": "Damp 1",
     "line": "loco.Damp();   // SetFsmId(1)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7101,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "FSM (SetFsmId, 7101)",
     "label": "Squat 2",
     "line": "loco.Squat();   // SetFsmId(2)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7101,
       "parameter": {
        "data": 2
       }
      }
     }
    },
    {
     "group": "FSM (SetFsmId, 7101)",
     "label": "Sit 3",
     "line": "loco.Sit();   // SetFsmId(3)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7101,
       "parameter": {
        "data": 3
       }
      }
     }
    },
    {
     "group": "FSM (SetFsmId, 7101)",
     "label": "StandUp 4",
     "line": "loco.StandUp();   // SetFsmId(4)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7101,
       "parameter": {
        "data": 4
       }
      }
     }
    },
    {
     "group": "FSM (SetFsmId, 7101)",
     "label": "Start 601",
     "line": "loco.Start();   // SetFsmId(601)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7101,
       "parameter": {
        "data": 601
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Forward 0.5 m/s, 2 s",
     "line": "loco.SetVelocity(0.5, 0, 0, 2);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0.5,
         0,
         0
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Sideways 0.3 m/s, 2 s",
     "line": "loco.SetVelocity(0, 0.3, 0, 2);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0.3,
         0
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Turn 0.6 rad/s, 2 s",
     "line": "loco.SetVelocity(0, 0, 0.6, 2);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0,
         0.6
        ],
        "duration": 2
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Stop",
     "line": "loco.SetVelocity(0, 0, 0, 1);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7105,
       "parameter": {
        "velocity": [
         0,
         0,
         0
        ],
        "duration": 1
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Speed mode 0",
     "line": "loco.SetSpeedMode(0);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7107,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Speed mode 3",
     "line": "loco.SetSpeedMode(3);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7107,
       "parameter": {
        "data": 3
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Continuous gait",
     "line": "loco.ContinuousGait(true);   // SetBalanceMode(1)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7102,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Balance stand",
     "line": "loco.BalanceStand();   // SetBalanceMode(0)",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7102,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Low stand",
     "line": "loco.LowStand();",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7104,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "High stand",
     "line": "loco.HighStand();",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7104,
       "parameter": {
        "data": 4294967295
       }
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Get FSM id",
     "line": "loco.GetFsmId(fsm_id);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7001
      }
     }
    },
    {
     "group": "Walk (601)",
     "label": "Available FSM ids",
     "line": "loco.GetAvailableFsmIds(ids, names);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7008
      }
     }
    },
    {
     "group": "Wave / shake hand (SetTaskId, 7106)",
     "label": "Wave hand",
     "line": "loco.WaveHand();",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7106,
       "parameter": {
        "data": 0
       }
      }
     }
    },
    {
     "group": "Wave / shake hand (SetTaskId, 7106)",
     "label": "Wave + turn",
     "line": "loco.WaveHand(true);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7106,
       "parameter": {
        "data": 1
       }
      }
     }
    },
    {
     "group": "Wave / shake hand (SetTaskId, 7106)",
     "label": "Shake hand",
     "line": "loco.ShakeHand(0);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7106,
       "parameter": {
        "data": 2
       }
      }
     }
    },
    {
     "group": "Wave / shake hand (SetTaskId, 7106)",
     "label": "Shake hand end",
     "line": "loco.ShakeHand(1);",
     "action": {
      "sdk": {
       "service": "sport",
       "api_id": 7106,
       "parameter": {
        "data": 3
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Two-hand kiss 11",
     "line": "arm.ExecuteAction(11);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 11
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Left kiss 12",
     "line": "arm.ExecuteAction(12);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 12
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Hands up 15",
     "line": "arm.ExecuteAction(15);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 15
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Clap 17",
     "line": "arm.ExecuteAction(17);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 17
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "High five 18",
     "line": "arm.ExecuteAction(18);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 18
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Hug 19",
     "line": "arm.ExecuteAction(19);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 19
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Arm heart 20",
     "line": "arm.ExecuteAction(20);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 20
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Right heart 21",
     "line": "arm.ExecuteAction(21);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 21
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Reject 22",
     "line": "arm.ExecuteAction(22);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 22
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Right hand up 23",
     "line": "arm.ExecuteAction(23);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 23
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "X-ray 24",
     "line": "arm.ExecuteAction(24);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 24
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Face wave 25",
     "line": "arm.ExecuteAction(25);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 25
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "High wave 26",
     "line": "arm.ExecuteAction(26);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 26
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Shake hand 27",
     "line": "arm.ExecuteAction(27);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 27
       }
      }
     }
    },
    {
     "group": "Arm actions (ExecuteAction)",
     "label": "Release 99",
     "line": "arm.ExecuteAction(99);",
     "action": {
      "sdk": {
       "service": "arm",
       "api_id": 7106,
       "parameter": {
        "action_id": 99
       }
      }
     }
    }
   ],
   "telemetry": {
    "fsm_id": 3,
    "fsm_name": "sit",
    "fsm_mode": 0,
    "posture": "chair",
    "arm_action": null,
    "velocity": [
     0,
     0,
     0
    ],
    "balance_mode": 0,
    "speed_mode": 0,
    "swing_height": 0.13,
    "stand_height": 1,
    "sdk": []
   }
  },
  {
   "robot": "boosterk1",
   "page": "indexBoosterK1.php",
   "name": "Booster K1 Simulator",
   "title": "Booster K1",
   "text": "RoboCup kid-size humanoid with the Booster SDK: modes, dances and kicks",
   "category": "Real robots, real interfaces",
   "image": "img/boosterk1.jpg",
   "interfaces": [
    {
     "key": "booster",
     "family": "Booster SDK"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "head_yaw",
     "name": "head yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "head_pitch",
     "name": "head pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -90,
      90
     ]
    },
    {
     "id": "left_shoulder_pitch",
     "name": "left shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_shoulder_roll",
     "name": "left shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_elbow_pitch",
     "name": "left elbow pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_elbow_yaw",
     "name": "left elbow yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_pitch",
     "name": "right shoulder pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_shoulder_roll",
     "name": "right shoulder roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_elbow_pitch",
     "name": "right elbow pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "right_elbow_yaw",
     "name": "right elbow yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -180,
      180
     ]
    },
    {
     "id": "left_hip_pitch",
     "name": "left hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_roll",
     "name": "left hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_hip_yaw",
     "name": "left hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_knee_pitch",
     "name": "left knee pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_crank_up",
     "name": "left crank up",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "left_crank_down",
     "name": "left crank down",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_pitch",
     "name": "right hip pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_roll",
     "name": "right hip roll",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_hip_yaw",
     "name": "right hip yaw",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_knee_pitch",
     "name": "right knee pitch",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_crank_up",
     "name": "right crank up",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    },
    {
     "id": "right_crank_down",
     "name": "right crank down",
     "type": "servo",
     "overridable": false,
     "range": [
      -160,
      160
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "booster",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Mode (ChangeMode)",
     "label": "Damping 0",
     "line": "client.ChangeMode(RobotMode::kDamping);",
     "action": {
      "booster": {
       "method": "ChangeMode",
       "args": [
        "RobotMode::kDamping"
       ]
      }
     }
    },
    {
     "group": "Mode (ChangeMode)",
     "label": "Prepare 1",
     "line": "client.ChangeMode(RobotMode::kPrepare);",
     "action": {
      "booster": {
       "method": "ChangeMode",
       "args": [
        "RobotMode::kPrepare"
       ]
      }
     }
    },
    {
     "group": "Mode (ChangeMode)",
     "label": "Walking 2",
     "line": "client.ChangeMode(RobotMode::kWalking);",
     "action": {
      "booster": {
       "method": "ChangeMode",
       "args": [
        "RobotMode::kWalking"
       ]
      }
     }
    },
    {
     "group": "Mode (ChangeMode)",
     "label": "Custom 3",
     "line": "client.ChangeMode(RobotMode::kCustom);",
     "action": {
      "booster": {
       "method": "ChangeMode",
       "args": [
        "RobotMode::kCustom"
       ]
      }
     }
    },
    {
     "group": "Mode (ChangeMode)",
     "label": "Soccer 4",
     "line": "client.ChangeMode(RobotMode::kSoccer);",
     "action": {
      "booster": {
       "method": "ChangeMode",
       "args": [
        "RobotMode::kSoccer"
       ]
      }
     }
    },
    {
     "group": "Mode (ChangeMode)",
     "label": "GetMode",
     "line": "client.GetMode(response);",
     "action": {
      "booster": {
       "method": "GetMode",
       "args": []
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Forward 0.3",
     "line": "client.Move(0.3, 0, 0);",
     "action": {
      "booster": {
       "method": "Move",
       "args": [
        0.3,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Back",
     "line": "client.Move(-0.2, 0, 0);",
     "action": {
      "booster": {
       "method": "Move",
       "args": [
        -0.2,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Left 0.2",
     "line": "client.Move(0, 0.2, 0);",
     "action": {
      "booster": {
       "method": "Move",
       "args": [
        0,
        0.2,
        0
       ]
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Turn left",
     "line": "client.Move(0, 0, 0.8);",
     "action": {
      "booster": {
       "method": "Move",
       "args": [
        0,
        0,
        0.8
       ]
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Stop",
     "line": "client.Move(0, 0, 0);",
     "action": {
      "booster": {
       "method": "Move",
       "args": [
        0,
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Whole-body gait",
     "line": "client.SwitchGait(GaitType::kWholeBodyHumanlikeGaitV2);",
     "action": {
      "booster": {
       "method": "SwitchGait",
       "args": [
        "GaitType::kWholeBodyHumanlikeGaitV2"
       ]
      }
     }
    },
    {
     "group": "Move (Walking / Soccer)",
     "label": "Half-body gait",
     "line": "client.SwitchGait(GaitType::kHalfBodyHumanlikeGaitV2);",
     "action": {
      "booster": {
       "method": "SwitchGait",
       "args": [
        "GaitType::kHalfBodyHumanlikeGaitV2"
       ]
      }
     }
    },
    {
     "group": "Head",
     "label": "Look down",
     "line": "client.RotateHead(1, 0);",
     "action": {
      "booster": {
       "method": "RotateHead",
       "args": [
        1,
        0
       ]
      }
     }
    },
    {
     "group": "Head",
     "label": "Look up",
     "line": "client.RotateHead(-0.3, 0);",
     "action": {
      "booster": {
       "method": "RotateHead",
       "args": [
        -0.3,
        0
       ]
      }
     }
    },
    {
     "group": "Head",
     "label": "Look left",
     "line": "client.RotateHead(0, 0.785);",
     "action": {
      "booster": {
       "method": "RotateHead",
       "args": [
        0,
        0.785
       ]
      }
     }
    },
    {
     "group": "Head",
     "label": "Look right",
     "line": "client.RotateHead(0, -0.785);",
     "action": {
      "booster": {
       "method": "RotateHead",
       "args": [
        0,
        -0.785
       ]
      }
     }
    },
    {
     "group": "Head",
     "label": "Straight",
     "line": "client.RotateHead(0, 0);",
     "action": {
      "booster": {
       "method": "RotateHead",
       "args": [
        0,
        0
       ]
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Wave",
     "line": "client.WaveHand(HandAction::kHandOpen);",
     "action": {
      "booster": {
       "method": "WaveHand",
       "args": [
        "HandAction::kHandOpen"
       ]
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Wave stop",
     "line": "client.WaveHand(HandAction::kHandClose);",
     "action": {
      "booster": {
       "method": "WaveHand",
       "args": [
        "HandAction::kHandClose"
       ]
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Handshake",
     "line": "client.Handshake(HandAction::kHandOpen);",
     "action": {
      "booster": {
       "method": "Handshake",
       "args": [
        "HandAction::kHandOpen"
       ]
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Handshake end",
     "line": "client.Handshake(HandAction::kHandClose);",
     "action": {
      "booster": {
       "method": "Handshake",
       "args": [
        "HandAction::kHandClose"
       ]
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Lie down",
     "line": "client.LieDown();",
     "action": {
      "booster": {
       "method": "LieDown",
       "args": []
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Get up",
     "line": "client.GetUp();",
     "action": {
      "booster": {
       "method": "GetUp",
       "args": []
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Get up (soccer)",
     "line": "client.GetUpWithMode(RobotMode::kSoccer);",
     "action": {
      "booster": {
       "method": "GetUpWithMode",
       "args": [
        "RobotMode::kSoccer"
       ]
      }
     }
    },
    {
     "group": "Hands · lie down · get up",
     "label": "Visual kick",
     "line": "client.VisualKick(true);",
     "action": {
      "booster": {
       "method": "VisualKick",
       "args": [
        true
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "New Year",
     "line": "client.Dance(DanceId::kNewYear);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kNewYear"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Nezha",
     "line": "client.Dance(DanceId::kNezha);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kNezha"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Towards Future",
     "line": "client.Dance(DanceId::kTowardsFuture);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kTowardsFuture"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Dabbing",
     "line": "client.Dance(DanceId::kDabbingGesture);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kDabbingGesture"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Ultraman",
     "line": "client.Dance(DanceId::kUltramanGesture);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kUltramanGesture"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Respect",
     "line": "client.Dance(DanceId::kRespectGesture);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kRespectGesture"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Cheering",
     "line": "client.Dance(DanceId::kCheeringGesture);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kCheeringGesture"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Lucky Cat",
     "line": "client.Dance(DanceId::kLuckyCatGesture);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kLuckyCatGesture"
       ]
      }
     }
    },
    {
     "group": "Dance (upper body)",
     "label": "Stop",
     "line": "client.Dance(DanceId::kStop);",
     "action": {
      "booster": {
       "method": "Dance",
       "args": [
        "DanceId::kStop"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Arabic dance",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kArbicDance);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kArbicDance"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Michael dance 1",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kMichaelDance1);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kMichaelDance1"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Michael dance 2",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kMichaelDance2);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kMichaelDance2"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Michael dance 3",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kMichaelDance3);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kMichaelDance3"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Boxing-style kick",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kBoxingStyleKick);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kBoxingStyleKick"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Roundhouse kick",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kRoundhouseKick);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kRoundhouseKick"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Shan He Gu Ren dance",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kShanHeGuRenDance);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kShanHeGuRenDance"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Gai Ge Chun Feng dance",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kGaiGeChunFengDance);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kGaiGeChunFengDance"
       ]
      }
     }
    },
    {
     "group": "WholeBodyDance (K1)",
     "label": "Michael dance 1 + 2",
     "line": "client.WholeBodyDance(WholeBodyDanceId::kMichaelDance1And2);",
     "action": {
      "booster": {
       "method": "WholeBodyDance",
       "args": [
        "WholeBodyDanceId::kMichaelDance1And2"
       ]
      }
     }
    }
   ],
   "telemetry": {
    "mode": 1,
    "mode_name": "Prepare",
    "posture": "stand",
    "action": null,
    "gait": 2,
    "head": {
     "pitch": 0,
     "yaw": 0
    },
    "odometer": {
     "x": 0,
     "y": 0,
     "theta": 0
    },
    "velocity": [
     0,
     0,
     0
    ],
    "booster": []
   }
  },
  {
   "robot": "tron1",
   "page": "indexTron1.php",
   "name": "LimX TRON 1 Simulator",
   "title": "LimX TRON 1",
   "text": "Biped with swappable feet: point feet, soles or wheels",
   "category": "Real robots, real interfaces",
   "image": "img/tron1.jpg",
   "interfaces": [
    {
     "key": "ws",
     "family": "WebSocket API"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "abad_L_Joint",
     "name": "abad left",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "hip_L_Joint",
     "name": "hip left",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "knee_L_Joint",
     "name": "knee left",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "abad_R_Joint",
     "name": "abad right",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "hip_R_Joint",
     "name": "hip right",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "knee_R_Joint",
     "name": "knee right",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ws",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Modes",
     "label": "Stand",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_stand_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_stand_mode",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Walk",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_walk_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_walk_mode",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Sit down",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_sitdown\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_sitdown",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Emergency stop",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_emgy_stop\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_emgy_stop",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Recover",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_recover\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_recover",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Mark time on",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_marktime_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":true}}))",
     "action": {
      "ws": {
       "title": "request_marktime_mode",
       "data": {
        "enable": true
       }
      }
     }
    },
    {
     "group": "Modes",
     "label": "Mark time off",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_marktime_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":false}}))",
     "action": {
      "ws": {
       "title": "request_marktime_mode",
       "data": {
        "enable": false
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Forward 0.5",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_twist\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"x\":0.5,\"y\":0,\"z\":0}}))",
     "action": {
      "ws": {
       "title": "request_twist",
       "data": {
        "x": 0.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Sideways 0.5",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_twist\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"x\":0,\"y\":0.5,\"z\":0}}))",
     "action": {
      "ws": {
       "title": "request_twist",
       "data": {
        "x": 0,
        "y": 0.5,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Turn 0.5",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_twist\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"x\":0,\"y\":0,\"z\":0.5}}))",
     "action": {
      "ws": {
       "title": "request_twist",
       "data": {
        "x": 0,
        "y": 0,
        "z": 0.5
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Higher",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_base_height\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"direction\":1}}))",
     "action": {
      "ws": {
       "title": "request_base_height",
       "data": {
        "direction": 1
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Lower",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_base_height\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"direction\":-1}}))",
     "action": {
      "ws": {
       "title": "request_base_height",
       "data": {
        "direction": -1
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Static blue",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_light_effect\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"effect\":3}}))",
     "action": {
      "ws": {
       "title": "request_light_effect",
       "data": {
        "effect": 3
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Fast flash red",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_light_effect\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"effect\":15}}))",
     "action": {
      "ws": {
       "title": "request_light_effect",
       "data": {
        "effect": 15
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Static green",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_light_effect\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"effect\":2}}))",
     "action": {
      "ws": {
       "title": "request_light_effect",
       "data": {
        "effect": 2
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "IMU on",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_enable_imu\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":true}}))",
     "action": {
      "ws": {
       "title": "request_enable_imu",
       "data": {
        "enable": true
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Odometry on",
     "line": "ws.send(json.dumps({\"accid\": \"PF_TRON1A_042\", \"title\": \"request_enable_odom\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":true}}))",
     "action": {
      "ws": {
       "title": "request_enable_odom",
       "data": {
        "enable": true
       }
      }
     }
    }
   ],
   "telemetry": {
    "variant": "point",
    "robot_info": {
     "accid": "PF_TRON1A_042",
     "sw_version": "(simulated)",
     "imu": "OK",
     "camera": "NONE",
     "motor": "OK",
     "battery": 87.0,
     "status": "WALK"
    },
    "stair": false,
    "marktime": true,
    "baseHeightOffset": 0,
    "blocked": "",
    "notify": [],
    "ws": []
   }
  },
  {
   "robot": "tron1w",
   "page": "indexTron1.php?variant=wheel",
   "name": "LimX TRON 1 Simulator",
   "title": "LimX TRON 1",
   "text": "Biped with swappable feet: point feet, soles or wheels",
   "category": "Real robots, real interfaces",
   "image": "img/tron1w.jpg",
   "interfaces": [
    {
     "key": "ws",
     "family": "WebSocket API"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "abad_L_Joint",
     "name": "abad left",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "hip_L_Joint",
     "name": "hip left",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "knee_L_Joint",
     "name": "knee left",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "abad_R_Joint",
     "name": "abad right",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "hip_R_Joint",
     "name": "hip right",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "knee_R_Joint",
     "name": "knee right",
     "type": "servo",
     "overridable": false,
     "range": [
      -80,
      80
     ]
    },
    {
     "id": "wheel_L_Joint",
     "name": "wheel left",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "wheel_R_Joint",
     "name": "wheel right",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ws",
    "fell"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Modes",
     "label": "Stand",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_stand_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_stand_mode",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Walk",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_walk_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_walk_mode",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Sit down",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_sitdown\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_sitdown",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Emergency stop",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_emgy_stop\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_emgy_stop",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Recover",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_recover\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {}}))",
     "action": {
      "ws": {
       "title": "request_recover",
       "data": {}
      }
     }
    },
    {
     "group": "Modes",
     "label": "Stair mode on",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_stair_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":true}}))",
     "action": {
      "ws": {
       "title": "request_stair_mode",
       "data": {
        "enable": true
       }
      }
     }
    },
    {
     "group": "Modes",
     "label": "Stair mode off",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_stair_mode\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":false}}))",
     "action": {
      "ws": {
       "title": "request_stair_mode",
       "data": {
        "enable": false
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Forward 0.5",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_twist\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"x\":0.5,\"y\":0,\"z\":0}}))",
     "action": {
      "ws": {
       "title": "request_twist",
       "data": {
        "x": 0.5,
        "y": 0,
        "z": 0
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Turn 0.5",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_twist\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"x\":0,\"y\":0,\"z\":0.5}}))",
     "action": {
      "ws": {
       "title": "request_twist",
       "data": {
        "x": 0,
        "y": 0,
        "z": 0.5
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Higher",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_base_height\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"direction\":1}}))",
     "action": {
      "ws": {
       "title": "request_base_height",
       "data": {
        "direction": 1
       }
      }
     }
    },
    {
     "group": "Move (request_twist, ratios −1 … 1, 30 Hz)",
     "label": "Lower",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_base_height\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"direction\":-1}}))",
     "action": {
      "ws": {
       "title": "request_base_height",
       "data": {
        "direction": -1
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Static blue",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_light_effect\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"effect\":3}}))",
     "action": {
      "ws": {
       "title": "request_light_effect",
       "data": {
        "effect": 3
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Fast flash red",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_light_effect\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"effect\":15}}))",
     "action": {
      "ws": {
       "title": "request_light_effect",
       "data": {
        "effect": 15
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Static green",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_light_effect\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"effect\":2}}))",
     "action": {
      "ws": {
       "title": "request_light_effect",
       "data": {
        "effect": 2
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "IMU on",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_enable_imu\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":true}}))",
     "action": {
      "ws": {
       "title": "request_enable_imu",
       "data": {
        "enable": true
       }
      }
     }
    },
    {
     "group": "Lights · data",
     "label": "Odometry on",
     "line": "ws.send(json.dumps({\"accid\": \"WF_TRON1A_042\", \"title\": \"request_enable_odom\", \"timestamp\": ms(), \"guid\": uuid(), \"data\": {\"enable\":true}}))",
     "action": {
      "ws": {
       "title": "request_enable_odom",
       "data": {
        "enable": true
       }
      }
     }
    }
   ],
   "telemetry": {
    "variant": "wheel",
    "robot_info": {
     "accid": "WF_TRON1A_042",
     "sw_version": "(simulated)",
     "imu": "OK",
     "camera": "NONE",
     "motor": "OK",
     "battery": 87.0,
     "status": "WALK"
    },
    "stair": false,
    "marktime": false,
    "baseHeightOffset": 0,
    "blocked": "",
    "notify": [],
    "ws": []
   }
  },
  {
   "robot": "panther",
   "page": "indexPanther.php",
   "name": "Husarion Panther Simulator",
   "title": "Husarion Panther",
   "text": "55 kg outdoor UGV: off-road or mecanum wheels, LED bumper lights, ROS 2",
   "category": "Real robots, real interfaces",
   "image": "img/panther.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Wheel FL",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Wheel FR",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Wheel RL",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Wheel RR",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /cmd_vel (TwistStamped)",
     "label": "Forward 0.5 m/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"base_link\"}, twist: {linear: {x: 0.5, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "base_link"
        },
        "twist": {
         "linear": {
          "x": 0.5,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel (TwistStamped)",
     "label": "Turn left 0.8 rad/s",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"base_link\"}, twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.8}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "base_link"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0.8
         }
        }
       }
      }
     }
    },
    {
     "group": "Drive · /cmd_vel (TwistStamped)",
     "label": "Stop",
     "line": "ros2 topic pub --once /cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"base_link\"}, twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "base_link"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "E-stop · hardware",
     "label": "E-stop trigger",
     "line": "ros2 service call /hardware/e_stop_trigger std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/hardware/e_stop_trigger",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "E-stop · hardware",
     "label": "E-stop reset",
     "line": "ros2 service call /hardware/e_stop_reset std_srvs/srv/Trigger \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/hardware/e_stop_reset",
       "type": "std_srvs/srv/Trigger",
       "msg": {}
      }
     }
    },
    {
     "group": "E-stop · hardware",
     "label": "Torque off",
     "line": "ros2 service call /hardware/motor_torque_enable std_srvs/srv/SetBool \"{data: false}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/hardware/motor_torque_enable",
       "type": "std_srvs/srv/SetBool",
       "msg": {
        "data": false
       }
      }
     }
    },
    {
     "group": "E-stop · hardware",
     "label": "Torque on",
     "line": "ros2 service call /hardware/motor_torque_enable std_srvs/srv/SetBool \"{data: true}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/hardware/motor_torque_enable",
       "type": "std_srvs/srv/SetBool",
       "msg": {
        "data": true
       }
      }
     }
    },
    {
     "group": "E-stop · hardware",
     "label": "Fan on",
     "line": "ros2 service call /hardware/fan_enable std_srvs/srv/SetBool \"{data: true}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/hardware/fan_enable",
       "type": "std_srvs/srv/SetBool",
       "msg": {
        "data": true
       }
      }
     }
    },
    {
     "group": "Lights",
     "label": "Battery state",
     "line": "ros2 service call /lights/set_animation husarion_ugv_msgs/srv/SetLEDAnimation \"{animation: {id: 8, param: \"\"}, repeating: false}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/lights/set_animation",
       "type": "husarion_ugv_msgs/srv/SetLEDAnimation",
       "msg": {
        "animation": {
         "id": 8,
         "param": ""
        },
        "repeating": false
       }
      }
     }
    },
    {
     "group": "Lights",
     "label": "Goal achieved",
     "line": "ros2 service call /lights/set_animation husarion_ugv_msgs/srv/SetLEDAnimation \"{animation: {id: 5, param: \"\"}, repeating: false}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/lights/set_animation",
       "type": "husarion_ugv_msgs/srv/SetLEDAnimation",
       "msg": {
        "animation": {
         "id": 5,
         "param": ""
        },
        "repeating": false
       }
      }
     }
    },
    {
     "group": "Lights",
     "label": "Autonomous",
     "line": "ros2 service call /lights/set_animation husarion_ugv_msgs/srv/SetLEDAnimation \"{animation: {id: 4, param: \"\"}, repeating: true}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/lights/set_animation",
       "type": "husarion_ugv_msgs/srv/SetLEDAnimation",
       "msg": {
        "animation": {
         "id": 4,
         "param": ""
        },
        "repeating": true
       }
      }
     }
    },
    {
     "group": "Lights",
     "label": "Ready",
     "line": "ros2 service call /lights/set_animation husarion_ugv_msgs/srv/SetLEDAnimation \"{animation: {id: 1, param: \"\"}, repeating: true}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/lights/set_animation",
       "type": "husarion_ugv_msgs/srv/SetLEDAnimation",
       "msg": {
        "animation": {
         "id": 1,
         "param": ""
        },
        "repeating": true
       }
      }
     }
    },
    {
     "group": "Lights",
     "label": "Brightness 30 %",
     "line": "ros2 service call /lights/set_brightness husarion_ugv_msgs/srv/SetLEDBrightness \"{data: 0.3}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/lights/set_brightness",
       "type": "husarion_ugv_msgs/srv/SetLEDBrightness",
       "msg": {
        "data": 0.3
       }
      }
     }
    },
    {
     "group": "Localization",
     "label": "Reset EKF",
     "line": "ros2 service call /localization/reset std_srvs/srv/Empty \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/localization/reset",
       "type": "std_srvs/srv/Empty",
       "msg": {}
      }
     }
    }
   ],
   "telemetry": {
    "variant": "offroad",
    "topics": {
     "/odometry/wheels": {
      "header": "{…}",
      "child_frame_id": "base_link",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/odometry/filtered": {
      "header": "{…}",
      "child_frame_id": "base_link",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/battery/battery_status": {
      "header": "{…}",
      "voltage": 40.73,
      "temperature": 26,
      "current": -1.2,
      "percentage": 0.92,
      "power_supply_status": 2,
      "power_supply_health": 1,
      "power_supply_technology": 2,
      "present": true
     },
     "/hardware/e_stop": {
      "data": false
     },
     "/joint_states": {
      "header": "{…}",
      "name": [
       "fl_wheel_joint",
       "fr_wheel_joint",
       "rl_wheel_joint",
       "rr_wheel_joint"
      ],
      "position": [
       0,
       0,
       0,
       0
      ],
      "velocity": [
       0,
       0,
       0,
       0
      ],
      "effort": [
       0,
       0,
       0,
       0
      ]
     },
     "/scan": {
      "header": "{…}",
      "angle_min": -3.142,
      "angle_max": 3.142,
      "angle_increment": 0.017,
      "scan_time": 0.1,
      "range_min": 0.3,
      "range_max": 40,
      "ranges": [
       null,
       null,
       null,
       10.566,
       "…"
      ]
     }
    },
    "estop": false,
    "lights": "READY",
    "lidar": true,
    "ros": []
   }
  },
  {
   "robot": "summitxl",
   "page": "indexSummitXL.php",
   "name": "Robotnik SUMMIT-XL Simulator",
   "title": "Robotnik SUMMIT-XL",
   "text": "Indoor / outdoor research robot: skid or mecanum, laser and PTZ camera, ROS 2",
   "category": "Real robots, real interfaces",
   "image": "img/summitxl.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "Wheel FL",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "Wheel FR",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "Wheel RL",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "Wheel RR",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Drive · /robot/cmd_vel",
     "label": "Forward 0.6 m/s",
     "line": "ros2 topic pub --once /robot/cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0.6, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0.6,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /robot/cmd_vel",
     "label": "Turn left 1 rad/s",
     "line": "ros2 topic pub --once /robot/cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 1
        }
       }
      }
     }
    },
    {
     "group": "Drive · /robot/cmd_vel",
     "label": "Stop",
     "line": "ros2 topic pub --once /robot/cmd_vel geometry_msgs/msg/Twist \"{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/cmd_vel",
       "type": "geometry_msgs/msg/Twist",
       "msg": {
        "linear": {
         "x": 0,
         "y": 0,
         "z": 0
        },
        "angular": {
         "x": 0,
         "y": 0,
         "z": 0
        }
       }
      }
     }
    },
    {
     "group": "Drive · /robot/cmd_vel",
     "label": "Controller (stamped) 0.4 m/s",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_link\"}, twist: {linear: {x: 0.4, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_link"
        },
        "twist": {
         "linear": {
          "x": 0.4,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Base control",
     "label": "Disable motors",
     "line": "ros2 service call /robot/robotnik_base_control/enable robotnik_msgs/srv/EnableDisable \"{value: false}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/robot/robotnik_base_control/enable",
       "type": "robotnik_msgs/srv/EnableDisable",
       "msg": {
        "value": false
       }
      }
     }
    },
    {
     "group": "Base control",
     "label": "Enable motors",
     "line": "ros2 service call /robot/robotnik_base_control/enable robotnik_msgs/srv/EnableDisable \"{value: true}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/robot/robotnik_base_control/enable",
       "type": "robotnik_msgs/srv/EnableDisable",
       "msg": {
        "value": true
       }
      }
     }
    },
    {
     "group": "Base control",
     "label": "Odometry to 0",
     "line": "ros2 service call /robot/robotnik_base_control/set_odometry robotnik_msgs/srv/SetOdometry \"{x: 0, y: 0, z: 0, orientation: 0}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/robot/robotnik_base_control/set_odometry",
       "type": "robotnik_msgs/srv/SetOdometry",
       "msg": {
        "x": 0,
        "y": 0,
        "z": 0,
        "orientation": 0
       }
      }
     }
    }
   ],
   "telemetry": {
    "variant": "rubber",
    "topics": {
     "/robot/robotnik_base_control/odom": {
      "header": "{…}",
      "child_frame_id": "robot_base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/robot/front_laser/scan": {
      "header": "{…}",
      "angle_min": -2.356,
      "angle_max": 2.356,
      "angle_increment": 0.017,
      "scan_time": 0.067,
      "range_min": 0.06,
      "range_max": 20,
      "ranges": [
       13.101,
       12.937,
       12.583,
       12.504,
       "…"
      ]
     },
     "/robot/joint_states": {
      "header": "{…}",
      "name": [
       "robot_front_left_wheel_joint",
       "robot_front_right_wheel_joint",
       "robot_back_left_wheel_joint",
       "robot_back_right_wheel_joint"
      ],
      "position": [
       0,
       0,
       0,
       0
      ],
      "velocity": [
       0,
       0,
       0,
       0
      ],
      "effort": [
       0,
       0,
       0,
       0
      ]
     },
     "/robot/battery_estimator/data": {
      "voltage": 53.36,
      "current": -2,
      "level": 92,
      "time_remaining": 552,
      "time_charging": 0,
      "is_charging": false
     },
     "/robot/robotnik_base_hw/emergency_stop": {
      "data": false
     }
    },
    "motorsEnabled": true,
    "ros": []
   }
  },
  {
   "robot": "rbkairos",
   "page": "indexRBKairos.php",
   "name": "Robotnik RB-KAIROS+ Simulator",
   "title": "Robotnik RB-KAIROS+ / RB-VOGUI+",
   "text": "Mobile manipulators: an omnidirectional base with a UR5e arm that picks blocks from a table",
   "category": "Real robots, real interfaces",
   "image": "img/rbkairos.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "front left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "front right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "back left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "back right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "shoulder_pan",
     "name": "arm shoulder pan",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "shoulder_lift",
     "name": "arm shoulder lift",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "elbow",
     "name": "arm elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "wrist_1",
     "name": "arm wrist 1",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "wrist_2",
     "name": "arm wrist 2",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "wrist_3",
     "name": "arm wrist 3",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0.3,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Sideways left 0.3",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0, y: 0.3, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0.3,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Turn left 0.6 rad/s",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.6}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0.6
         }
        }
       }
      }
     }
    },
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Stop",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Arm · FollowJointTrajectory",
     "label": "Ready (3 s)",
     "line": "ros2 action send_goal /robot/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory \"{trajectory: {joint_names: [\"robot_arm_shoulder_pan_joint\", \"robot_arm_shoulder_lift_joint\", \"robot_arm_elbow_joint\", \"robot_arm_wrist_1_joint\", \"robot_arm_wrist_2_joint\", \"robot_arm_wrist_3_joint\"], points: [{positions: [3.1416, -1.5708, 1.5708, -1.5708, -1.5708, 0], time_from_start: {sec: 3, nanosec: 0}}]}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/joint_trajectory_controller/follow_joint_trajectory",
       "type": "control_msgs/action/FollowJointTrajectory",
       "msg": {
        "trajectory": {
         "joint_names": [
          "robot_arm_shoulder_pan_joint",
          "robot_arm_shoulder_lift_joint",
          "robot_arm_elbow_joint",
          "robot_arm_wrist_1_joint",
          "robot_arm_wrist_2_joint",
          "robot_arm_wrist_3_joint"
         ],
         "points": [
          {
           "positions": [
            3.1416,
            -1.5708,
            1.5708,
            -1.5708,
            -1.5708,
            0
           ],
           "time_from_start": {
            "sec": 3,
            "nanosec": 0
           }
          }
         ]
        }
       }
      }
     }
    },
    {
     "group": "Arm · FollowJointTrajectory",
     "label": "Transport (3 s)",
     "line": "ros2 action send_goal /robot/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory \"{trajectory: {joint_names: [\"robot_arm_shoulder_pan_joint\", \"robot_arm_shoulder_lift_joint\", \"robot_arm_elbow_joint\", \"robot_arm_wrist_1_joint\", \"robot_arm_wrist_2_joint\", \"robot_arm_wrist_3_joint\"], points: [{positions: [3.1416, -2.618, 2.4435, -1.3963, -1.5708, 0], time_from_start: {sec: 3, nanosec: 0}}]}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/joint_trajectory_controller/follow_joint_trajectory",
       "type": "control_msgs/action/FollowJointTrajectory",
       "msg": {
        "trajectory": {
         "joint_names": [
          "robot_arm_shoulder_pan_joint",
          "robot_arm_shoulder_lift_joint",
          "robot_arm_elbow_joint",
          "robot_arm_wrist_1_joint",
          "robot_arm_wrist_2_joint",
          "robot_arm_wrist_3_joint"
         ],
         "points": [
          {
           "positions": [
            3.1416,
            -2.618,
            2.4435,
            -1.3963,
            -1.5708,
            0
           ],
           "time_from_start": {
            "sec": 3,
            "nanosec": 0
           }
          }
         ]
        }
       }
      }
     }
    },
    {
     "group": "Arm · FollowJointTrajectory",
     "label": "Look left (3 s)",
     "line": "ros2 action send_goal /robot/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory \"{trajectory: {joint_names: [\"robot_arm_shoulder_pan_joint\", \"robot_arm_shoulder_lift_joint\", \"robot_arm_elbow_joint\", \"robot_arm_wrist_1_joint\", \"robot_arm_wrist_2_joint\", \"robot_arm_wrist_3_joint\"], points: [{positions: [4.7124, -1.5708, 1.5708, -1.5708, -1.5708, 0], time_from_start: {sec: 3, nanosec: 0}}]}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/joint_trajectory_controller/follow_joint_trajectory",
       "type": "control_msgs/action/FollowJointTrajectory",
       "msg": {
        "trajectory": {
         "joint_names": [
          "robot_arm_shoulder_pan_joint",
          "robot_arm_shoulder_lift_joint",
          "robot_arm_elbow_joint",
          "robot_arm_wrist_1_joint",
          "robot_arm_wrist_2_joint",
          "robot_arm_wrist_3_joint"
         ],
         "points": [
          {
           "positions": [
            4.7124,
            -1.5708,
            1.5708,
            -1.5708,
            -1.5708,
            0
           ],
           "time_from_start": {
            "sec": 3,
            "nanosec": 0
           }
          }
         ]
        }
       }
      }
     }
    },
    {
     "group": "Gripper · GripperCommand",
     "label": "Open",
     "line": "ros2 action send_goal /robot/robotiq_gripper_controller/gripper_cmd control_msgs/action/GripperCommand \"{command: {position: 0, max_effort: 50}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/robotiq_gripper_controller/gripper_cmd",
       "type": "control_msgs/action/GripperCommand",
       "msg": {
        "command": {
         "position": 0,
         "max_effort": 50
        }
       }
      }
     }
    },
    {
     "group": "Gripper · GripperCommand",
     "label": "Close",
     "line": "ros2 action send_goal /robot/robotiq_gripper_controller/gripper_cmd control_msgs/action/GripperCommand \"{command: {position: 0.8, max_effort: 50}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/robotiq_gripper_controller/gripper_cmd",
       "type": "control_msgs/action/GripperCommand",
       "msg": {
        "command": {
         "position": 0.8,
         "max_effort": 50
        }
       }
      }
     }
    },
    {
     "group": "Services",
     "label": "List controllers",
     "line": "ros2 service call /robot/controller_manager/list_controllers controller_manager_msgs/srv/ListControllers \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/robot/controller_manager/list_controllers",
       "type": "controller_manager_msgs/srv/ListControllers",
       "msg": {}
      }
     }
    },
    {
     "group": "More actions",
     "label": "Arm: Cartesian goal",
     "action": {
      "arm": {
       "tcp": {
        "x": 0.5,
        "y": 0.0,
        "z": 0.9,
        "yaw": 0
       }
      }
     }
    },
    {
     "group": "More actions",
     "label": "Arm: pick a block",
     "action": {
      "arm": {
       "skill": "pick"
      }
     }
    },
    {
     "group": "More actions",
     "label": "Arm: place it",
     "action": {
      "arm": {
       "skill": "place"
      }
     }
    },
    {
     "group": "More actions",
     "label": "Gripper 40 mm",
     "action": {
      "arm": {
       "grip": 40
      }
     }
    }
   ],
   "telemetry": {
    "model": "rbkairos",
    "arm_type": "ur5e",
    "topics": {
     "/robot/robotnik_base_control/odom": {
      "header": "{…}",
      "child_frame_id": "robot_base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/robot/front_laser/scan": {
      "header": "{…}",
      "angle_min": -2.1,
      "angle_max": 2.1,
      "angle_increment": 0.018,
      "scan_time": 0.08,
      "range_min": 0.1,
      "range_max": 30,
      "ranges": [
       null,
       11.061,
       null,
       11.186,
       "…"
      ]
     },
     "/robot/rear_laser/scan": {
      "header": "{…}",
      "angle_min": -2.1,
      "angle_max": 2.1,
      "angle_increment": 0.018,
      "scan_time": 0.08,
      "range_min": 0.1,
      "range_max": 30,
      "ranges": [
       6.54,
       6.531,
       6.622,
       6.608,
       "…"
      ]
     },
     "/robot/joint_states": {
      "header": "{…}",
      "name": [
       "robot_arm_shoulder_pan_joint",
       "robot_arm_shoulder_lift_joint",
       "robot_arm_elbow_joint",
       "robot_arm_wrist_1_joint",
       "…"
      ],
      "position": [
       3.142,
       -2.618,
       2.443,
       -1.396,
       "…"
      ],
      "velocity": [
       0,
       0,
       0,
       0,
       "…"
      ],
      "effort": []
     }
    },
    "arm": {
     "q": [
      180,
      -150,
      140,
      -80,
      "…"
     ],
     "tcp": {
      "x": 0.118,
      "y": 0.133,
      "z": 0.194,
      "yawDeg": -90
     },
     "grip": 85,
     "holding": null,
     "busy": false,
     "message": ""
    },
    "blocks": [
     {
      "id": 0,
      "color": "#e23b3b",
      "x": 0.68,
      "y": 0.772,
      "z": -0.2,
      "held": false
     },
     {
      "id": 1,
      "color": "#2f8cff",
      "x": 0.75,
      "y": 0.772,
      "z": -0.2,
      "held": false
     },
     {
      "id": 2,
      "color": "#13e084",
      "x": 0.68,
      "y": 0.772,
      "z": 0,
      "held": false
     },
     {
      "id": 3,
      "color": "#f2c200",
      "x": 0.75,
      "y": 0.772,
      "z": 0,
      "held": false
     },
     "…"
    ],
    "goal": null,
    "ros": []
   }
  },
  {
   "robot": "rbvogui",
   "page": "indexRBKairos.php?variant=vogui",
   "name": "Robotnik RB-VOGUI+ Simulator",
   "title": "Robotnik RB-KAIROS+ / RB-VOGUI+",
   "text": "Mobile manipulators: an omnidirectional base with a UR5e arm that picks blocks from a table",
   "category": "Real robots, real interfaces",
   "image": "img/rbvogui.jpg",
   "interfaces": [
    {
     "key": "ros",
     "family": "ROS 2"
    }
   ],
   "drive": [
    "fwd",
    "turn",
    "strafe"
   ],
   "motors": [
    {
     "id": "FL",
     "name": "front left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "FR",
     "name": "front right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RL",
     "name": "back left wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "RR",
     "name": "back right wheel",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "SFL",
     "name": "front left steering",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "SFR",
     "name": "front right steering",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "SRL",
     "name": "back left steering",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "SRR",
     "name": "back right steering",
     "type": "dc",
     "overridable": true,
     "range": [
      -1,
      1
     ]
    },
    {
     "id": "shoulder_pan",
     "name": "arm shoulder pan",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "shoulder_lift",
     "name": "arm shoulder lift",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "elbow",
     "name": "arm elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "wrist_1",
     "name": "arm wrist 1",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "wrist_2",
     "name": "arm wrist 2",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "wrist_3",
     "name": "arm wrist 3",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal",
    "ros"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask"
   ],
   "commands": [
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Forward 0.3 m/s",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0.3, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0.3,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Sideways left 0.3",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0, y: 0.3, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0.3,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Turn left 0.6 rad/s",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.6}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0.6
         }
        }
       }
      }
     }
    },
    {
     "group": "Base · cmd_vel (stops 2 s after the last message)",
     "label": "Stop",
     "line": "ros2 topic pub --once /robot/robotnik_base_control/cmd_vel geometry_msgs/msg/TwistStamped \"{header: {frame_id: \"robot_base_footprint\"}, twist: {linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}}\"",
     "action": {
      "ros": {
       "kind": "topic",
       "name": "/robot/robotnik_base_control/cmd_vel",
       "type": "geometry_msgs/msg/TwistStamped",
       "msg": {
        "header": {
         "frame_id": "robot_base_footprint"
        },
        "twist": {
         "linear": {
          "x": 0,
          "y": 0,
          "z": 0
         },
         "angular": {
          "x": 0,
          "y": 0,
          "z": 0
         }
        }
       }
      }
     }
    },
    {
     "group": "Arm · FollowJointTrajectory",
     "label": "Ready (3 s)",
     "line": "ros2 action send_goal /robot/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory \"{trajectory: {joint_names: [\"robot_arm_shoulder_pan_joint\", \"robot_arm_shoulder_lift_joint\", \"robot_arm_elbow_joint\", \"robot_arm_wrist_1_joint\", \"robot_arm_wrist_2_joint\", \"robot_arm_wrist_3_joint\"], points: [{positions: [3.1416, -1.5708, 1.5708, -1.5708, -1.5708, 0], time_from_start: {sec: 3, nanosec: 0}}]}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/joint_trajectory_controller/follow_joint_trajectory",
       "type": "control_msgs/action/FollowJointTrajectory",
       "msg": {
        "trajectory": {
         "joint_names": [
          "robot_arm_shoulder_pan_joint",
          "robot_arm_shoulder_lift_joint",
          "robot_arm_elbow_joint",
          "robot_arm_wrist_1_joint",
          "robot_arm_wrist_2_joint",
          "robot_arm_wrist_3_joint"
         ],
         "points": [
          {
           "positions": [
            3.1416,
            -1.5708,
            1.5708,
            -1.5708,
            -1.5708,
            0
           ],
           "time_from_start": {
            "sec": 3,
            "nanosec": 0
           }
          }
         ]
        }
       }
      }
     }
    },
    {
     "group": "Arm · FollowJointTrajectory",
     "label": "Transport (3 s)",
     "line": "ros2 action send_goal /robot/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory \"{trajectory: {joint_names: [\"robot_arm_shoulder_pan_joint\", \"robot_arm_shoulder_lift_joint\", \"robot_arm_elbow_joint\", \"robot_arm_wrist_1_joint\", \"robot_arm_wrist_2_joint\", \"robot_arm_wrist_3_joint\"], points: [{positions: [3.1416, -2.618, 2.4435, -1.3963, -1.5708, 0], time_from_start: {sec: 3, nanosec: 0}}]}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/joint_trajectory_controller/follow_joint_trajectory",
       "type": "control_msgs/action/FollowJointTrajectory",
       "msg": {
        "trajectory": {
         "joint_names": [
          "robot_arm_shoulder_pan_joint",
          "robot_arm_shoulder_lift_joint",
          "robot_arm_elbow_joint",
          "robot_arm_wrist_1_joint",
          "robot_arm_wrist_2_joint",
          "robot_arm_wrist_3_joint"
         ],
         "points": [
          {
           "positions": [
            3.1416,
            -2.618,
            2.4435,
            -1.3963,
            -1.5708,
            0
           ],
           "time_from_start": {
            "sec": 3,
            "nanosec": 0
           }
          }
         ]
        }
       }
      }
     }
    },
    {
     "group": "Arm · FollowJointTrajectory",
     "label": "Look left (3 s)",
     "line": "ros2 action send_goal /robot/joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory \"{trajectory: {joint_names: [\"robot_arm_shoulder_pan_joint\", \"robot_arm_shoulder_lift_joint\", \"robot_arm_elbow_joint\", \"robot_arm_wrist_1_joint\", \"robot_arm_wrist_2_joint\", \"robot_arm_wrist_3_joint\"], points: [{positions: [4.7124, -1.5708, 1.5708, -1.5708, -1.5708, 0], time_from_start: {sec: 3, nanosec: 0}}]}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/joint_trajectory_controller/follow_joint_trajectory",
       "type": "control_msgs/action/FollowJointTrajectory",
       "msg": {
        "trajectory": {
         "joint_names": [
          "robot_arm_shoulder_pan_joint",
          "robot_arm_shoulder_lift_joint",
          "robot_arm_elbow_joint",
          "robot_arm_wrist_1_joint",
          "robot_arm_wrist_2_joint",
          "robot_arm_wrist_3_joint"
         ],
         "points": [
          {
           "positions": [
            4.7124,
            -1.5708,
            1.5708,
            -1.5708,
            -1.5708,
            0
           ],
           "time_from_start": {
            "sec": 3,
            "nanosec": 0
           }
          }
         ]
        }
       }
      }
     }
    },
    {
     "group": "Gripper · GripperCommand",
     "label": "Open",
     "line": "ros2 action send_goal /robot/robotiq_gripper_controller/gripper_cmd control_msgs/action/GripperCommand \"{command: {position: 0, max_effort: 50}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/robotiq_gripper_controller/gripper_cmd",
       "type": "control_msgs/action/GripperCommand",
       "msg": {
        "command": {
         "position": 0,
         "max_effort": 50
        }
       }
      }
     }
    },
    {
     "group": "Gripper · GripperCommand",
     "label": "Close",
     "line": "ros2 action send_goal /robot/robotiq_gripper_controller/gripper_cmd control_msgs/action/GripperCommand \"{command: {position: 0.8, max_effort: 50}}\"",
     "action": {
      "ros": {
       "kind": "action",
       "name": "/robot/robotiq_gripper_controller/gripper_cmd",
       "type": "control_msgs/action/GripperCommand",
       "msg": {
        "command": {
         "position": 0.8,
         "max_effort": 50
        }
       }
      }
     }
    },
    {
     "group": "Services",
     "label": "List controllers",
     "line": "ros2 service call /robot/controller_manager/list_controllers controller_manager_msgs/srv/ListControllers \"{}\"",
     "action": {
      "ros": {
       "kind": "service",
       "name": "/robot/controller_manager/list_controllers",
       "type": "controller_manager_msgs/srv/ListControllers",
       "msg": {}
      }
     }
    },
    {
     "group": "More actions",
     "label": "Arm: Cartesian goal",
     "action": {
      "arm": {
       "tcp": {
        "x": 0.5,
        "y": 0.0,
        "z": 0.9,
        "yaw": 0
       }
      }
     }
    },
    {
     "group": "More actions",
     "label": "Arm: pick a block",
     "action": {
      "arm": {
       "skill": "pick"
      }
     }
    },
    {
     "group": "More actions",
     "label": "Arm: place it",
     "action": {
      "arm": {
       "skill": "place"
      }
     }
    },
    {
     "group": "More actions",
     "label": "Gripper 40 mm",
     "action": {
      "arm": {
       "grip": 40
      }
     }
    }
   ],
   "telemetry": {
    "model": "rbvogui",
    "arm_type": "ur5e",
    "topics": {
     "/robot/robotnik_base_control/odom": {
      "header": "{…}",
      "child_frame_id": "robot_base_footprint",
      "pose": "{…}",
      "twist": "{…}"
     },
     "/robot/front_laser/scan": {
      "header": "{…}",
      "angle_min": -2.1,
      "angle_max": 2.1,
      "angle_increment": 0.018,
      "scan_time": 0.08,
      "range_min": 0.1,
      "range_max": 30,
      "ranges": [
       0.595,
       6.531,
       6.547,
       7.281,
       "…"
      ]
     },
     "/robot/rear_laser/scan": {
      "header": "{…}",
      "angle_min": -2.1,
      "angle_max": 2.1,
      "angle_increment": 0.018,
      "scan_time": 0.08,
      "range_min": 0.1,
      "range_max": 30,
      "ranges": [
       9.466,
       9.469,
       9.562,
       9.575,
       "…"
      ]
     },
     "/robot/joint_states": {
      "header": "{…}",
      "name": [
       "robot_arm_shoulder_pan_joint",
       "robot_arm_shoulder_lift_joint",
       "robot_arm_elbow_joint",
       "robot_arm_wrist_1_joint",
       "…"
      ],
      "position": [
       3.142,
       -2.618,
       2.443,
       -1.396,
       "…"
      ],
      "velocity": [
       0,
       0,
       0,
       0,
       "…"
      ],
      "effort": []
     }
    },
    "arm": {
     "q": [
      180,
      -150,
      140,
      -80,
      "…"
     ],
     "tcp": {
      "x": 0.118,
      "y": 0.133,
      "z": 0.194,
      "yawDeg": -90
     },
     "grip": 85,
     "holding": null,
     "busy": false,
     "message": ""
    },
    "blocks": [
     {
      "id": 0,
      "color": "#e23b3b",
      "x": 0.68,
      "y": 0.622,
      "z": -0.2,
      "held": false
     },
     {
      "id": 1,
      "color": "#2f8cff",
      "x": 0.75,
      "y": 0.622,
      "z": -0.2,
      "held": false
     },
     {
      "id": 2,
      "color": "#13e084",
      "x": 0.68,
      "y": 0.622,
      "z": 0,
      "held": false
     },
     {
      "id": 3,
      "color": "#f2c200",
      "x": 0.75,
      "y": 0.622,
      "z": 0,
      "held": false
     },
     "…"
    ],
    "goal": null,
    "ros": []
   }
  },
  {
   "robot": "xarm6",
   "page": "indexXArm6.php",
   "name": "UFACTORY xArm 6",
   "title": "UFACTORY xArm 5 Lite / 6 / 7 / 850",
   "text": "On a table with coloured blocks: four models from 5 to 7 joints, 70 or 85 cm reach",
   "category": "Robot arms",
   "image": "img/xarm6.jpg",
   "interfaces": [],
   "drive": [],
   "motors": [
    {
     "id": "joint1",
     "name": "Base",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint2",
     "name": "Shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -118,
      120
     ]
    },
    {
     "id": "joint3",
     "name": "Elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -225,
      11
     ]
    },
    {
     "id": "joint4",
     "name": "Forearm roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint5",
     "name": "Wrist",
     "type": "servo",
     "overridable": true,
     "range": [
      -97,
      180
     ]
    },
    {
     "id": "joint6",
     "name": "Flange roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      0,
      85
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask",
    "external"
   ],
   "commands": [],
   "telemetry": {
    "tcp": {
     "x": 0.3,
     "y": 0,
     "z": 0.42,
     "yawDeg": 0
    },
    "holding": null,
    "busy": false,
    "blocks": [
     {
      "id": "red1",
      "color": "red",
      "x": -0.118,
      "y": -0.256,
      "z": 0.02,
      "yawDeg": 177.6,
      "held": false
     },
     {
      "id": "red2",
      "color": "red",
      "x": 0.289,
      "y": 0.017,
      "z": 0.02,
      "yawDeg": 72,
      "held": false
     },
     {
      "id": "green1",
      "color": "green",
      "x": -0.082,
      "y": 0.323,
      "z": 0.02,
      "yawDeg": 116.3,
      "held": false
     },
     {
      "id": "green2",
      "color": "green",
      "x": 0.37,
      "y": -0.25,
      "z": 0.02,
      "yawDeg": 81.6,
      "held": false
     },
     "…"
    ]
   }
  },
  {
   "robot": "xarm7",
   "page": "indexXArm6.php?model=7",
   "name": "UFACTORY xArm 7",
   "title": "UFACTORY xArm 5 Lite / 6 / 7 / 850",
   "text": "On a table with coloured blocks: four models from 5 to 7 joints, 70 or 85 cm reach",
   "category": "Robot arms",
   "image": "img/xarm6.jpg",
   "interfaces": [],
   "drive": [],
   "motors": [
    {
     "id": "joint1",
     "name": "Base",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint2",
     "name": "Shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -118,
      120
     ]
    },
    {
     "id": "joint3",
     "name": "Upper arm roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint4",
     "name": "Elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -11,
      225
     ]
    },
    {
     "id": "joint5",
     "name": "Forearm roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "joint6",
     "name": "Wrist",
     "type": "servo",
     "overridable": true,
     "range": [
      -97,
      180
     ]
    },
    {
     "id": "joint7",
     "name": "Flange roll",
     "type": "servo",
     "overridable": true,
     "range": [
      -360,
      360
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      0,
      85
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask",
    "external"
   ],
   "commands": [],
   "telemetry": {
    "tcp": {
     "x": 0.3,
     "y": 0,
     "z": 0.42,
     "yawDeg": 0
    },
    "holding": null,
    "busy": false,
    "blocks": [
     {
      "id": "red1",
      "color": "red",
      "x": -0.311,
      "y": -0.478,
      "z": 0.02,
      "yawDeg": 175.4,
      "held": false
     },
     {
      "id": "red2",
      "color": "red",
      "x": 0.122,
      "y": -0.451,
      "z": 0.02,
      "yawDeg": 24.7,
      "held": false
     },
     {
      "id": "green1",
      "color": "green",
      "x": -0.298,
      "y": 0.408,
      "z": 0.02,
      "yawDeg": 179.2,
      "held": false
     },
     {
      "id": "green2",
      "color": "green",
      "x": -0.415,
      "y": 0.005,
      "z": 0.02,
      "yawDeg": 175.9,
      "held": false
     },
     "…"
    ]
   }
  },
  {
   "robot": "omx",
   "page": "indexOpenManipulator.php",
   "name": "ROBOTIS OpenMANIPULATOR-X",
   "title": "OpenMANIPULATOR-X",
   "text": "The small ROBOTIS arm on a table with blocks",
   "category": "Robot arms",
   "image": "img/omx.jpg",
   "interfaces": [],
   "drive": [],
   "motors": [
    {
     "id": "joint1",
     "name": "Base",
     "type": "servo",
     "overridable": true,
     "range": [
      -162,
      162
     ]
    },
    {
     "id": "joint2",
     "name": "Shoulder",
     "type": "servo",
     "overridable": true,
     "range": [
      -103,
      90
     ]
    },
    {
     "id": "joint3",
     "name": "Elbow",
     "type": "servo",
     "overridable": true,
     "range": [
      -54,
      79
     ]
    },
    {
     "id": "joint4",
     "name": "Wrist",
     "type": "servo",
     "overridable": true,
     "range": [
      -103,
      117
     ]
    },
    {
     "id": "gripper",
     "name": "Gripper opening (mm)",
     "type": "servo",
     "overridable": true,
     "range": [
      13,
      65
     ]
    }
   ],
   "events": [
    "collision",
    "blocked",
    "stall",
    "goal"
   ],
   "skills": [],
   "views": [
    "scene",
    "robot",
    "mask",
    "external",
    "real"
   ],
   "commands": [],
   "telemetry": {
    "tcp": {
     "x": 0.15,
     "y": 0,
     "z": 0.11,
     "yawDeg": 0,
     "pitchDeg": 90
    },
    "holding": null,
    "busy": false,
    "row": {
     "source": 6,
     "standing": 0,
     "last": null,
     "slots": [
      "{…}",
      "{…}",
      "{…}",
      "{…}",
      "…"
     ]
    },
    "pos_mm": {
     "x": 138,
     "y": 0,
     "z": 89.3,
     "pitch": 90
    },
    "blocks": [
     {
      "id": "block1",
      "color": "wood",
      "x": 0.167,
      "y": 0,
      "z": 0.068,
      "yawDeg": 0,
      "held": false
     },
     {
      "id": "block2",
      "color": "wood",
      "x": 0.167,
      "y": 0,
      "z": 0.022,
      "yawDeg": 0,
      "held": false
     },
     {
      "id": "block3",
      "color": "wood",
      "x": 0.167,
      "y": 0,
      "z": 0.007,
      "yawDeg": 0,
      "held": false
     },
     {
      "id": "block4",
      "color": "wood",
      "x": 0.167,
      "y": 0,
      "z": 0.083,
      "yawDeg": 0,
      "held": false
     },
     "…"
    ]
   }
  }
 ]
}