{"id":"9c943fd9-c280-419e-b6df-4fb0a9f3dadd","shortId":"nTE5nZ","kind":"skill","title":"ros-skill","tagline":"Controls ROS/ROS2 robots via rosbridge WebSocket CLI. Use when the user asks about ROS topics, services, nodes, parameters, actions, robot movement, sensor data, or any ROS/ROS2 robot interaction.","description":"# ROS Skill\n\nControls and monitors ROS/ROS2 robots via rosbridge WebSocket.\n\n**Architecture:** 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](references/COMMANDS.md).\n\n---\n\n## Setup\n\n### 1. Install dependency\n\n```bash\npip install websocket-client\n```\n\n### 2. Launch rosbridge on the robot\n\n**ROS 1:**\n```bash\nsudo apt install ros-${ROS_DISTRO}-rosbridge-server\nroslaunch rosbridge_server rosbridge_websocket.launch\n```\n\n**ROS 2:**\n```bash\nsudo apt install ros-${ROS_DISTRO}-rosbridge-server\nros2 launch rosbridge_server rosbridge_websocket_launch.xml\n```\n\n---\n\n## Important: Always Connect First\n\nBefore any operation, test connectivity:\n\n```bash\npython {baseDir}/scripts/ros_cli.py connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect\n```\n\n---\n\n## Global Options\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--ip IP` | `127.0.0.1` | Rosbridge IP address |\n| `--port PORT` | `9090` | Rosbridge port number |\n| `--timeout SECONDS` | `5.0` | Connection and request timeout |\n\n---\n\n## Command Quick Reference\n\n| Category | Command | Description |\n|----------|---------|-------------|\n| Connection | `connect` | Test rosbridge connectivity (ping, port, WebSocket) |\n| Connection | `version` | Detect ROS version and distro |\n| Topics | `topics list` | List all active topics with types |\n| Topics | `topics type <topic>` | Get message type of a topic |\n| Topics | `topics details <topic>` | Get topic publishers/subscribers |\n| Topics | `topics message <msg_type>` | Get message field structure |\n| Topics | `topics subscribe <topic> <msg_type>` | Subscribe and receive messages |\n| Topics | `topics publish <topic> <msg_type> <json>` | Publish a message to a topic |\n| Topics | `topics publish-sequence <topic> <msg_type> <msgs> <durs>` | Publish message sequence |\n| Services | `services list` | List all available services |\n| Services | `services type <service>` | Get service type |\n| Services | `services details <service>` | Get service request/response fields |\n| Services | `services call <service> <type> <json>` | Call a service |\n| Nodes | `nodes list` | List all active nodes |\n| Nodes | `nodes details <node>` | Get node topics/services |\n| Params | `params list <node>` | List node parameters (ROS 2) |\n| Params | `params get <node:param>` | Get parameter value (ROS 2) |\n| Params | `params set <node:param> <value>` | Set parameter value (ROS 2) |\n| Actions | `actions list` | List action servers (ROS 2) |\n| Actions | `actions details <action>` | Get action goal/result/feedback fields (ROS 2) |\n| Actions | `actions send <action> <type> <json>` | Send action goal (ROS 2) |\n\n---\n\n## Key Commands\n\n### connect\n\n```bash\npython {baseDir}/scripts/ros_cli.py connect\npython {baseDir}/scripts/ros_cli.py --ip <ROBOT_IP> connect\n```\n\n### version\n\n```bash\npython {baseDir}/scripts/ros_cli.py version\n```\n\n### topics list / type / details / message\n\n```bash\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```\n\n### topics subscribe\n\nWithout `--duration`: returns first message. With `--duration`: collects multiple messages.\n\n```bash\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```\n\n### topics 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```bash\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\n### topics 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```bash\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\n### services list / type / details\n\n```bash\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```\n\n### services call\n\n```bash\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```\n\n### nodes list / details\n\n```bash\npython {baseDir}/scripts/ros_cli.py nodes list\npython {baseDir}/scripts/ros_cli.py nodes details /turtlesim\n```\n\n### params list / get / set (ROS 2 only)\n\nUses `node:param_name` format from `params list` output.\n\n```bash\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```\n\n### actions list / details / send (ROS 2 only)\n\n```bash\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```\n\n---\n\n## Workflow Examples\n\n### 1. Explore a Robot System\n\n```bash\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```\n\n### 2. Move a Robot\n\nAlways check the message structure first, then publish movement, and always stop after.\n\n```bash\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```\n\n### 3. Read Sensor Data\n\n```bash\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```\n\n### 4. Use Services\n\n```bash\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```\n\n### 5. ROS 2 Actions\n\n```bash\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```\n\n### 6. Change Parameters (ROS 2)\n\n```bash\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```\n\n---\n\n## Safety Notes\n\n**Destructive commands** (can move the robot or change state):\n- `topics publish` / `topics publish-sequence` — sends movement or control commands\n- `services call` — can reset, spawn, kill, or change robot state\n- `params set` — modifies runtime parameters\n- `actions send` — triggers robot actions (rotation, navigation, etc.)\n\n**Always stop the robot after movement.** The last message in any `publish-sequence` should be all zeros:\n```json\n{\"linear\":{\"x\":0,\"y\":0,\"z\":0},\"angular\":{\"x\":0,\"y\":0,\"z\":0}}\n```\n\n**Always check JSON output for errors before proceeding.**\n\n---\n\n## Troubleshooting\n\n| Problem | Cause | Solution |\n|---------|-------|----------|\n| Connection refused | rosbridge not running | Start rosbridge: `ros2 launch rosbridge_server rosbridge_websocket_launch.xml` |\n| Timeout errors | Slow network or large data | Increase timeout: `--timeout 10` or `--timeout 30` |\n| No topics found | ROS nodes not running | Ensure nodes are launched and workspace is sourced |\n| Empty topic list | rosapi not available | Verify rosbridge includes rosapi (default in standard install) |\n| Parameter commands fail | Using ROS 1 | `params` commands only work with ROS 2 |\n| Action commands fail | Using ROS 1 | `actions` commands only work with ROS 2 |\n| Invalid JSON error | Malformed message | Validate JSON before passing (watch for single vs double quotes) |\n| Subscribe timeout | No publisher on topic | Check `topics details` to verify publishers exist |\n| publish-sequence length error | Array mismatch | `messages` and `durations` arrays must have the same length |","tags":["ros","skill","lpigeon","agent-skills","ros2","skills"],"capabilities":["skill","source-lpigeon","skill-ros-skill","topic-agent-skills","topic-ros","topic-ros2","topic-skills"],"categories":["ros-skill"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/lpigeon/ros-skill","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add lpigeon/ros-skill","source_repo":"https://github.com/lpigeon/ros-skill","install_from":"skills.sh"}},"qualityScore":"0.460","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 21 github stars · SKILL.md body (11,102 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T19:06:11.795Z","embedding":null,"createdAt":"2026-04-19T00:38:40.450Z","updatedAt":"2026-04-22T19:06:11.795Z","lastSeenAt":"2026-04-22T19:06:11.795Z","tsv":"'/cmd_vel':475,503,528,588,893,947 '/odom':400,1013 '/reset':733 '/robot_node':914 '/scan':414,990,1003 '/scripts/ros_cli.py':131,135,332,336,343,353,358,364,370,390,397,411,457,472,500,525,583,627,710,715,721,730,738,753,774,779,802,808,816,833,838,844,861,866,871,877,883,889,896,904,910,935,942,987,993,1000,1010,1028,1033,1039,1059,1064,1070,1085,1091,1099,1108,1117 '/spawn':718,724,741,1036,1042 '/trigger':460 '/turtle1/cmd_vel':361,367,632 '/turtle1/pose':393 '/turtle1/rotate_absolute':841,847,1067,1073 '/turtle1/set_pen':756 '/turtlesim':782,805,811,819,1088,1094,1102,1111,1120 '0':482,484,487,489,491,508,510,512,515,517,533,535,537,540,542,544,595,597,600,602,604,607,609,611,614,616,618,640,643,652,655,664,667,676,679,685,688,761,763,767,954,956,959,961,963,966,968,970,973,975,977,1114,1123,1190,1192,1194,1197,1199,1201 '0.0':748,1049 '0.5':519,620,697,979 '1':71,87,689,690,691,692,693,694,695,696,853,1274,1287 '1.0':480,593,952 '1.57':1076 '1.5708':646,658,670,682 '10':404,418,551,702,1017,1236 '127.0.0.1':145 '2':80,103,284,292,300,308,317,325,496,521,637,649,661,673,788,828,915,1054,1081,1281,1294 '2.0':978 '255':759,822,1105 '3':465,493,765,980,1007 '3.0':619,744,746,1045,1047 '3.14':850 '30':1239 '3s':578 '4':1022 '5':1052 '5.0':157 '50':408,1021 '6':1077 '9090':47,151 'action':22,301,302,305,309,310,313,318,319,322,823,834,839,845,906,1055,1060,1065,1071,1161,1165,1282,1288 'activ':188,269 'address':148 'agent':43 'alway':120,919,929,1169,1202 'angular':485,513,538,598,612,638,644,650,656,662,668,674,680,686,957,971,1195 'apt':90,106 'architectur':42 'argument':62 'array':570,1328,1333 'ask':15 'avail':243,1260 'b':762,1122 'background':812,820,1095,1103,1112,1121 'basedir':130,134,331,335,342,352,357,363,369,389,396,410,456,471,499,524,582,626,709,714,720,729,737,752,773,778,801,807,815,832,837,843,860,865,870,876,882,888,895,903,909,934,941,986,992,999,1009,1027,1032,1038,1058,1063,1069,1084,1090,1098,1107,1116 'bash':74,88,104,128,329,340,350,387,451,576,707,727,771,799,830,858,932,984,1025,1056,1082 'call':260,261,726,732,740,755,1041,1147 'categori':165 'caus':1212 'chang':1078,1133,1153 'check':920,1203,1316 'cli':10 'client':79 'cmd':448 'collect':384 'command':51,59,162,166,327,437,1127,1145,1270,1276,1283,1289 'connect':121,127,132,137,158,168,169,172,176,328,333,338,863,1214 'contain':55 'continu':447 'control':4,34,440,1144 'correspond':568 'data':26,983,1232 'default':141,550,701,1265 'depend':73 'descript':142,167 'destruct':1126 'detail':203,253,273,311,348,366,706,723,770,781,825,840,1035,1066,1318 'detect':178 'distro':94,110,182 'doubl':1308 'draw':621 'durat':378,383,403,422,427,434,469,492,520,546,569,1016,1332 'empti':1255 'ensur':1247 'error':54,56,1207,1227,1297,1327 'etc':1168 'exampl':66,852 'exist':1322 'explor':854 'fail':1271,1284 'field':212,257,315 'first':122,380,924 'flag':140 'format':794 'forward':464,577 'found':1242 'full':58 'g':760,1113 'geometri':373,476,504,529,589,633,900,938,948 'get':195,204,210,248,254,274,287,288,312,785,810,1093 'global':138 'goal':323 'goal/result/feedback':314 'hz':432,549,565,700 'import':119 'includ':1263 'increas':1233 'instal':72,76,91,107,1268 'interact':31 'invalid':1295 'ip':136,143,144,147,337,862,867,872,878,884,890,897,905,911 'json':53,1187,1204,1296,1301 'key':326 'kill':1151 'larg':1231 'last':1176 'launch':81,115,1222,1250 'left':495 'length':575,1326,1338 'linear':478,506,531,591,605,635,641,647,653,659,665,671,677,683,950,964,1188 'list':185,186,240,241,266,267,279,280,303,304,346,355,704,712,769,776,784,797,804,824,835,874,880,886,907,913,1030,1061,1087,1257 'malform':1298 'max':406,1019 'max-messag':405,1018 'messag':196,209,211,220,226,236,349,372,381,386,407,450,560,899,922,937,995,1020,1177,1299,1330 'mismatch':1329 'modifi':1158 'monitor':36 'move':463,916,1129 'movement':24,927,1142,1174 'msgs/empty':462 'msgs/laserscan':416,997,1005 'msgs/odometry':402,1015 'msgs/twist':374,477,505,530,590,634,901,939,949 'multipl':385 'must':571,1334 'name':749,793,1050 'nav':401,1014 'navig':1167 'network':1229 'node':20,264,265,270,271,272,275,281,768,775,780,791,879,1244,1248 'note':1125 'number':154 'oper':125 'option':63,139,545,698 'output':52,65,798,1205 'param':277,278,285,286,293,294,783,792,796,803,809,817,912,1086,1092,1100,1109,1118,1156,1275 'paramet':21,282,289,297,1079,1160,1269 'pass':1303 'ping':173 'pip':75 'port':149,150,153,174 'problem':1211 'proceed':1209 'publish':223,224,233,235,420,428,459,474,502,527,554,556,586,630,926,945,1136,1139,1181,1313,1321,1324 'publish-sequ':232,553,585,629,944,1138,1180,1323 'publishers/subscribers':206 'python':129,133,330,334,341,351,356,362,368,388,395,409,455,470,498,523,581,625,708,713,719,728,736,751,772,777,800,806,814,831,836,842,859,864,869,875,881,887,894,902,908,933,940,985,991,998,1008,1026,1031,1037,1057,1062,1068,1083,1089,1097,1106,1115 'quick':163 'quot':1309 'r':758,813,821,1096,1104 'rate':431,548,564,699 'read':981 'receiv':219,446 'refer':60,164 'references/commands.md':68,69 'refus':1215 'repeat':429,562 'request':160 'request/response':256 'reset':1149 'return':379 'robot':6,23,30,38,49,85,439,856,918,1131,1154,1164,1172 'ros':2,17,32,86,92,93,102,108,109,179,283,291,299,307,316,324,787,827,1053,1080,1243,1273,1280,1286,1293 'ros-skil':1 'ros/ros2':5,29,37,48 'ros2':114,1221 'ros_cli.py':44 'rosapi':1258,1264 'rosbridg':8,40,45,82,96,99,112,116,146,152,171,1216,1220,1223,1262 'rosbridge-serv':95,111 'rosbridge_websocket.launch':101 'rosbridge_websocket_launch.xml':118,1225 'roslaunch':98 'rotat':494,1166 'run':1218,1246 'runtim':1159 'safeti':1124 'second':156,466,497,547 'see':67 'send':320,321,826,846,1072,1141,1162 'sensor':25,415,982,996,1004 'sequenc':234,237,555,558,587,631,946,1140,1182,1325 'server':97,100,113,117,306,1224 'servic':19,238,239,244,245,246,249,251,252,255,258,259,263,703,711,716,722,725,731,739,754,885,1024,1029,1034,1040,1146 'set':295,296,786,818,1101,1110,1119,1157 'setup':70 'shot':425,454 'singl':424,453,1306 'single-shot':423,452 'skill':3,33 'skill-ros-skill' 'slow':1228 'solut':1213 'sourc':1254 'source-lpigeon' 'spawn':1150 'squar':623 'srvs/empty':735 'standard':1267 'start':1219 'state':1134,1155 'std':461,734 'stop':441,522,580,930,1170 'structur':213,923 'subscrib':216,217,376,392,399,413,1002,1012,1310 'sudo':89,105 'system':857 'test':126,170 'theta':747,849,1048,1075 'timeout':155,161,417,1006,1226,1234,1235,1238,1311 'topic':18,183,184,189,192,193,200,201,202,205,207,208,214,215,221,222,229,230,231,345,354,359,365,371,375,391,398,412,419,458,473,501,526,552,584,628,873,891,898,936,943,988,994,1001,1011,1135,1137,1241,1256,1315,1317 'topic-agent-skills' 'topic-ros' 'topic-ros2' 'topic-skills' 'topics/services':276 'trigger':1163 'troubleshoot':1210 'turtle2':750,1051 'turtlesim':624 'turtlesim/action/rotateabsolute':848,1074 'turtlesim/pose':394 'turtlesim/spawn':742,1043 'turtlesim/srv/setpen':757 'type':191,194,197,247,250,347,360,705,717,892,989 'use':11,433,468,790,1023,1272,1285 'user':14 'valid':1300 'valu':290,298 'vel':449 'veloc':436,467 'verifi':1261,1320 'version':177,180,339,344,868 'via':7,39 'vs':1307 'watch':1304 'websocket':9,41,46,78,175 'websocket-cli':77 'width':764 'without':377,421 'work':1278,1291 'workflow':851 'workspac':1252 'x':479,486,507,514,532,539,592,599,606,613,636,642,648,654,660,666,672,678,684,743,951,958,965,972,1044,1189,1196 'y':481,488,509,516,534,541,594,601,608,615,745,953,960,967,974,1046,1191,1198 'z':483,490,511,518,536,543,596,603,610,617,639,645,651,657,663,669,675,681,687,955,962,969,976,1193,1200 'zero':1186","prices":[{"id":"89364557-f27e-4e9b-a8e9-d50880ce32d2","listingId":"9c943fd9-c280-419e-b6df-4fb0a9f3dadd","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"lpigeon","category":"ros-skill","install_from":"skills.sh"},"createdAt":"2026-04-19T00:38:40.450Z"}],"sources":[{"listingId":"9c943fd9-c280-419e-b6df-4fb0a9f3dadd","source":"github","sourceId":"lpigeon/ros-skill","sourceUrl":"https://github.com/lpigeon/ros-skill","isPrimary":false,"firstSeenAt":"2026-04-19T00:38:40.450Z","lastSeenAt":"2026-04-22T19:06:11.795Z"}],"details":{"listingId":"9c943fd9-c280-419e-b6df-4fb0a9f3dadd","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"lpigeon","slug":"ros-skill","github":{"repo":"lpigeon/ros-skill","stars":21,"topics":["agent-skills","ros","ros2","skills"],"license":"apache-2.0","html_url":"https://github.com/lpigeon/ros-skill","pushed_at":"2026-02-27T06:44:05Z","description":"Agent Skill for ROS/ROS2 robot control via rosbridge WebSocket.","skill_md_sha":"9ed3961423307226492c44f95b68dbd09edb8118","skill_md_path":"SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/lpigeon/ros-skill"},"layout":"root","source":"github","category":"ros-skill","frontmatter":{"name":"ros-skill","license":"Apache-2.0","description":"Controls ROS/ROS2 robots via rosbridge WebSocket CLI. Use when the user asks about ROS topics, services, nodes, parameters, actions, robot movement, sensor data, or any ROS/ROS2 robot interaction.","compatibility":"Requires python3, websocket-client pip package, and rosbridge running on the robot (default port 9090)"},"skills_sh_url":"https://skills.sh/lpigeon/ros-skill"},"updatedAt":"2026-04-22T19:06:11.795Z"}}