agenticros 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +192 -0
- package/README.md +90 -4
- package/dist/commands/config.d.ts +20 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +179 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +33 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +232 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/down.d.ts +15 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +91 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +259 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +18 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +67 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/status.d.ts +12 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +56 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/up.d.ts +20 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +70 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/menu.d.ts +9 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +96 -0
- package/dist/menu.js.map +1 -0
- package/dist/runners/real-robot.d.ts +15 -0
- package/dist/runners/real-robot.d.ts.map +1 -0
- package/dist/runners/real-robot.js +46 -0
- package/dist/runners/real-robot.js.map +1 -0
- package/dist/runners/sim.d.ts +19 -0
- package/dist/runners/sim.d.ts.map +1 -0
- package/dist/runners/sim.js +53 -0
- package/dist/runners/sim.js.map +1 -0
- package/dist/util/env.d.ts +24 -0
- package/dist/util/env.d.ts.map +1 -0
- package/dist/util/env.js +53 -0
- package/dist/util/env.js.map +1 -0
- package/dist/util/logger.d.ts +24 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +62 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/paths.d.ts +57 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +132 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/pidfile.d.ts +16 -0
- package/dist/util/pidfile.d.ts.map +1 -0
- package/dist/util/pidfile.js +63 -0
- package/dist/util/pidfile.js.map +1 -0
- package/dist/util/state.d.ts +26 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/state.js +55 -0
- package/dist/util/state.js.map +1 -0
- package/package.json +60 -1
- package/runtime/BUNDLE.json +11 -0
- package/runtime/LICENSE +192 -0
- package/runtime/README.md +273 -0
- package/runtime/docs/architecture.md +366 -0
- package/runtime/docs/cli.md +140 -0
- package/runtime/docs/memory.md +292 -0
- package/runtime/docs/robot-setup.md +347 -0
- package/runtime/package.json +28 -0
- package/runtime/packages/agenticros/agenticros-agenticros-0.0.1.tgz +0 -0
- package/runtime/packages/agenticros/openclaw.plugin.json +451 -0
- package/runtime/packages/agenticros/package.json +41 -0
- package/runtime/packages/agenticros/src/camera-snapshot-cache.ts +59 -0
- package/runtime/packages/agenticros/src/camera-snapshot-routes.ts +44 -0
- package/runtime/packages/agenticros/src/commands/estop.ts +41 -0
- package/runtime/packages/agenticros/src/commands/transport.ts +195 -0
- package/runtime/packages/agenticros/src/config-file.ts +136 -0
- package/runtime/packages/agenticros/src/config-page.ts +498 -0
- package/runtime/packages/agenticros/src/context/robot-context.ts +373 -0
- package/runtime/packages/agenticros/src/depth.ts +313 -0
- package/runtime/packages/agenticros/src/describer.ts +157 -0
- package/runtime/packages/agenticros/src/image-binary-trim.ts +16 -0
- package/runtime/packages/agenticros/src/index.ts +85 -0
- package/runtime/packages/agenticros/src/landing-page.ts +38 -0
- package/runtime/packages/agenticros/src/memory.ts +44 -0
- package/runtime/packages/agenticros/src/plugin-api.ts +173 -0
- package/runtime/packages/agenticros/src/plugin-image-base64.ts +69 -0
- package/runtime/packages/agenticros/src/preflight.ts +110 -0
- package/runtime/packages/agenticros/src/routes.ts +328 -0
- package/runtime/packages/agenticros/src/safety/validator.ts +43 -0
- package/runtime/packages/agenticros/src/service.ts +359 -0
- package/runtime/packages/agenticros/src/skill-api.ts +65 -0
- package/runtime/packages/agenticros/src/skill-loader.ts +146 -0
- package/runtime/packages/agenticros/src/teleop/page.ts +498 -0
- package/runtime/packages/agenticros/src/teleop/routes.ts +650 -0
- package/runtime/packages/agenticros/src/tools/index.ts +26 -0
- package/runtime/packages/agenticros/src/tools/ros2-action.ts +50 -0
- package/runtime/packages/agenticros/src/tools/ros2-camera.ts +221 -0
- package/runtime/packages/agenticros/src/tools/ros2-depth-distance.ts +58 -0
- package/runtime/packages/agenticros/src/tools/ros2-introspect.ts +62 -0
- package/runtime/packages/agenticros/src/tools/ros2-memory.ts +158 -0
- package/runtime/packages/agenticros/src/tools/ros2-param.ts +87 -0
- package/runtime/packages/agenticros/src/tools/ros2-publish.ts +52 -0
- package/runtime/packages/agenticros/src/tools/ros2-service.ts +46 -0
- package/runtime/packages/agenticros/src/tools/ros2-subscribe.ts +71 -0
- package/runtime/packages/agenticros/tsconfig.json +9 -0
- package/runtime/packages/agenticros-claude-code/README.md +260 -0
- package/runtime/packages/agenticros-claude-code/config.example.json +9 -0
- package/runtime/packages/agenticros-claude-code/dist/config.d.ts +8 -0
- package/runtime/packages/agenticros-claude-code/dist/config.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/config.js +93 -0
- package/runtime/packages/agenticros-claude-code/dist/config.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/depth.d.ts +20 -0
- package/runtime/packages/agenticros-claude-code/dist/depth.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/depth.js +126 -0
- package/runtime/packages/agenticros-claude-code/dist/depth.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.d.ts +6 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.js +36 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.d.ts +33 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.js +134 -0
- package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.d.ts +43 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.js +73 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.d.ts +58 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.js +251 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.d.ts +61 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.js +268 -0
- package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/index.d.ts +3 -0
- package/runtime/packages/agenticros-claude-code/dist/index.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/index.js +111 -0
- package/runtime/packages/agenticros-claude-code/dist/index.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/memory.d.ts +17 -0
- package/runtime/packages/agenticros-claude-code/dist/memory.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/memory.js +44 -0
- package/runtime/packages/agenticros-claude-code/dist/memory.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/safety.d.ts +10 -0
- package/runtime/packages/agenticros-claude-code/dist/safety.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/safety.js +34 -0
- package/runtime/packages/agenticros-claude-code/dist/safety.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/tools.d.ts +36 -0
- package/runtime/packages/agenticros-claude-code/dist/tools.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/tools.js +777 -0
- package/runtime/packages/agenticros-claude-code/dist/tools.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/transport.d.ts +17 -0
- package/runtime/packages/agenticros-claude-code/dist/transport.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/transport.js +46 -0
- package/runtime/packages/agenticros-claude-code/dist/transport.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.d.ts +42 -0
- package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.d.ts.map +1 -0
- package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.js +114 -0
- package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.js.map +1 -0
- package/runtime/packages/agenticros-claude-code/package.json +29 -0
- package/runtime/packages/agenticros-claude-code/src/config.ts +96 -0
- package/runtime/packages/agenticros-claude-code/src/depth.ts +173 -0
- package/runtime/packages/agenticros-claude-code/src/find-object/coco-classes.ts +38 -0
- package/runtime/packages/agenticros-claude-code/src/find-object/find-object.ts +190 -0
- package/runtime/packages/agenticros-claude-code/src/follow-me/controller.ts +109 -0
- package/runtime/packages/agenticros-claude-code/src/follow-me/depth-loop.ts +420 -0
- package/runtime/packages/agenticros-claude-code/src/follow-me/detector.ts +303 -0
- package/runtime/packages/agenticros-claude-code/src/follow-me/loop.ts +330 -0
- package/runtime/packages/agenticros-claude-code/src/index.ts +125 -0
- package/runtime/packages/agenticros-claude-code/src/memory.ts +51 -0
- package/runtime/packages/agenticros-claude-code/src/safety.ts +44 -0
- package/runtime/packages/agenticros-claude-code/src/tools.ts +891 -0
- package/runtime/packages/agenticros-claude-code/src/transport.ts +58 -0
- package/runtime/packages/agenticros-claude-code/src/zero-shot/detector.ts +169 -0
- package/runtime/packages/agenticros-claude-code/tsconfig.json +9 -0
- package/runtime/packages/agenticros-claude-code/yolo-debug.mjs +106 -0
- package/runtime/packages/agenticros-gemini/README.md +139 -0
- package/runtime/packages/agenticros-gemini/package.json +28 -0
- package/runtime/packages/agenticros-gemini/scripts/smoke-api.mjs +42 -0
- package/runtime/packages/agenticros-gemini/src/chat.ts +139 -0
- package/runtime/packages/agenticros-gemini/src/config.ts +92 -0
- package/runtime/packages/agenticros-gemini/src/depth.ts +173 -0
- package/runtime/packages/agenticros-gemini/src/index.ts +58 -0
- package/runtime/packages/agenticros-gemini/src/memory.ts +32 -0
- package/runtime/packages/agenticros-gemini/src/safety.ts +44 -0
- package/runtime/packages/agenticros-gemini/src/tools.ts +516 -0
- package/runtime/packages/agenticros-gemini/src/transport.ts +58 -0
- package/runtime/packages/agenticros-gemini/tsconfig.json +8 -0
- package/runtime/packages/core/package.json +47 -0
- package/runtime/packages/core/src/banner.ts +32 -0
- package/runtime/packages/core/src/cmd-vel-twist.ts +31 -0
- package/runtime/packages/core/src/config.ts +279 -0
- package/runtime/packages/core/src/index.ts +54 -0
- package/runtime/packages/core/src/memory/__tests__/factory.test.ts +70 -0
- package/runtime/packages/core/src/memory/__tests__/local-provider.test.ts +195 -0
- package/runtime/packages/core/src/memory/__tests__/mem0-provider.test.ts +192 -0
- package/runtime/packages/core/src/memory/__tests__/smart-defaults.test.ts +46 -0
- package/runtime/packages/core/src/memory/factory.ts +63 -0
- package/runtime/packages/core/src/memory/index.ts +10 -0
- package/runtime/packages/core/src/memory/local/provider.ts +229 -0
- package/runtime/packages/core/src/memory/mem0/provider.ts +379 -0
- package/runtime/packages/core/src/memory/types.ts +96 -0
- package/runtime/packages/core/src/topic-utils.ts +95 -0
- package/runtime/packages/core/src/transport/factory.ts +47 -0
- package/runtime/packages/core/src/transport/local/conversion.ts +333 -0
- package/runtime/packages/core/src/transport/local/entities.ts +129 -0
- package/runtime/packages/core/src/transport/local/transport.ts +406 -0
- package/runtime/packages/core/src/transport/rosbridge/actions.ts +81 -0
- package/runtime/packages/core/src/transport/rosbridge/adapter.ts +157 -0
- package/runtime/packages/core/src/transport/rosbridge/client.ts +438 -0
- package/runtime/packages/core/src/transport/rosbridge/services.ts +41 -0
- package/runtime/packages/core/src/transport/rosbridge/topics.ts +60 -0
- package/runtime/packages/core/src/transport/rosbridge/types.ts +118 -0
- package/runtime/packages/core/src/transport/transport.ts +77 -0
- package/runtime/packages/core/src/transport/types.ts +137 -0
- package/runtime/packages/core/src/transport/webrtc/signaling-client.ts +196 -0
- package/runtime/packages/core/src/transport/webrtc/signaling-types.ts +130 -0
- package/runtime/packages/core/src/transport/webrtc/transport.ts +516 -0
- package/runtime/packages/core/src/transport/zenoh/adapter.ts +357 -0
- package/runtime/packages/core/src/transport/zenoh/cdr.ts +183 -0
- package/runtime/packages/core/src/transport/zenoh/keys.ts +51 -0
- package/runtime/packages/core/tsconfig.json +9 -0
- package/runtime/packages/ros-camera/package.json +30 -0
- package/runtime/packages/ros-camera/src/index.ts +13 -0
- package/runtime/packages/ros-camera/src/snapshot.ts +372 -0
- package/runtime/packages/ros-camera/tsconfig.json +9 -0
- package/runtime/pnpm-lock.yaml +5260 -0
- package/runtime/pnpm-workspace.yaml +2 -0
- package/runtime/ros2_ws/src/agenticros_agent/agenticros_agent/__init__.py +0 -0
- package/runtime/ros2_ws/src/agenticros_agent/agenticros_agent/agent_node.py +561 -0
- package/runtime/ros2_ws/src/agenticros_agent/package.xml +25 -0
- package/runtime/ros2_ws/src/agenticros_agent/resource/agenticros_agent +0 -0
- package/runtime/ros2_ws/src/agenticros_agent/setup.cfg +4 -0
- package/runtime/ros2_ws/src/agenticros_agent/setup.py +25 -0
- package/runtime/ros2_ws/src/agenticros_bringup/README.md +128 -0
- package/runtime/ros2_ws/src/agenticros_bringup/agenticros_bringup/__init__.py +1 -0
- package/runtime/ros2_ws/src/agenticros_bringup/agenticros_bringup/cmd_vel_relay.py +33 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/cmd_vel_bridge.launch.py +58 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/gazebo_turtlebot3.launch.py +69 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/mode_a_gazebo.launch.py +55 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/mode_a_gazebo_rviz.launch.py +48 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/realsense_rosbridge.launch.py +154 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/rosbridge_gazebo.launch.py +54 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/rviz.launch.py +38 -0
- package/runtime/ros2_ws/src/agenticros_bringup/launch/turtlebot3_gazebo_rviz.launch.py +42 -0
- package/runtime/ros2_ws/src/agenticros_bringup/package.xml +24 -0
- package/runtime/ros2_ws/src/agenticros_bringup/resource/agenticros_bringup +0 -0
- package/runtime/ros2_ws/src/agenticros_bringup/rviz/turtlebot3_agenticros.rviz +174 -0
- package/runtime/ros2_ws/src/agenticros_bringup/setup.cfg +4 -0
- package/runtime/ros2_ws/src/agenticros_bringup/setup.py +28 -0
- package/runtime/ros2_ws/src/agenticros_discovery/agenticros_discovery/__init__.py +0 -0
- package/runtime/ros2_ws/src/agenticros_discovery/agenticros_discovery/discovery_node.py +172 -0
- package/runtime/ros2_ws/src/agenticros_discovery/package.xml +22 -0
- package/runtime/ros2_ws/src/agenticros_discovery/resource/agenticros_discovery +0 -0
- package/runtime/ros2_ws/src/agenticros_discovery/setup.cfg +5 -0
- package/runtime/ros2_ws/src/agenticros_discovery/setup.py +25 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/README.md +66 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/__init__.py +1 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/__main__.py +5 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/follow_me_node.py +278 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/follower_controller.py +631 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/person_tracker.py +635 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/package.xml +22 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/resource/agenticros_follow_me +0 -0
- package/runtime/ros2_ws/src/agenticros_follow_me/setup.py +25 -0
- package/runtime/ros2_ws/src/agenticros_msgs/CMakeLists.txt +26 -0
- package/runtime/ros2_ws/src/agenticros_msgs/msg/CapabilityManifest.msg +9 -0
- package/runtime/ros2_ws/src/agenticros_msgs/package.xml +22 -0
- package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeGetStatus.srv +11 -0
- package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeSetDistance.srv +4 -0
- package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeSetTarget.srv +6 -0
- package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeStart.srv +5 -0
- package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeStop.srv +3 -0
- package/runtime/ros2_ws/src/agenticros_msgs/srv/GetCapabilities.srv +5 -0
- package/runtime/ros2_ws/src/agenticros_sim/CMakeLists.txt +24 -0
- package/runtime/ros2_ws/src/agenticros_sim/README.md +120 -0
- package/runtime/ros2_ws/src/agenticros_sim/config/agenticros-sim.config.json +28 -0
- package/runtime/ros2_ws/src/agenticros_sim/config/amr_bridge.yaml +111 -0
- package/runtime/ros2_ws/src/agenticros_sim/config/amr_view.rviz +172 -0
- package/runtime/ros2_ws/src/agenticros_sim/env-hooks/gz_resource_path.dsv.in +3 -0
- package/runtime/ros2_ws/src/agenticros_sim/env-hooks/gz_resource_path.sh.in +7 -0
- package/runtime/ros2_ws/src/agenticros_sim/launch/sim_amr.launch.py +159 -0
- package/runtime/ros2_ws/src/agenticros_sim/models/agenticros_amr/model.config +17 -0
- package/runtime/ros2_ws/src/agenticros_sim/models/agenticros_amr/model.sdf +244 -0
- package/runtime/ros2_ws/src/agenticros_sim/package.xml +27 -0
- package/runtime/ros2_ws/src/agenticros_sim/worlds/agenticros_indoor.sdf +183 -0
- package/runtime/scripts/activate_workspace.sh +285 -0
- package/runtime/scripts/agenticros-describer.policy.yaml +96 -0
- package/runtime/scripts/agenticros-proxy.cjs +99 -0
- package/runtime/scripts/agenticros-rosbridge.policy.yaml +62 -0
- package/runtime/scripts/check-cli-tarball-size.mjs +42 -0
- package/runtime/scripts/configure_agenticros.sh +200 -0
- package/runtime/scripts/configure_for_sim.sh +64 -0
- package/runtime/scripts/fix-openclaw-control-ui-path.sh +20 -0
- package/runtime/scripts/install_cli.sh +94 -0
- package/runtime/scripts/install_rosbridge_from_source.sh +67 -0
- package/runtime/scripts/lib/agenticros-banner.sh +28 -0
- package/runtime/scripts/onboard_robot.sh +75 -0
- package/runtime/scripts/openai.policy.yaml +77 -0
- package/runtime/scripts/openclaw-dashboard-url.cjs +49 -0
- package/runtime/scripts/pack-runtime.mjs +245 -0
- package/runtime/scripts/run_demo_native.sh +43 -0
- package/runtime/scripts/run_nemoclaw_host_stack.sh +91 -0
- package/runtime/scripts/run_robot_rosbridge.sh +36 -0
- package/runtime/scripts/sandbox_rosbridge_relay.py +137 -0
- package/runtime/scripts/setup-openclaw-local.cjs +75 -0
- package/runtime/scripts/setup_gateway_plugin.sh +329 -0
- package/runtime/scripts/setup_robot.sh +113 -0
- package/runtime/scripts/setup_workspace.sh +484 -0
- package/runtime/scripts/sim/run_sim.sh +146 -0
- package/runtime/scripts/smoke_test_nemoclaw.sh +123 -0
- package/runtime/scripts/start_demo.sh +55 -0
- package/runtime/scripts/sync-skill-tools.mjs +335 -0
- package/runtime/scripts/test-follow-me-sim.mjs +135 -0
- package/runtime/scripts/test-mcp-e2e.mjs +184 -0
- package/runtime/scripts/test-rclnodejs.mts +129 -0
- package/runtime/scripts/use-openclaw-2026.2.26.sh +19 -0
- package/runtime/scripts/use-openclaw-2026.3.11.sh +19 -0
- package/runtime/scripts/zenoh-bridge-ros2dds-robot.json5 +30 -0
- package/runtime/scripts/zenohd-agenticros.json5 +11 -0
- package/runtime/scripts/zenohd-rosclaw.json5 +11 -0
- package/runtime/tsconfig.base.json +19 -0
- package/index.js +0 -6
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sample distance (meters) from a ROS2 depth image topic.
|
|
3
|
+
* Copied from OpenClaw adapter so we don't depend on the full plugin.
|
|
4
|
+
*/
|
|
5
|
+
import { ROS_MSG_IMAGE, coerceRosImageDataToBuffer, normalizeDepthImageEncoding, rosBoolField, rosNumericField, rosStringField, } from "@agenticros/ros-camera";
|
|
6
|
+
function depthImageDataBytes(data) {
|
|
7
|
+
try {
|
|
8
|
+
return new Uint8Array(coerceRosImageDataToBuffer(data));
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
const hint = e instanceof Error ? e.message : String(e);
|
|
12
|
+
const kind = data == null
|
|
13
|
+
? "null"
|
|
14
|
+
: `${typeof data}${typeof data === "object" && data !== null ? ` (${data.constructor?.name ?? "Object"})` : ""}`;
|
|
15
|
+
throw new Error(`Depth image bytes: ${hint} (data field: ${kind})`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function bytesPerPixelForDepthEncoding(encoding) {
|
|
19
|
+
return normalizeDepthImageEncoding(encoding) === "32FC1" ? 4 : 2;
|
|
20
|
+
}
|
|
21
|
+
const DEPTH_SAMPLE_MAX_M = 40;
|
|
22
|
+
const DEPTH_REPORT_PERCENTILE = 12;
|
|
23
|
+
function sanitizeDepthSamplesMeters(values) {
|
|
24
|
+
return values.filter((v) => Number.isFinite(v) && v > 0 && v <= DEPTH_SAMPLE_MAX_M);
|
|
25
|
+
}
|
|
26
|
+
function percentileLowerSorted(sortedAsc, p) {
|
|
27
|
+
const n = sortedAsc.length;
|
|
28
|
+
if (n === 0)
|
|
29
|
+
return NaN;
|
|
30
|
+
if (n === 1)
|
|
31
|
+
return sortedAsc[0];
|
|
32
|
+
const pp = Math.max(0, Math.min(100, p));
|
|
33
|
+
const idx = Math.min(n - 1, Math.floor((pp / 100) * n));
|
|
34
|
+
return sortedAsc[idx];
|
|
35
|
+
}
|
|
36
|
+
export function sampleDepthMeters(width, height, step, encoding, data, centerFraction = 0.3, isBigEndian = false) {
|
|
37
|
+
const enc = normalizeDepthImageEncoding(encoding);
|
|
38
|
+
const values = [];
|
|
39
|
+
const cx = width / 2;
|
|
40
|
+
const cy = height / 2;
|
|
41
|
+
const halfW = Math.max(1, Math.floor((width * centerFraction) / 2));
|
|
42
|
+
const halfH = Math.max(1, Math.floor((height * centerFraction) / 2));
|
|
43
|
+
const x0 = Math.max(0, Math.floor(cx - halfW));
|
|
44
|
+
const x1 = Math.min(width, Math.floor(cx + halfW));
|
|
45
|
+
const y0 = Math.max(0, Math.floor(cy - halfH));
|
|
46
|
+
const y1 = Math.min(height, Math.floor(cy + halfH));
|
|
47
|
+
if (enc === "16UC1") {
|
|
48
|
+
for (let y = y0; y < y1; y++) {
|
|
49
|
+
for (let x = x0; x < x1; x++) {
|
|
50
|
+
const off = y * step + x * 2;
|
|
51
|
+
if (off + 2 > data.length)
|
|
52
|
+
continue;
|
|
53
|
+
const lo = data[off];
|
|
54
|
+
const hi = data[off + 1];
|
|
55
|
+
const v = isBigEndian ? (lo << 8) | hi : (hi << 8) | lo;
|
|
56
|
+
if (v > 0)
|
|
57
|
+
values.push(v / 1000);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (enc === "32FC1") {
|
|
62
|
+
for (let y = y0; y < y1; y++) {
|
|
63
|
+
for (let x = x0; x < x1; x++) {
|
|
64
|
+
const off = y * step + x * 4;
|
|
65
|
+
if (off + 4 > data.length)
|
|
66
|
+
continue;
|
|
67
|
+
const v = new DataView(data.buffer, data.byteOffset + off, 4).getFloat32(0, !isBigEndian);
|
|
68
|
+
if (Number.isFinite(v) && v > 0)
|
|
69
|
+
values.push(v);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
throw new Error(`Unsupported depth encoding: "${encoding}" (interpreted as "${enc}"). Use 16UC1/mono16 (mm) or 32FC1 (m).`);
|
|
75
|
+
}
|
|
76
|
+
return values;
|
|
77
|
+
}
|
|
78
|
+
function median(sorted) {
|
|
79
|
+
if (sorted.length === 0)
|
|
80
|
+
return NaN;
|
|
81
|
+
const m = sorted.length >> 1;
|
|
82
|
+
if (sorted.length % 2 === 1)
|
|
83
|
+
return sorted[m];
|
|
84
|
+
return (sorted[m - 1] + sorted[m]) / 2;
|
|
85
|
+
}
|
|
86
|
+
export async function getDepthDistance(transport, topic, timeoutMs = 5000) {
|
|
87
|
+
const result = await new Promise((resolve, reject) => {
|
|
88
|
+
const sub = transport.subscribe({ topic, type: ROS_MSG_IMAGE }, (msg) => {
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
sub.unsubscribe();
|
|
91
|
+
resolve(msg);
|
|
92
|
+
});
|
|
93
|
+
const timer = setTimeout(() => {
|
|
94
|
+
sub.unsubscribe();
|
|
95
|
+
reject(new Error(`Depth snapshot timeout on ${topic} (${timeoutMs}ms). No sensor_msgs/Image received—check topic and that it publishes raw depth (not CompressedImage only). With Zenoh, check the gateway log for CDR decode warnings.`));
|
|
96
|
+
}, timeoutMs);
|
|
97
|
+
});
|
|
98
|
+
const encoding = normalizeDepthImageEncoding(rosStringField(result.encoding, "16UC1"));
|
|
99
|
+
const bpp = bytesPerPixelForDepthEncoding(encoding);
|
|
100
|
+
const width = rosNumericField(result.width, "width");
|
|
101
|
+
const height = rosNumericField(result.height, "height");
|
|
102
|
+
const step = result.step != null && result.step !== ""
|
|
103
|
+
? rosNumericField(result.step, "step")
|
|
104
|
+
: width * bpp;
|
|
105
|
+
const isBigEndian = rosBoolField(result.is_bigendian);
|
|
106
|
+
const data = depthImageDataBytes(result.data);
|
|
107
|
+
const values = sanitizeDepthSamplesMeters(sampleDepthMeters(width, height, step, encoding, data, 0.3, isBigEndian));
|
|
108
|
+
const sorted = values.slice().sort((a, b) => a - b);
|
|
109
|
+
const distance_m = percentileLowerSorted(sorted, DEPTH_REPORT_PERCENTILE);
|
|
110
|
+
const median_m = median(sorted);
|
|
111
|
+
const min_m = sorted.length ? sorted[0] : NaN;
|
|
112
|
+
const max_m = sorted.length ? sorted[sorted.length - 1] : NaN;
|
|
113
|
+
return {
|
|
114
|
+
distance_m: Math.round(distance_m * 1000) / 1000,
|
|
115
|
+
median_m: Math.round(median_m * 1000) / 1000,
|
|
116
|
+
valid: sorted.length > 0 && Number.isFinite(distance_m),
|
|
117
|
+
topic,
|
|
118
|
+
encoding,
|
|
119
|
+
width,
|
|
120
|
+
height,
|
|
121
|
+
sample_count: sorted.length,
|
|
122
|
+
min_m: Math.round(min_m * 1000) / 1000,
|
|
123
|
+
max_m: Math.round(max_m * 1000) / 1000,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=depth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depth.js","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COCO 80-class names (index = YOLOv8 class ID). Lower-cased for lookup.
|
|
3
|
+
*/
|
|
4
|
+
export declare const COCO_CLASSES: readonly ["person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"];
|
|
5
|
+
export declare function resolveCocoClassId(name: string): number | null;
|
|
6
|
+
//# sourceMappingURL=coco-classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coco-classes.d.ts","sourceRoot":"","sources":["../../src/find-object/coco-classes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,w2BAaf,CAAC;AAeX,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COCO 80-class names (index = YOLOv8 class ID). Lower-cased for lookup.
|
|
3
|
+
*/
|
|
4
|
+
export const COCO_CLASSES = [
|
|
5
|
+
"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck",
|
|
6
|
+
"boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
|
|
7
|
+
"bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra",
|
|
8
|
+
"giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
|
|
9
|
+
"skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove",
|
|
10
|
+
"skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
|
|
11
|
+
"fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
|
|
12
|
+
"broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
|
|
13
|
+
"potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse",
|
|
14
|
+
"remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink",
|
|
15
|
+
"refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier",
|
|
16
|
+
"toothbrush",
|
|
17
|
+
];
|
|
18
|
+
const ALIASES = {
|
|
19
|
+
phone: "cell phone",
|
|
20
|
+
cellphone: "cell phone",
|
|
21
|
+
mobile: "cell phone",
|
|
22
|
+
smartphone: "cell phone",
|
|
23
|
+
tv: "tv",
|
|
24
|
+
television: "tv",
|
|
25
|
+
monitor: "tv",
|
|
26
|
+
sofa: "couch",
|
|
27
|
+
plant: "potted plant",
|
|
28
|
+
bike: "bicycle",
|
|
29
|
+
};
|
|
30
|
+
export function resolveCocoClassId(name) {
|
|
31
|
+
const key = name.trim().toLowerCase();
|
|
32
|
+
const canonical = ALIASES[key] ?? key;
|
|
33
|
+
const idx = COCO_CLASSES.indexOf(canonical);
|
|
34
|
+
return idx >= 0 ? idx : null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=coco-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coco-classes.js","sourceRoot":"","sources":["../../src/find-object/coco-classes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO;IAC7E,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO;IAC9E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO;IAC1E,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS;IAC1E,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,gBAAgB;IAC5E,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK;IACzE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ;IACzE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAC3E,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO;IACxE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAC1E,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY;IAC/E,YAAY;CACJ,CAAC;AAEX,MAAM,OAAO,GAA2B;IACtC,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,YAAY;IACxB,EAAE,EAAE,IAAI;IACR,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,SAA0C,CAAC,CAAC;IAC7E,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rotate the robot in place until a target COCO class is detected in the
|
|
3
|
+
* camera feed, then stop. Used by the ros2_find_object MCP tool.
|
|
4
|
+
*/
|
|
5
|
+
import type { AgenticROSConfig, RosTransport } from "@agenticros/core";
|
|
6
|
+
export interface FindObjectOptions {
|
|
7
|
+
target: string;
|
|
8
|
+
angularSpeed?: number;
|
|
9
|
+
timeoutSeconds?: number;
|
|
10
|
+
minConfidence?: number;
|
|
11
|
+
clockwise?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface FindObjectResult {
|
|
14
|
+
found: boolean;
|
|
15
|
+
target: string;
|
|
16
|
+
classId: number;
|
|
17
|
+
elapsedSeconds: number;
|
|
18
|
+
rotationDirection: "clockwise" | "counterclockwise";
|
|
19
|
+
angularSpeed: number;
|
|
20
|
+
detection?: {
|
|
21
|
+
confidence: number;
|
|
22
|
+
cx: number;
|
|
23
|
+
cy: number;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
imageWidth: number;
|
|
27
|
+
imageHeight: number;
|
|
28
|
+
horizontalOffset: number;
|
|
29
|
+
};
|
|
30
|
+
error?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function findObject(config: AgenticROSConfig, transport: RosTransport, opts: FindObjectOptions): Promise<FindObjectResult>;
|
|
33
|
+
//# sourceMappingURL=find-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-object.d.ts","sourceRoot":"","sources":["../../src/find-object/find-object.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgBvE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,WAAW,GAAG,kBAAkB,CAAC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAgG3B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rotate the robot in place until a target COCO class is detected in the
|
|
3
|
+
* camera feed, then stop. Used by the ros2_find_object MCP tool.
|
|
4
|
+
*/
|
|
5
|
+
import { resolveCameraSubscribeTopic, toNamespacedTopic } from "@agenticros/core";
|
|
6
|
+
import { ROS_MSG_COMPRESSED_IMAGE, cameraSnapshotFromPlainMessage, } from "@agenticros/ros-camera";
|
|
7
|
+
import { PersonDetector } from "../follow-me/detector.js";
|
|
8
|
+
import { resolveCocoClassId, COCO_CLASSES } from "./coco-classes.js";
|
|
9
|
+
const DEFAULT_COLOR_TOPIC = "/camera/camera/color/image_raw/compressed";
|
|
10
|
+
const DEFAULT_ANGULAR_SPEED = 0.3; // rad/s
|
|
11
|
+
const DEFAULT_TIMEOUT_SEC = 30;
|
|
12
|
+
const DEFAULT_MIN_CONFIDENCE = 0.5;
|
|
13
|
+
const POLL_INTERVAL_MS = 500;
|
|
14
|
+
const SNAPSHOT_TIMEOUT_MS = 3000;
|
|
15
|
+
export async function findObject(config, transport, opts) {
|
|
16
|
+
const classId = resolveCocoClassId(opts.target);
|
|
17
|
+
if (classId === null) {
|
|
18
|
+
return {
|
|
19
|
+
found: false,
|
|
20
|
+
target: opts.target,
|
|
21
|
+
classId: -1,
|
|
22
|
+
elapsedSeconds: 0,
|
|
23
|
+
rotationDirection: "clockwise",
|
|
24
|
+
angularSpeed: 0,
|
|
25
|
+
error: `Unknown target "${opts.target}". Must be a COCO class name (e.g., "cell phone", "chair", "bottle"). ` +
|
|
26
|
+
`Supported: ${COCO_CLASSES.join(", ")}.`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const safety = config.safety ?? {};
|
|
30
|
+
const maxAngular = safety.maxAngularVelocity ?? 1.5;
|
|
31
|
+
const requestedSpeed = Math.max(0.05, Math.min(maxAngular, opts.angularSpeed ?? DEFAULT_ANGULAR_SPEED));
|
|
32
|
+
const clockwise = opts.clockwise ?? true;
|
|
33
|
+
const angularZ = clockwise ? -requestedSpeed : requestedSpeed;
|
|
34
|
+
const timeoutMs = Math.max(1000, (opts.timeoutSeconds ?? DEFAULT_TIMEOUT_SEC) * 1000);
|
|
35
|
+
const minConfidence = opts.minConfidence ?? DEFAULT_MIN_CONFIDENCE;
|
|
36
|
+
const detector = new PersonDetector({ scoreThreshold: minConfidence });
|
|
37
|
+
await detector.load();
|
|
38
|
+
const cmdVelTopic = resolveCmdVelTopic(config);
|
|
39
|
+
const colorTopic = resolveCameraSubscribeTopic(config, (config.robot?.cameraTopic ?? "").trim() || DEFAULT_COLOR_TOPIC);
|
|
40
|
+
const startedAt = Date.now();
|
|
41
|
+
let rotating = false;
|
|
42
|
+
let result;
|
|
43
|
+
const publishTwist = async (linearX, angZ) => {
|
|
44
|
+
try {
|
|
45
|
+
await transport.publish({
|
|
46
|
+
topic: cmdVelTopic,
|
|
47
|
+
type: "geometry_msgs/msg/Twist",
|
|
48
|
+
msg: { linear: { x: linearX, y: 0, z: 0 }, angular: { x: 0, y: 0, z: angZ } },
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// best-effort; loop will retry
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
await publishTwist(0, angularZ);
|
|
57
|
+
rotating = true;
|
|
58
|
+
const deadline = startedAt + timeoutMs;
|
|
59
|
+
while (Date.now() < deadline && !result) {
|
|
60
|
+
// Keep the rotation alive in case the robot times out cmd_vel commands.
|
|
61
|
+
await publishTwist(0, angularZ);
|
|
62
|
+
const frame = await snapshotOnce(transport, colorTopic).catch(() => null);
|
|
63
|
+
if (frame) {
|
|
64
|
+
const det = await detector.detectClass(frame.buffer, classId);
|
|
65
|
+
if (det.detections.length > 0) {
|
|
66
|
+
const best = det.detections.reduce((a, b) => (a.confidence > b.confidence ? a : b));
|
|
67
|
+
result = {
|
|
68
|
+
confidence: best.confidence,
|
|
69
|
+
cx: best.cx,
|
|
70
|
+
cy: best.cy,
|
|
71
|
+
width: best.width,
|
|
72
|
+
height: best.height,
|
|
73
|
+
imageWidth: det.width,
|
|
74
|
+
imageHeight: det.height,
|
|
75
|
+
horizontalOffset: (best.cx - det.width / 2) / (det.width / 2),
|
|
76
|
+
};
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const remaining = deadline - Date.now();
|
|
81
|
+
if (remaining <= 0)
|
|
82
|
+
break;
|
|
83
|
+
await sleep(Math.min(POLL_INTERVAL_MS, remaining));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
if (rotating)
|
|
88
|
+
await publishTwist(0, 0);
|
|
89
|
+
await detector.dispose().catch(() => { });
|
|
90
|
+
}
|
|
91
|
+
const elapsedSeconds = (Date.now() - startedAt) / 1000;
|
|
92
|
+
return {
|
|
93
|
+
found: !!result,
|
|
94
|
+
target: opts.target,
|
|
95
|
+
classId,
|
|
96
|
+
elapsedSeconds,
|
|
97
|
+
rotationDirection: clockwise ? "clockwise" : "counterclockwise",
|
|
98
|
+
angularSpeed: requestedSpeed,
|
|
99
|
+
detection: result,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async function snapshotOnce(transport, topic) {
|
|
103
|
+
return new Promise((resolve) => {
|
|
104
|
+
const sub = transport.subscribe({ topic, type: ROS_MSG_COMPRESSED_IMAGE }, (msg) => {
|
|
105
|
+
clearTimeout(timer);
|
|
106
|
+
sub.unsubscribe();
|
|
107
|
+
try {
|
|
108
|
+
const payload = cameraSnapshotFromPlainMessage("CompressedImage", msg);
|
|
109
|
+
resolve({ buffer: Buffer.from(payload.dataBase64, "base64") });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
resolve(null);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const timer = setTimeout(() => {
|
|
116
|
+
sub.unsubscribe();
|
|
117
|
+
resolve(null);
|
|
118
|
+
}, SNAPSHOT_TIMEOUT_MS);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function sleep(ms) {
|
|
122
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
123
|
+
}
|
|
124
|
+
function resolveCmdVelTopic(config) {
|
|
125
|
+
const raw = (config.teleop?.cmdVelTopic ?? "").trim() || "/cmd_vel";
|
|
126
|
+
const namespaced = toNamespacedTopic(config, raw);
|
|
127
|
+
const match = namespaced.match(/^\/([^/]+)\/cmd_vel$/i);
|
|
128
|
+
const segment = match?.[1] ?? "";
|
|
129
|
+
if (match && !segment.toLowerCase().startsWith("robot")) {
|
|
130
|
+
return `/robot${segment.replace(/-/g, "")}/cmd_vel`;
|
|
131
|
+
}
|
|
132
|
+
return namespaced;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=find-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-object.js","sourceRoot":"","sources":["../../src/find-object/find-object.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Follower P-controller ported from agenticros_follow_me/follower_controller.py.
|
|
3
|
+
*
|
|
4
|
+
* Given a target person's 3D position (x = lateral metres, z = depth metres),
|
|
5
|
+
* compute a smoothed, deadzoned, clamped Twist command.
|
|
6
|
+
*/
|
|
7
|
+
export interface ControllerConfig {
|
|
8
|
+
targetDistance: number;
|
|
9
|
+
maxLinearVel: number;
|
|
10
|
+
maxAngularVel: number;
|
|
11
|
+
kpDistance: number;
|
|
12
|
+
kpAngular: number;
|
|
13
|
+
distanceDeadzone: number;
|
|
14
|
+
angularDeadzone: number;
|
|
15
|
+
smoothingFactor: number;
|
|
16
|
+
watchdogTimeoutMs: number;
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_CONTROLLER_CONFIG: ControllerConfig;
|
|
19
|
+
export interface Twist {
|
|
20
|
+
linearX: number;
|
|
21
|
+
angularZ: number;
|
|
22
|
+
}
|
|
23
|
+
export interface TargetSample {
|
|
24
|
+
/** Lateral offset in metres (positive = right of camera centre). */
|
|
25
|
+
x: number;
|
|
26
|
+
/** Forward depth in metres. */
|
|
27
|
+
z: number;
|
|
28
|
+
confidence: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class FollowerController {
|
|
31
|
+
readonly config: ControllerConfig;
|
|
32
|
+
private smoothedLinear;
|
|
33
|
+
private smoothedAngular;
|
|
34
|
+
private lastDetectionMs;
|
|
35
|
+
private lastTwist;
|
|
36
|
+
constructor(config?: Partial<ControllerConfig>);
|
|
37
|
+
setTargetDistance(d: number): void;
|
|
38
|
+
reset(): void;
|
|
39
|
+
/** Compute next twist. Pass null when no person is detected this tick. */
|
|
40
|
+
update(target: TargetSample | null): Twist;
|
|
41
|
+
getLastTwist(): Twist;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/follow-me/controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAUvC,CAAC;AAEF,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,SAAS,CAAsC;gBAE3C,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIlD,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAOb,0EAA0E;IAC1E,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,KAAK;IAkC1C,YAAY,IAAI,KAAK;CAGtB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Follower P-controller ported from agenticros_follow_me/follower_controller.py.
|
|
3
|
+
*
|
|
4
|
+
* Given a target person's 3D position (x = lateral metres, z = depth metres),
|
|
5
|
+
* compute a smoothed, deadzoned, clamped Twist command.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_CONTROLLER_CONFIG = {
|
|
8
|
+
targetDistance: 1.0,
|
|
9
|
+
maxLinearVel: 0.5,
|
|
10
|
+
maxAngularVel: 1.0,
|
|
11
|
+
kpDistance: 0.5,
|
|
12
|
+
kpAngular: 1.5,
|
|
13
|
+
distanceDeadzone: 0.05,
|
|
14
|
+
angularDeadzone: 0.05,
|
|
15
|
+
smoothingFactor: 0.3,
|
|
16
|
+
watchdogTimeoutMs: 500,
|
|
17
|
+
};
|
|
18
|
+
export class FollowerController {
|
|
19
|
+
config;
|
|
20
|
+
smoothedLinear = 0;
|
|
21
|
+
smoothedAngular = 0;
|
|
22
|
+
lastDetectionMs = 0;
|
|
23
|
+
lastTwist = { linearX: 0, angularZ: 0 };
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = { ...DEFAULT_CONTROLLER_CONFIG, ...config };
|
|
26
|
+
}
|
|
27
|
+
setTargetDistance(d) {
|
|
28
|
+
this.config.targetDistance = Math.max(0.3, Math.min(5.0, d));
|
|
29
|
+
}
|
|
30
|
+
reset() {
|
|
31
|
+
this.smoothedLinear = 0;
|
|
32
|
+
this.smoothedAngular = 0;
|
|
33
|
+
this.lastTwist = { linearX: 0, angularZ: 0 };
|
|
34
|
+
this.lastDetectionMs = Date.now();
|
|
35
|
+
}
|
|
36
|
+
/** Compute next twist. Pass null when no person is detected this tick. */
|
|
37
|
+
update(target) {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
if (!target) {
|
|
40
|
+
if (now - this.lastDetectionMs > this.config.watchdogTimeoutMs) {
|
|
41
|
+
this.smoothedLinear = 0;
|
|
42
|
+
this.smoothedAngular = 0;
|
|
43
|
+
this.lastTwist = { linearX: 0, angularZ: 0 };
|
|
44
|
+
return this.lastTwist;
|
|
45
|
+
}
|
|
46
|
+
return this.lastTwist;
|
|
47
|
+
}
|
|
48
|
+
this.lastDetectionMs = now;
|
|
49
|
+
let distErr = target.z - this.config.targetDistance;
|
|
50
|
+
// angular error: pointing right (positive x) should turn right (negative angular_z)
|
|
51
|
+
let angErr = -Math.atan2(target.x, Math.max(target.z, 0.1));
|
|
52
|
+
if (Math.abs(distErr) < this.config.distanceDeadzone)
|
|
53
|
+
distErr = 0;
|
|
54
|
+
if (Math.abs(angErr) < this.config.angularDeadzone)
|
|
55
|
+
angErr = 0;
|
|
56
|
+
let linearCmd = this.config.kpDistance * distErr;
|
|
57
|
+
let angularCmd = this.config.kpAngular * angErr;
|
|
58
|
+
linearCmd = clamp(linearCmd, -this.config.maxLinearVel, this.config.maxLinearVel);
|
|
59
|
+
angularCmd = clamp(angularCmd, -this.config.maxAngularVel, this.config.maxAngularVel);
|
|
60
|
+
const a = this.config.smoothingFactor;
|
|
61
|
+
this.smoothedLinear = a * linearCmd + (1 - a) * this.smoothedLinear;
|
|
62
|
+
this.smoothedAngular = a * angularCmd + (1 - a) * this.smoothedAngular;
|
|
63
|
+
this.lastTwist = { linearX: this.smoothedLinear, angularZ: this.smoothedAngular };
|
|
64
|
+
return this.lastTwist;
|
|
65
|
+
}
|
|
66
|
+
getLastTwist() {
|
|
67
|
+
return this.lastTwist;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function clamp(v, lo, hi) {
|
|
71
|
+
return Math.max(lo, Math.min(hi, v));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/follow-me/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YOLOv8n person detector for the MCP-side follow-me loop.
|
|
3
|
+
*
|
|
4
|
+
* Loads a YOLOv8n ONNX model and runs person-only detection on a single JPEG/PNG
|
|
5
|
+
* frame. Image decoded with sharp; inference via onnxruntime-node (CPU).
|
|
6
|
+
*
|
|
7
|
+
* Model lookup order:
|
|
8
|
+
* 1. AGENTICROS_YOLOV8_MODEL env var (absolute path)
|
|
9
|
+
* 2. ~/.agenticros/models/yolov8n.onnx
|
|
10
|
+
* If the file is missing it is downloaded from AGENTICROS_YOLOV8_URL (or a default
|
|
11
|
+
* public mirror). 6 MB, one-time.
|
|
12
|
+
*/
|
|
13
|
+
export interface PersonDetection {
|
|
14
|
+
/** Bounding box in original image pixel coordinates. */
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
/** Center of the bbox (image pixels). */
|
|
20
|
+
cx: number;
|
|
21
|
+
cy: number;
|
|
22
|
+
/** Detection confidence [0,1]. */
|
|
23
|
+
confidence: number;
|
|
24
|
+
}
|
|
25
|
+
export interface DetectorOptions {
|
|
26
|
+
/** Score threshold for filtering raw detections (default 0.4). */
|
|
27
|
+
scoreThreshold?: number;
|
|
28
|
+
/** IoU threshold for NMS (default 0.5). */
|
|
29
|
+
iouThreshold?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare class PersonDetector {
|
|
32
|
+
private session;
|
|
33
|
+
private readonly scoreThreshold;
|
|
34
|
+
private readonly iouThreshold;
|
|
35
|
+
constructor(opts?: DetectorOptions);
|
|
36
|
+
load(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Detect people in a JPEG/PNG image buffer.
|
|
39
|
+
*
|
|
40
|
+
* Returns bounding boxes in the original image's pixel space.
|
|
41
|
+
*/
|
|
42
|
+
detect(image: Buffer | Uint8Array): Promise<{
|
|
43
|
+
width: number;
|
|
44
|
+
height: number;
|
|
45
|
+
persons: PersonDetection[];
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Detect a single COCO class (0..79) in a JPEG/PNG image buffer.
|
|
49
|
+
* 0=person, 67=cell phone, 56=chair, ... see find-object/coco-classes.ts.
|
|
50
|
+
*/
|
|
51
|
+
detectClass(image: Buffer | Uint8Array, classId: number): Promise<{
|
|
52
|
+
width: number;
|
|
53
|
+
height: number;
|
|
54
|
+
detections: PersonDetection[];
|
|
55
|
+
}>;
|
|
56
|
+
dispose(): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/follow-me/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkDH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6FD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,IAAI,GAAE,eAAoB;IAKhC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAKhH;;;OAGG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,GAAG,UAAU,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAuFtE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
|