mirror of
https://github.com/soconnor0919/robot-plugins.git
synced 2026-02-04 23:46:33 -05:00
Update for new HRIStudio build
This commit is contained in:
44
plugins/README.md
Normal file
44
plugins/README.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# Robot Plugins
|
||||
|
||||
This directory contains individual robot plugin definitions for the HRIStudio platform.
|
||||
|
||||
## Available Plugins
|
||||
|
||||
### Mobile Robots
|
||||
|
||||
- **turtlebot3-burger.json** - Compact educational robot platform
|
||||
- **turtlebot3-waffle.json** - Extended TurtleBot3 with camera and additional sensors
|
||||
|
||||
### Humanoid Robots
|
||||
|
||||
- **nao-humanoid.json** - NAO humanoid robot for social interaction research
|
||||
|
||||
## Plugin Structure
|
||||
|
||||
Each plugin file defines:
|
||||
|
||||
- Robot specifications and capabilities
|
||||
- Available actions for experiment design
|
||||
- Communication protocol configuration
|
||||
- Asset references for UI display
|
||||
|
||||
## Adding New Plugins
|
||||
|
||||
1. Create a new JSON file following the schema
|
||||
2. Add robot assets to the `assets/` directory
|
||||
3. Update `index.json` to include the new plugin
|
||||
4. Test the plugin definition for validity
|
||||
|
||||
## Schema Validation
|
||||
|
||||
All plugins must conform to the HRIStudio plugin schema. See `../docs/schema.md` for complete documentation.
|
||||
|
||||
## Asset Requirements
|
||||
|
||||
Each plugin should include:
|
||||
- Thumbnail image (200x150px)
|
||||
- Main robot image
|
||||
- Multiple angle views
|
||||
- Manufacturer logo (optional)
|
||||
|
||||
Assets are served relative to the repository root URL.
|
||||
@@ -1,3 +1 @@
|
||||
[
|
||||
"turtlebot3-burger.json"
|
||||
]
|
||||
["turtlebot3-burger.json", "turtlebot3-waffle.json", "nao-humanoid.json"]
|
||||
|
||||
315
plugins/nao-humanoid.json
Normal file
315
plugins/nao-humanoid.json
Normal file
@@ -0,0 +1,315 @@
|
||||
{
|
||||
"robotId": "nao-humanoid",
|
||||
"name": "NAO Humanoid Robot",
|
||||
"description": "Autonomous, programmable humanoid robot designed for education, research, and human-robot interaction studies",
|
||||
"platform": "NAOqi",
|
||||
"version": "1.0.0",
|
||||
"pluginApiVersion": "1.0",
|
||||
"hriStudioVersion": ">=0.1.0",
|
||||
"trustLevel": "verified",
|
||||
"category": "humanoid-robot",
|
||||
|
||||
"manufacturer": {
|
||||
"name": "SoftBank Robotics",
|
||||
"website": "https://www.softbankrobotics.com/",
|
||||
"support": "https://developer.softbankrobotics.com/"
|
||||
},
|
||||
|
||||
"documentation": {
|
||||
"mainUrl": "https://developer.softbankrobotics.com/nao6/nao-documentation",
|
||||
"apiReference": "https://developer.softbankrobotics.com/nao6/naoqi-developer-guide",
|
||||
"wikiUrl": "https://en.wikipedia.org/wiki/Nao_(robot)",
|
||||
"videoUrl": "https://www.youtube.com/watch?v=nNbj2G3GmAg"
|
||||
},
|
||||
|
||||
"assets": {
|
||||
"thumbnailUrl": "assets/nao-humanoid/thumb.png",
|
||||
"images": {
|
||||
"main": "assets/nao-humanoid/main.jpg",
|
||||
"angles": {
|
||||
"front": "assets/nao-humanoid/front.png",
|
||||
"side": "assets/nao-humanoid/side.png",
|
||||
"back": "assets/nao-humanoid/back.png"
|
||||
},
|
||||
"logo": "assets/nao-humanoid/logo.png"
|
||||
},
|
||||
"model": {
|
||||
"format": "URDF",
|
||||
"url": "https://github.com/ros-naoqi/nao_robot/raw/master/nao_description/urdf/nao.urdf"
|
||||
}
|
||||
},
|
||||
|
||||
"specs": {
|
||||
"dimensions": {
|
||||
"length": 0.275,
|
||||
"width": 0.311,
|
||||
"height": 0.574,
|
||||
"weight": 5.4
|
||||
},
|
||||
"capabilities": ["bipedal_walking", "speech_synthesis", "speech_recognition", "computer_vision", "gestures", "led_control"],
|
||||
"maxSpeed": 0.55,
|
||||
"batteryLife": 1.5
|
||||
},
|
||||
|
||||
"naoqiConfig": {
|
||||
"defaultIP": "nao.local",
|
||||
"defaultPort": 9559,
|
||||
"modules": ["ALMotion", "ALTextToSpeech", "ALSpeechRecognition", "ALLeds", "ALAnimationPlayer", "ALBehaviorManager"]
|
||||
},
|
||||
|
||||
"actions": [
|
||||
{
|
||||
"id": "say_text",
|
||||
"name": "Say Text",
|
||||
"description": "Make the robot speak using text-to-speech",
|
||||
"category": "interaction",
|
||||
"icon": "volume-2",
|
||||
"timeout": 15000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"default": "Hello, I am NAO!",
|
||||
"description": "Text to speak"
|
||||
},
|
||||
"volume": {
|
||||
"type": "number",
|
||||
"minimum": 0.1,
|
||||
"maximum": 1.0,
|
||||
"default": 0.7,
|
||||
"description": "Speech volume (0.1 to 1.0)"
|
||||
},
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"minimum": 50,
|
||||
"maximum": 400,
|
||||
"default": 100,
|
||||
"description": "Speech speed in words per minute"
|
||||
}
|
||||
},
|
||||
"required": ["text"]
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALTextToSpeech",
|
||||
"method": "say",
|
||||
"parameters": ["text"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "walk_to_position",
|
||||
"name": "Walk to Position",
|
||||
"description": "Walk to a specific position relative to current location",
|
||||
"category": "movement",
|
||||
"icon": "footprints",
|
||||
"timeout": 30000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"x": {
|
||||
"type": "number",
|
||||
"minimum": -2.0,
|
||||
"maximum": 2.0,
|
||||
"default": 0.5,
|
||||
"description": "Forward distance in meters"
|
||||
},
|
||||
"y": {
|
||||
"type": "number",
|
||||
"minimum": -1.0,
|
||||
"maximum": 1.0,
|
||||
"default": 0.0,
|
||||
"description": "Sideways distance in meters (left is positive)"
|
||||
},
|
||||
"theta": {
|
||||
"type": "number",
|
||||
"minimum": -3.14159,
|
||||
"maximum": 3.14159,
|
||||
"default": 0.0,
|
||||
"description": "Turn angle in radians"
|
||||
}
|
||||
},
|
||||
"required": ["x", "y", "theta"]
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALMotion",
|
||||
"method": "walkTo",
|
||||
"parameters": ["x", "y", "theta"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "play_animation",
|
||||
"name": "Play Animation",
|
||||
"description": "Play a predefined animation or gesture",
|
||||
"category": "interaction",
|
||||
"icon": "zap",
|
||||
"timeout": 20000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"animation": {
|
||||
"type": "string",
|
||||
"enum": ["Hello", "Goodbye", "Excited", "Thinking", "Clap", "Dance", "BowShort", "WipeForehead"],
|
||||
"default": "Hello",
|
||||
"description": "Animation to play"
|
||||
}
|
||||
},
|
||||
"required": ["animation"]
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALAnimationPlayer",
|
||||
"method": "run",
|
||||
"parameters": ["animations/Stand/Gestures/{animation}"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "set_led_color",
|
||||
"name": "Set LED Color",
|
||||
"description": "Change the color of NAO's eye LEDs",
|
||||
"category": "interaction",
|
||||
"icon": "lightbulb",
|
||||
"timeout": 5000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"color": {
|
||||
"type": "string",
|
||||
"enum": ["red", "green", "blue", "yellow", "magenta", "cyan", "white", "orange", "pink"],
|
||||
"default": "blue",
|
||||
"description": "LED color"
|
||||
},
|
||||
"intensity": {
|
||||
"type": "number",
|
||||
"minimum": 0.0,
|
||||
"maximum": 1.0,
|
||||
"default": 1.0,
|
||||
"description": "LED brightness (0.0 to 1.0)"
|
||||
}
|
||||
},
|
||||
"required": ["color"]
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALLeds",
|
||||
"method": "fadeRGB",
|
||||
"parameters": ["FaceLeds", "color", "intensity", 1.0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "sit_down",
|
||||
"name": "Sit Down",
|
||||
"description": "Make the robot sit down",
|
||||
"category": "movement",
|
||||
"icon": "minus-square",
|
||||
"timeout": 10000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
"required": []
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALMotion",
|
||||
"method": "rest",
|
||||
"parameters": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "stand_up",
|
||||
"name": "Stand Up",
|
||||
"description": "Make the robot stand up from sitting position",
|
||||
"category": "movement",
|
||||
"icon": "plus-square",
|
||||
"timeout": 10000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
"required": []
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALMotion",
|
||||
"method": "wakeUp",
|
||||
"parameters": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "listen_for_speech",
|
||||
"name": "Listen for Speech",
|
||||
"description": "Listen for specific words or phrases",
|
||||
"category": "sensors",
|
||||
"icon": "mic",
|
||||
"timeout": 30000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"vocabulary": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"default": ["yes", "no", "hello", "goodbye"],
|
||||
"description": "Words to listen for"
|
||||
},
|
||||
"confidence": {
|
||||
"type": "number",
|
||||
"minimum": 0.3,
|
||||
"maximum": 1.0,
|
||||
"default": 0.5,
|
||||
"description": "Minimum confidence threshold"
|
||||
}
|
||||
},
|
||||
"required": ["vocabulary"]
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALSpeechRecognition",
|
||||
"method": "setVocabulary",
|
||||
"parameters": ["vocabulary", "confidence"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "turn_head",
|
||||
"name": "Turn Head",
|
||||
"description": "Turn the robot's head to look in a specific direction",
|
||||
"category": "movement",
|
||||
"icon": "rotate-ccw",
|
||||
"timeout": 5000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"yaw": {
|
||||
"type": "number",
|
||||
"minimum": -2.0857,
|
||||
"maximum": 2.0857,
|
||||
"default": 0.0,
|
||||
"description": "Head yaw angle in radians (left-right)"
|
||||
},
|
||||
"pitch": {
|
||||
"type": "number",
|
||||
"minimum": -0.6720,
|
||||
"maximum": 0.5149,
|
||||
"default": 0.0,
|
||||
"description": "Head pitch angle in radians (up-down)"
|
||||
},
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"minimum": 0.1,
|
||||
"maximum": 1.0,
|
||||
"default": 0.3,
|
||||
"description": "Movement speed fraction"
|
||||
}
|
||||
},
|
||||
"required": ["yaw", "pitch"]
|
||||
},
|
||||
"naoqi": {
|
||||
"module": "ALMotion",
|
||||
"method": "setAngles",
|
||||
"parameters": [["HeadYaw", "HeadPitch"], ["yaw", "pitch"], "speed"]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -4,7 +4,11 @@
|
||||
"description": "A compact, affordable, programmable, ROS2-based mobile robot for education and research",
|
||||
"platform": "ROS2",
|
||||
"version": "2.0.0",
|
||||
|
||||
"pluginApiVersion": "1.0",
|
||||
"hriStudioVersion": ">=0.1.0",
|
||||
"trustLevel": "official",
|
||||
"category": "mobile-robot",
|
||||
|
||||
"manufacturer": {
|
||||
"name": "ROBOTIS",
|
||||
"website": "https://www.robotis.com/",
|
||||
@@ -42,12 +46,7 @@
|
||||
"height": 0.192,
|
||||
"weight": 1.0
|
||||
},
|
||||
"capabilities": [
|
||||
"differential_drive",
|
||||
"lidar",
|
||||
"imu",
|
||||
"odometry"
|
||||
],
|
||||
"capabilities": ["differential_drive", "lidar", "imu", "odometry"],
|
||||
"maxSpeed": 0.22,
|
||||
"batteryLife": 2.5
|
||||
},
|
||||
@@ -66,31 +65,29 @@
|
||||
|
||||
"actions": [
|
||||
{
|
||||
"actionId": "move-velocity",
|
||||
"type": "move",
|
||||
"title": "Set Velocity",
|
||||
"id": "move_velocity",
|
||||
"name": "Set Velocity",
|
||||
"description": "Control the robot's linear and angular velocity",
|
||||
"category": "movement",
|
||||
"icon": "navigation",
|
||||
"parameters": {
|
||||
"timeout": 30000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"linear": {
|
||||
"type": "number",
|
||||
"title": "Linear Velocity",
|
||||
"description": "Forward/backward velocity",
|
||||
"default": 0,
|
||||
"minimum": -0.22,
|
||||
"maximum": 0.22,
|
||||
"unit": "m/s"
|
||||
"default": 0,
|
||||
"description": "Forward/backward velocity in m/s"
|
||||
},
|
||||
"angular": {
|
||||
"type": "number",
|
||||
"title": "Angular Velocity",
|
||||
"description": "Rotational velocity",
|
||||
"default": 0,
|
||||
"minimum": -2.84,
|
||||
"maximum": 2.84,
|
||||
"unit": "rad/s"
|
||||
"default": 0,
|
||||
"description": "Rotational velocity in rad/s"
|
||||
}
|
||||
},
|
||||
"required": ["linear", "angular"]
|
||||
@@ -111,34 +108,30 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"actionId": "move-to-pose",
|
||||
"type": "move",
|
||||
"title": "Move to Position",
|
||||
"id": "move_to_pose",
|
||||
"name": "Move to Position",
|
||||
"description": "Navigate to a specific position on the map",
|
||||
"category": "movement",
|
||||
"icon": "target",
|
||||
"parameters": {
|
||||
"timeout": 60000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"x": {
|
||||
"type": "number",
|
||||
"title": "X Position",
|
||||
"description": "X coordinate in meters",
|
||||
"default": 0,
|
||||
"unit": "m"
|
||||
"description": "X coordinate in meters"
|
||||
},
|
||||
"y": {
|
||||
"type": "number",
|
||||
"title": "Y Position",
|
||||
"description": "Y coordinate in meters",
|
||||
"default": 0,
|
||||
"unit": "m"
|
||||
"description": "Y coordinate in meters"
|
||||
},
|
||||
"theta": {
|
||||
"type": "number",
|
||||
"title": "Orientation",
|
||||
"description": "Final orientation",
|
||||
"default": 0,
|
||||
"unit": "rad"
|
||||
"description": "Final orientation in radians"
|
||||
}
|
||||
},
|
||||
"required": ["x", "y", "theta"]
|
||||
@@ -151,6 +144,37 @@
|
||||
"transformFn": "transformToPoseStamped"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "stop_robot",
|
||||
"name": "Stop Robot",
|
||||
"description": "Immediately stop all robot movement",
|
||||
"category": "movement",
|
||||
"icon": "square",
|
||||
"timeout": 5000,
|
||||
"retryable": false,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
"required": []
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "geometry_msgs/msg/Twist",
|
||||
"topic": "/cmd_vel",
|
||||
"payloadMapping": {
|
||||
"type": "static",
|
||||
"payload": {
|
||||
"linear": { "x": 0.0, "y": 0.0, "z": 0.0 },
|
||||
"angular": { "x": 0.0, "y": 0.0, "z": 0.0 }
|
||||
}
|
||||
},
|
||||
"qos": {
|
||||
"reliability": "reliable",
|
||||
"durability": "volatile",
|
||||
"history": "keep_last",
|
||||
"depth": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
367
plugins/turtlebot3-waffle.json
Normal file
367
plugins/turtlebot3-waffle.json
Normal file
@@ -0,0 +1,367 @@
|
||||
{
|
||||
"robotId": "turtlebot3-waffle",
|
||||
"name": "TurtleBot3 Waffle",
|
||||
"description": "Extended TurtleBot3 platform with additional sensors and computing power for advanced research applications",
|
||||
"platform": "ROS2",
|
||||
"version": "2.0.0",
|
||||
"pluginApiVersion": "1.0",
|
||||
"hriStudioVersion": ">=0.1.0",
|
||||
"trustLevel": "official",
|
||||
"category": "mobile-robot",
|
||||
|
||||
"manufacturer": {
|
||||
"name": "ROBOTIS",
|
||||
"website": "https://www.robotis.com/",
|
||||
"support": "https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/"
|
||||
},
|
||||
|
||||
"documentation": {
|
||||
"mainUrl": "https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/",
|
||||
"apiReference": "https://emanual.robotis.com/docs/en/platform/turtlebot3/ros2_manipulation/",
|
||||
"wikiUrl": "https://wiki.ros.org/turtlebot3",
|
||||
"videoUrl": "https://www.youtube.com/watch?v=rVM994ZhsEM"
|
||||
},
|
||||
|
||||
"assets": {
|
||||
"thumbnailUrl": "assets/turtlebot3-waffle/thumb.png",
|
||||
"images": {
|
||||
"main": "assets/turtlebot3-waffle/main.jpg",
|
||||
"angles": {
|
||||
"front": "assets/turtlebot3-waffle/front.png",
|
||||
"side": "assets/turtlebot3-waffle/side.png",
|
||||
"top": "assets/turtlebot3-waffle/top.png"
|
||||
},
|
||||
"logo": "assets/turtlebot3-waffle/logo.png"
|
||||
},
|
||||
"model": {
|
||||
"format": "URDF",
|
||||
"url": "https://raw.githubusercontent.com/ROBOTIS-GIT/turtlebot3/master/turtlebot3_description/urdf/turtlebot3_waffle.urdf"
|
||||
}
|
||||
},
|
||||
|
||||
"specs": {
|
||||
"dimensions": {
|
||||
"length": 0.281,
|
||||
"width": 0.306,
|
||||
"height": 0.141,
|
||||
"weight": 1.8
|
||||
},
|
||||
"capabilities": [
|
||||
"differential_drive",
|
||||
"lidar",
|
||||
"imu",
|
||||
"odometry",
|
||||
"camera",
|
||||
"manipulation"
|
||||
],
|
||||
"maxSpeed": 0.26,
|
||||
"batteryLife": 2.8
|
||||
},
|
||||
|
||||
"ros2Config": {
|
||||
"namespace": "turtlebot3",
|
||||
"nodePrefix": "hri_studio",
|
||||
"defaultTopics": {
|
||||
"cmd_vel": "/cmd_vel",
|
||||
"odom": "/odom",
|
||||
"scan": "/scan",
|
||||
"imu": "/imu",
|
||||
"joint_states": "/joint_states",
|
||||
"camera": "/camera/image_raw",
|
||||
"camera_info": "/camera/camera_info"
|
||||
}
|
||||
},
|
||||
|
||||
"actions": [
|
||||
{
|
||||
"id": "move_velocity",
|
||||
"name": "Set Velocity",
|
||||
"description": "Control the robot's linear and angular velocity",
|
||||
"category": "movement",
|
||||
"icon": "navigation",
|
||||
"timeout": 30000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"linear": {
|
||||
"type": "number",
|
||||
"minimum": -0.26,
|
||||
"maximum": 0.26,
|
||||
"default": 0,
|
||||
"description": "Forward/backward velocity in m/s"
|
||||
},
|
||||
"angular": {
|
||||
"type": "number",
|
||||
"minimum": -1.82,
|
||||
"maximum": 1.82,
|
||||
"default": 0,
|
||||
"description": "Rotational velocity in rad/s"
|
||||
}
|
||||
},
|
||||
"required": ["linear", "angular"]
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "geometry_msgs/msg/Twist",
|
||||
"topic": "/cmd_vel",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "transformToTwist"
|
||||
},
|
||||
"qos": {
|
||||
"reliability": "reliable",
|
||||
"durability": "volatile",
|
||||
"history": "keep_last",
|
||||
"depth": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "move_to_pose",
|
||||
"name": "Navigate to Position",
|
||||
"description": "Navigate to a specific position on the map using autonomous navigation",
|
||||
"category": "movement",
|
||||
"icon": "target",
|
||||
"timeout": 120000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"x": {
|
||||
"type": "number",
|
||||
"default": 0,
|
||||
"description": "X coordinate in meters"
|
||||
},
|
||||
"y": {
|
||||
"type": "number",
|
||||
"default": 0,
|
||||
"description": "Y coordinate in meters"
|
||||
},
|
||||
"theta": {
|
||||
"type": "number",
|
||||
"default": 0,
|
||||
"description": "Final orientation in radians"
|
||||
}
|
||||
},
|
||||
"required": ["x", "y", "theta"]
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "geometry_msgs/msg/PoseStamped",
|
||||
"action": "/navigate_to_pose",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "transformToPoseStamped"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "capture_image",
|
||||
"name": "Capture Image",
|
||||
"description": "Capture an image from the robot's camera",
|
||||
"category": "sensors",
|
||||
"icon": "camera",
|
||||
"timeout": 10000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"default": "image_{timestamp}.jpg",
|
||||
"description": "Filename for the captured image"
|
||||
},
|
||||
"quality": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"default": 85,
|
||||
"description": "JPEG quality (1-100)"
|
||||
}
|
||||
},
|
||||
"required": ["filename"]
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "sensor_msgs/msg/Image",
|
||||
"topic": "/camera/image_raw",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "captureAndSaveImage"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "scan_environment",
|
||||
"name": "Scan Environment",
|
||||
"description": "Perform a 360-degree scan of the environment using LIDAR",
|
||||
"category": "sensors",
|
||||
"icon": "radar",
|
||||
"timeout": 15000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"duration": {
|
||||
"type": "number",
|
||||
"minimum": 1.0,
|
||||
"maximum": 10.0,
|
||||
"default": 3.0,
|
||||
"description": "Scan duration in seconds"
|
||||
},
|
||||
"save_data": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Save scan data to file"
|
||||
}
|
||||
},
|
||||
"required": ["duration"]
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "sensor_msgs/msg/LaserScan",
|
||||
"topic": "/scan",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "collectLaserScan"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "rotate_in_place",
|
||||
"name": "Rotate in Place",
|
||||
"description": "Rotate the robot by a specific angle",
|
||||
"category": "movement",
|
||||
"icon": "rotate-cw",
|
||||
"timeout": 30000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"angle": {
|
||||
"type": "number",
|
||||
"minimum": -6.28,
|
||||
"maximum": 6.28,
|
||||
"default": 1.57,
|
||||
"description": "Rotation angle in radians (positive = counterclockwise)"
|
||||
},
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"minimum": 0.1,
|
||||
"maximum": 1.0,
|
||||
"default": 0.5,
|
||||
"description": "Rotation speed as fraction of maximum"
|
||||
}
|
||||
},
|
||||
"required": ["angle"]
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "geometry_msgs/msg/Twist",
|
||||
"topic": "/cmd_vel",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "transformToRotation"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "follow_wall",
|
||||
"name": "Follow Wall",
|
||||
"description": "Follow a wall using LIDAR sensor feedback",
|
||||
"category": "movement",
|
||||
"icon": "move-3d",
|
||||
"timeout": 60000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"side": {
|
||||
"type": "string",
|
||||
"enum": ["left", "right"],
|
||||
"default": "right",
|
||||
"description": "Which side wall to follow"
|
||||
},
|
||||
"distance": {
|
||||
"type": "number",
|
||||
"minimum": 0.2,
|
||||
"maximum": 1.0,
|
||||
"default": 0.3,
|
||||
"description": "Desired distance from wall in meters"
|
||||
},
|
||||
"duration": {
|
||||
"type": "number",
|
||||
"minimum": 5.0,
|
||||
"maximum": 120.0,
|
||||
"default": 30.0,
|
||||
"description": "Duration to follow wall in seconds"
|
||||
}
|
||||
},
|
||||
"required": ["side", "distance", "duration"]
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "geometry_msgs/msg/Twist",
|
||||
"topic": "/cmd_vel",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "wallFollowing"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "emergency_stop",
|
||||
"name": "Emergency Stop",
|
||||
"description": "Immediately stop all robot movement and disable motors",
|
||||
"category": "movement",
|
||||
"icon": "octagon",
|
||||
"timeout": 2000,
|
||||
"retryable": false,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
"required": []
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "geometry_msgs/msg/Twist",
|
||||
"topic": "/cmd_vel",
|
||||
"payloadMapping": {
|
||||
"type": "static",
|
||||
"payload": {
|
||||
"linear": { "x": 0.0, "y": 0.0, "z": 0.0 },
|
||||
"angular": { "x": 0.0, "y": 0.0, "z": 0.0 }
|
||||
}
|
||||
},
|
||||
"qos": {
|
||||
"reliability": "reliable",
|
||||
"durability": "volatile",
|
||||
"history": "keep_last",
|
||||
"depth": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "get_robot_state",
|
||||
"name": "Get Robot State",
|
||||
"description": "Retrieve current robot position, orientation, and status",
|
||||
"category": "sensors",
|
||||
"icon": "info",
|
||||
"timeout": 5000,
|
||||
"retryable": true,
|
||||
"parameterSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"include_sensor_data": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "Include latest sensor readings in response"
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
},
|
||||
"ros2": {
|
||||
"messageType": "nav_msgs/msg/Odometry",
|
||||
"topic": "/odom",
|
||||
"payloadMapping": {
|
||||
"type": "transform",
|
||||
"transformFn": "extractRobotState"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user