{
  "_comment": "Default --ros-config for `zelpi geniesim bridge` / server/createRosDriver.mjs. Points at genie_sim's ROS 2 real-time engine topics once `zelpi geniesim up` has it running behind a rosbridge_websocket node (default port 9090). Defaults to scene_pnp_g2_op's LEFT arm (7 joints, verified against source/geniesim_benchmark's G2_crsB_omnipicker.urdf: idx21_arm_l_joint1..idx27_arm_l_joint7). jointCommandType is sensor_msgs/JointState, verified against genie_sim's own /joint_command subscriber (gripper_cmds.py/wbc_cmds.py) and its engine's apply_commands() docstring, which states targets are keyed by joint NAME, not array position — jointNames MUST be updated to match whatever scene/robot you actually launch with `zelpi geniesim up --scene <name>`; this default is only correct for scene_pnp_g2_op's left arm. See docs/EXTENDING.md 'Genie Sim' section.",
  "url": "ws://127.0.0.1:9090",
  "robotId": "genie",
  "robotKind": "genie-sim-humanoid",
  "drive": "arm",
  "dof": 7,
  "skills": ["setJoints"],
  "units": { "len": "m", "ang": "rad" },
  "frame": "odom",
  "topics": {
    "jointCommand": "/joint_command",
    "jointCommandType": "sensor_msgs/JointState",
    "jointNames": [
      "idx21_arm_l_joint1",
      "idx22_arm_l_joint2",
      "idx23_arm_l_joint3",
      "idx24_arm_l_joint4",
      "idx25_arm_l_joint5",
      "idx26_arm_l_joint6",
      "idx27_arm_l_joint7"
    ],
    "jointStates": "/joint_states",
    "odom": "/odom",
    "initialPose": "/genie/initialpose"
  },
  "skillServices": {},
  "estopService": null
}
