{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ros-skill",
    "name": "ROS",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/lpigeon/ros-skill",
    "canonicalUrl": "https://clawhub.ai/lpigeon/ros-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ros-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ros-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "references/COMMANDS.md",
      "tests/test_ros_cli.py",
      "README.md",
      "examples/sensor-monitor.md",
      "examples/turtlesim.md",
      "scripts/ros_cli.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ros-skill"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ros-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/ros-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ros-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ros-skill/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "ROS Skill",
        "body": "Controls and monitors ROS/ROS2 robots via rosbridge WebSocket.\n\nArchitecture: Agent → ros_cli.py → rosbridge (WebSocket :9090) → ROS/ROS2 Robot\n\nAll commands output JSON. Errors contain {\"error\": \"...\"}.\n\nFor full command reference with arguments, options, and output examples, see references/COMMANDS.md."
      },
      {
        "title": "1. Install dependency",
        "body": "pip install websocket-client"
      },
      {
        "title": "2. Launch rosbridge on the robot",
        "body": "ROS 1:\n\nsudo apt install ros-${ROS_DISTRO}-rosbridge-server\nroslaunch rosbridge_server rosbridge_websocket.launch\n\nROS 2:\n\nsudo apt install ros-${ROS_DISTRO}-rosbridge-server\nros2 launch rosbridge_server rosbridge_websocket_launch.xml"
      },
      {
        "title": "Important: Always Connect First",
        "body": "Before any operation, test connectivity:\n\npython {baseDir}/scripts/ros_cli.py connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect"
      },
      {
        "title": "Global Options",
        "body": "FlagDefaultDescription--ip IP127.0.0.1Rosbridge IP address--port PORT9090Rosbridge port number--timeout SECONDS5.0Connection and request timeout"
      },
      {
        "title": "Command Quick Reference",
        "body": "CategoryCommandDescriptionConnectionconnectTest rosbridge connectivity (ping, port, WebSocket)ConnectionversionDetect ROS version and distroTopicstopics listList all active topics with typesTopicstopics type <topic>Get message type of a topicTopicstopics details <topic>Get topic publishers/subscribersTopicstopics message <msg_type>Get message field structureTopicstopics subscribe <topic> <msg_type>Subscribe and receive messagesTopicstopics publish <topic> <msg_type> <json>Publish a message to a topicTopicstopics publish-sequence <topic> <msg_type> <msgs> <durs>Publish message sequenceServicesservices listList all available servicesServicesservices type <service>Get service typeServicesservices details <service>Get service request/response fieldsServicesservices call <service> <type> <json>Call a serviceNodesnodes listList all active nodesNodesnodes details <node>Get node topics/servicesParamsparams list <node>List node parameters (ROS 2)Paramsparams get <node:param>Get parameter value (ROS 2)Paramsparams set <node:param> <value>Set parameter value (ROS 2)Actionsactions listList action servers (ROS 2)Actionsactions details <action>Get action goal/result/feedback fields (ROS 2)Actionsactions send <action> <type> <json>Send action goal (ROS 2)"
      },
      {
        "title": "connect",
        "body": "python {baseDir}/scripts/ros_cli.py connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect"
      },
      {
        "title": "version",
        "body": "python {baseDir}/scripts/ros_cli.py version"
      },
      {
        "title": "topics list / type / details / message",
        "body": "python {baseDir}/scripts/ros_cli.py topics list\npython {baseDir}/scripts/ros_cli.py topics type /turtle1/cmd_vel\npython {baseDir}/scripts/ros_cli.py topics details /turtle1/cmd_vel\npython {baseDir}/scripts/ros_cli.py topics message geometry_msgs/Twist"
      },
      {
        "title": "topics subscribe",
        "body": "Without --duration: returns first message. With --duration: collects multiple messages.\n\npython {baseDir}/scripts/ros_cli.py topics subscribe /turtle1/pose turtlesim/Pose\npython {baseDir}/scripts/ros_cli.py topics subscribe /odom nav_msgs/Odometry --duration 10 --max-messages 50\npython {baseDir}/scripts/ros_cli.py topics subscribe /scan sensor_msgs/LaserScan --timeout 10"
      },
      {
        "title": "topics publish",
        "body": "Without --duration: single-shot. With --duration: publishes repeatedly at --rate Hz. Use --duration for velocity commands — most robot controllers stop if they don't receive continuous cmd_vel messages.\n\n# Single-shot\npython {baseDir}/scripts/ros_cli.py topics publish /trigger std_msgs/Empty '{}'\n\n# Move forward 3 seconds (velocity — use --duration)\npython {baseDir}/scripts/ros_cli.py topics publish /cmd_vel geometry_msgs/Twist \\\n  '{\"linear\":{\"x\":1.0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}' --duration 3\n\n# Rotate left 2 seconds\npython {baseDir}/scripts/ros_cli.py topics publish /cmd_vel geometry_msgs/Twist \\\n  '{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0.5}}' --duration 2\n\n# Stop\npython {baseDir}/scripts/ros_cli.py topics publish /cmd_vel geometry_msgs/Twist \\\n  '{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}'\n\nOptions: --duration SECONDS, --rate HZ (default 10)"
      },
      {
        "title": "topics publish-sequence",
        "body": "Publish a sequence of messages, each repeated at --rate Hz for its corresponding duration. Arrays must have the same length.\n\n# Forward 3s then stop\npython {baseDir}/scripts/ros_cli.py topics publish-sequence /cmd_vel geometry_msgs/Twist \\\n  '[{\"linear\":{\"x\":1.0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}},{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}]' \\\n  '[3.0, 0.5]'\n\n# Draw a square (turtlesim)\npython {baseDir}/scripts/ros_cli.py topics publish-sequence /turtle1/cmd_vel geometry_msgs/Twist \\\n  '[{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":0},\"angular\":{\"z\":0}}]' \\\n  '[1,1,1,1,1,1,1,1,0.5]'\n\nOptions: --rate HZ (default 10)"
      },
      {
        "title": "services list / type / details",
        "body": "python {baseDir}/scripts/ros_cli.py services list\npython {baseDir}/scripts/ros_cli.py services type /spawn\npython {baseDir}/scripts/ros_cli.py services details /spawn"
      },
      {
        "title": "services call",
        "body": "python {baseDir}/scripts/ros_cli.py services call /reset std_srvs/Empty '{}'\npython {baseDir}/scripts/ros_cli.py services call /spawn turtlesim/Spawn \\\n  '{\"x\":3.0,\"y\":3.0,\"theta\":0.0,\"name\":\"turtle2\"}'\npython {baseDir}/scripts/ros_cli.py services call /turtle1/set_pen turtlesim/srv/SetPen \\\n  '{\"r\":255,\"g\":0,\"b\":0,\"width\":3,\"off\":0}'"
      },
      {
        "title": "nodes list / details",
        "body": "python {baseDir}/scripts/ros_cli.py nodes list\npython {baseDir}/scripts/ros_cli.py nodes details /turtlesim"
      },
      {
        "title": "params list / get / set (ROS 2 only)",
        "body": "Uses node:param_name format from params list output.\n\npython {baseDir}/scripts/ros_cli.py params list /turtlesim\npython {baseDir}/scripts/ros_cli.py params get /turtlesim:background_r\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_r 255"
      },
      {
        "title": "actions list / details / send (ROS 2 only)",
        "body": "python {baseDir}/scripts/ros_cli.py actions list\npython {baseDir}/scripts/ros_cli.py actions details /turtle1/rotate_absolute\npython {baseDir}/scripts/ros_cli.py actions send /turtle1/rotate_absolute \\\n  turtlesim/action/RotateAbsolute '{\"theta\":3.14}'"
      },
      {
        "title": "1. Explore a Robot System",
        "body": "python {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> version\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> topics list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> nodes list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> services list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> topics type /cmd_vel\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> topics message geometry_msgs/Twist\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> actions list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> params list /robot_node"
      },
      {
        "title": "2. Move a Robot",
        "body": "Always check the message structure first, then publish movement, and always stop after.\n\npython {baseDir}/scripts/ros_cli.py topics message geometry_msgs/Twist\npython {baseDir}/scripts/ros_cli.py topics publish-sequence /cmd_vel geometry_msgs/Twist \\\n  '[{\"linear\":{\"x\":1.0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}},{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}]' \\\n  '[2.0, 0.5]'"
      },
      {
        "title": "3. Read Sensor Data",
        "body": "python {baseDir}/scripts/ros_cli.py topics type /scan\npython {baseDir}/scripts/ros_cli.py topics message sensor_msgs/LaserScan\npython {baseDir}/scripts/ros_cli.py topics subscribe /scan sensor_msgs/LaserScan --timeout 3\npython {baseDir}/scripts/ros_cli.py topics subscribe /odom nav_msgs/Odometry --duration 10 --max-messages 50"
      },
      {
        "title": "4. Use Services",
        "body": "python {baseDir}/scripts/ros_cli.py services list\npython {baseDir}/scripts/ros_cli.py services details /spawn\npython {baseDir}/scripts/ros_cli.py services call /spawn turtlesim/Spawn \\\n  '{\"x\":3.0,\"y\":3.0,\"theta\":0.0,\"name\":\"turtle2\"}'"
      },
      {
        "title": "5. ROS 2 Actions",
        "body": "python {baseDir}/scripts/ros_cli.py actions list\npython {baseDir}/scripts/ros_cli.py actions details /turtle1/rotate_absolute\npython {baseDir}/scripts/ros_cli.py actions send /turtle1/rotate_absolute \\\n  turtlesim/action/RotateAbsolute '{\"theta\":1.57}'"
      },
      {
        "title": "6. Change Parameters (ROS 2)",
        "body": "python {baseDir}/scripts/ros_cli.py params list /turtlesim\npython {baseDir}/scripts/ros_cli.py params get /turtlesim:background_r\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_r 255\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_g 0\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_b 0"
      },
      {
        "title": "Safety Notes",
        "body": "Destructive commands (can move the robot or change state):\n\ntopics publish / topics publish-sequence — sends movement or control commands\nservices call — can reset, spawn, kill, or change robot state\nparams set — modifies runtime parameters\nactions send — triggers robot actions (rotation, navigation, etc.)\n\nAlways stop the robot after movement. The last message in any publish-sequence should be all zeros:\n\n{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}\n\nAlways check JSON output for errors before proceeding."
      },
      {
        "title": "Troubleshooting",
        "body": "ProblemCauseSolutionConnection refusedrosbridge not runningStart rosbridge: ros2 launch rosbridge_server rosbridge_websocket_launch.xmlTimeout errorsSlow network or large dataIncrease timeout: --timeout 10 or --timeout 30No topics foundROS nodes not runningEnsure nodes are launched and workspace is sourcedEmpty topic listrosapi not availableVerify rosbridge includes rosapi (default in standard install)Parameter commands failUsing ROS 1params commands only work with ROS 2Action commands failUsing ROS 1actions commands only work with ROS 2Invalid JSON errorMalformed messageValidate JSON before passing (watch for single vs double quotes)Subscribe timeoutNo publisher on topicCheck topics details to verify publishers existpublish-sequence length errorArray mismatchmessages and durations arrays must have the same length"
      }
    ],
    "body": "ROS Skill\n\nControls and monitors ROS/ROS2 robots via rosbridge WebSocket.\n\nArchitecture: Agent → ros_cli.py → rosbridge (WebSocket :9090) → ROS/ROS2 Robot\n\nAll commands output JSON. Errors contain {\"error\": \"...\"}.\n\nFor full command reference with arguments, options, and output examples, see references/COMMANDS.md.\n\nSetup\n1. Install dependency\npip install websocket-client\n\n2. Launch rosbridge on the robot\n\nROS 1:\n\nsudo apt install ros-${ROS_DISTRO}-rosbridge-server\nroslaunch rosbridge_server rosbridge_websocket.launch\n\n\nROS 2:\n\nsudo apt install ros-${ROS_DISTRO}-rosbridge-server\nros2 launch rosbridge_server rosbridge_websocket_launch.xml\n\nImportant: Always Connect First\n\nBefore any operation, test connectivity:\n\npython {baseDir}/scripts/ros_cli.py connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect\n\nGlobal Options\nFlag\tDefault\tDescription\n--ip IP\t127.0.0.1\tRosbridge IP address\n--port PORT\t9090\tRosbridge port number\n--timeout SECONDS\t5.0\tConnection and request timeout\nCommand Quick Reference\nCategory\tCommand\tDescription\nConnection\tconnect\tTest rosbridge connectivity (ping, port, WebSocket)\nConnection\tversion\tDetect ROS version and distro\nTopics\ttopics list\tList all active topics with types\nTopics\ttopics type <topic>\tGet message type of a topic\nTopics\ttopics details <topic>\tGet topic publishers/subscribers\nTopics\ttopics message <msg_type>\tGet message field structure\nTopics\ttopics subscribe <topic> <msg_type>\tSubscribe and receive messages\nTopics\ttopics publish <topic> <msg_type> <json>\tPublish a message to a topic\nTopics\ttopics publish-sequence <topic> <msg_type> <msgs> <durs>\tPublish message sequence\nServices\tservices list\tList all available services\nServices\tservices type <service>\tGet service type\nServices\tservices details <service>\tGet service request/response fields\nServices\tservices call <service> <type> <json>\tCall a service\nNodes\tnodes list\tList all active nodes\nNodes\tnodes details <node>\tGet node topics/services\nParams\tparams list <node>\tList node parameters (ROS 2)\nParams\tparams get <node:param>\tGet parameter value (ROS 2)\nParams\tparams set <node:param> <value>\tSet parameter value (ROS 2)\nActions\tactions list\tList action servers (ROS 2)\nActions\tactions details <action>\tGet action goal/result/feedback fields (ROS 2)\nActions\tactions send <action> <type> <json>\tSend action goal (ROS 2)\nKey Commands\nconnect\npython {baseDir}/scripts/ros_cli.py connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect\n\nversion\npython {baseDir}/scripts/ros_cli.py version\n\ntopics list / type / details / message\npython {baseDir}/scripts/ros_cli.py topics list\npython {baseDir}/scripts/ros_cli.py topics type /turtle1/cmd_vel\npython {baseDir}/scripts/ros_cli.py topics details /turtle1/cmd_vel\npython {baseDir}/scripts/ros_cli.py topics message geometry_msgs/Twist\n\ntopics subscribe\n\nWithout --duration: returns first message. With --duration: collects multiple messages.\n\npython {baseDir}/scripts/ros_cli.py topics subscribe /turtle1/pose turtlesim/Pose\npython {baseDir}/scripts/ros_cli.py topics subscribe /odom nav_msgs/Odometry --duration 10 --max-messages 50\npython {baseDir}/scripts/ros_cli.py topics subscribe /scan sensor_msgs/LaserScan --timeout 10\n\ntopics publish\n\nWithout --duration: single-shot. With --duration: publishes repeatedly at --rate Hz. Use --duration for velocity commands — most robot controllers stop if they don't receive continuous cmd_vel messages.\n\n# Single-shot\npython {baseDir}/scripts/ros_cli.py topics publish /trigger std_msgs/Empty '{}'\n\n# Move forward 3 seconds (velocity — use --duration)\npython {baseDir}/scripts/ros_cli.py topics publish /cmd_vel geometry_msgs/Twist \\\n  '{\"linear\":{\"x\":1.0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}' --duration 3\n\n# Rotate left 2 seconds\npython {baseDir}/scripts/ros_cli.py topics publish /cmd_vel geometry_msgs/Twist \\\n  '{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0.5}}' --duration 2\n\n# Stop\npython {baseDir}/scripts/ros_cli.py topics publish /cmd_vel geometry_msgs/Twist \\\n  '{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}'\n\n\nOptions: --duration SECONDS, --rate HZ (default 10)\n\ntopics publish-sequence\n\nPublish a sequence of messages, each repeated at --rate Hz for its corresponding duration. Arrays must have the same length.\n\n# Forward 3s then stop\npython {baseDir}/scripts/ros_cli.py topics publish-sequence /cmd_vel geometry_msgs/Twist \\\n  '[{\"linear\":{\"x\":1.0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}},{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}]' \\\n  '[3.0, 0.5]'\n\n# Draw a square (turtlesim)\npython {baseDir}/scripts/ros_cli.py topics publish-sequence /turtle1/cmd_vel geometry_msgs/Twist \\\n  '[{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":2},\"angular\":{\"z\":0}},{\"linear\":{\"x\":0},\"angular\":{\"z\":1.5708}},{\"linear\":{\"x\":0},\"angular\":{\"z\":0}}]' \\\n  '[1,1,1,1,1,1,1,1,0.5]'\n\n\nOptions: --rate HZ (default 10)\n\nservices list / type / details\npython {baseDir}/scripts/ros_cli.py services list\npython {baseDir}/scripts/ros_cli.py services type /spawn\npython {baseDir}/scripts/ros_cli.py services details /spawn\n\nservices call\npython {baseDir}/scripts/ros_cli.py services call /reset std_srvs/Empty '{}'\npython {baseDir}/scripts/ros_cli.py services call /spawn turtlesim/Spawn \\\n  '{\"x\":3.0,\"y\":3.0,\"theta\":0.0,\"name\":\"turtle2\"}'\npython {baseDir}/scripts/ros_cli.py services call /turtle1/set_pen turtlesim/srv/SetPen \\\n  '{\"r\":255,\"g\":0,\"b\":0,\"width\":3,\"off\":0}'\n\nnodes list / details\npython {baseDir}/scripts/ros_cli.py nodes list\npython {baseDir}/scripts/ros_cli.py nodes details /turtlesim\n\nparams list / get / set (ROS 2 only)\n\nUses node:param_name format from params list output.\n\npython {baseDir}/scripts/ros_cli.py params list /turtlesim\npython {baseDir}/scripts/ros_cli.py params get /turtlesim:background_r\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_r 255\n\nactions list / details / send (ROS 2 only)\npython {baseDir}/scripts/ros_cli.py actions list\npython {baseDir}/scripts/ros_cli.py actions details /turtle1/rotate_absolute\npython {baseDir}/scripts/ros_cli.py actions send /turtle1/rotate_absolute \\\n  turtlesim/action/RotateAbsolute '{\"theta\":3.14}'\n\nWorkflow Examples\n1. Explore a Robot System\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> version\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> topics list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> nodes list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> services list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> topics type /cmd_vel\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> topics message geometry_msgs/Twist\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> actions list\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> params list /robot_node\n\n2. Move a Robot\n\nAlways check the message structure first, then publish movement, and always stop after.\n\npython {baseDir}/scripts/ros_cli.py topics message geometry_msgs/Twist\npython {baseDir}/scripts/ros_cli.py topics publish-sequence /cmd_vel geometry_msgs/Twist \\\n  '[{\"linear\":{\"x\":1.0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}},{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}]' \\\n  '[2.0, 0.5]'\n\n3. Read Sensor Data\npython {baseDir}/scripts/ros_cli.py topics type /scan\npython {baseDir}/scripts/ros_cli.py topics message sensor_msgs/LaserScan\npython {baseDir}/scripts/ros_cli.py topics subscribe /scan sensor_msgs/LaserScan --timeout 3\npython {baseDir}/scripts/ros_cli.py topics subscribe /odom nav_msgs/Odometry --duration 10 --max-messages 50\n\n4. Use Services\npython {baseDir}/scripts/ros_cli.py services list\npython {baseDir}/scripts/ros_cli.py services details /spawn\npython {baseDir}/scripts/ros_cli.py services call /spawn turtlesim/Spawn \\\n  '{\"x\":3.0,\"y\":3.0,\"theta\":0.0,\"name\":\"turtle2\"}'\n\n5. ROS 2 Actions\npython {baseDir}/scripts/ros_cli.py actions list\npython {baseDir}/scripts/ros_cli.py actions details /turtle1/rotate_absolute\npython {baseDir}/scripts/ros_cli.py actions send /turtle1/rotate_absolute \\\n  turtlesim/action/RotateAbsolute '{\"theta\":1.57}'\n\n6. Change Parameters (ROS 2)\npython {baseDir}/scripts/ros_cli.py params list /turtlesim\npython {baseDir}/scripts/ros_cli.py params get /turtlesim:background_r\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_r 255\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_g 0\npython {baseDir}/scripts/ros_cli.py params set /turtlesim:background_b 0\n\nSafety Notes\n\nDestructive commands (can move the robot or change state):\n\ntopics publish / topics publish-sequence — sends movement or control commands\nservices call — can reset, spawn, kill, or change robot state\nparams set — modifies runtime parameters\nactions send — triggers robot actions (rotation, navigation, etc.)\n\nAlways stop the robot after movement. The last message in any publish-sequence should be all zeros:\n\n{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}\n\n\nAlways check JSON output for errors before proceeding.\n\nTroubleshooting\nProblem\tCause\tSolution\nConnection refused\trosbridge not running\tStart rosbridge: ros2 launch rosbridge_server rosbridge_websocket_launch.xml\nTimeout errors\tSlow network or large data\tIncrease timeout: --timeout 10 or --timeout 30\nNo topics found\tROS nodes not running\tEnsure nodes are launched and workspace is sourced\nEmpty topic list\trosapi not available\tVerify rosbridge includes rosapi (default in standard install)\nParameter commands fail\tUsing ROS 1\tparams commands only work with ROS 2\nAction commands fail\tUsing ROS 1\tactions commands only work with ROS 2\nInvalid JSON error\tMalformed message\tValidate JSON before passing (watch for single vs double quotes)\nSubscribe timeout\tNo publisher on topic\tCheck topics details to verify publishers exist\npublish-sequence length error\tArray mismatch\tmessages and durations arrays must have the same length"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/lpigeon/ros-skill",
    "publisherUrl": "https://clawhub.ai/lpigeon/ros-skill",
    "owner": "lpigeon",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ros-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/ros-skill",
    "agentUrl": "https://openagent3.xyz/skills/ros-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ros-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ros-skill/agent.md"
  }
}