mirror of
https://github.com/soconnor0919/robot-plugins.git
synced 2026-03-23 19:27:52 -04:00
- say_with_emotion: add NAOqi emotion markup to messageTemplate - move_arm: add implementation config
1502 lines
40 KiB
JSON
Executable File
1502 lines
40 KiB
JSON
Executable File
{
|
|
"robotId": "nao6-ros2",
|
|
"name": "NAO6 Robot (ROS2 Integration)",
|
|
"description": "NAO V6 humanoid robot with enhanced ROS2 integration via naoqi_driver2, featuring comprehensive movement control, advanced speech synthesis, emotion expression, multilingual support, and complete sensor monitoring. Verified.",
|
|
"platform": "ROS2",
|
|
"version": "2.2.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://github.com/ros-naoqi/naoqi_driver2",
|
|
"wikiUrl": "https://en.wikipedia.org/wiki/Nao_(robot)",
|
|
"videoUrl": "https://www.youtube.com/watch?v=nNbj2G3GmAg"
|
|
},
|
|
"assets": {
|
|
"thumbnailUrl": "assets/nao6-ros2/thumb.png",
|
|
"images": {
|
|
"main": "assets/nao6-ros2/main.jpg",
|
|
"angles": {
|
|
"front": "assets/nao6-ros2/front.png",
|
|
"side": "assets/nao6-ros2/side.png",
|
|
"top": "assets/nao6-ros2/top.png"
|
|
},
|
|
"logo": "assets/nao6-ros2/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",
|
|
"tactile_sensing",
|
|
"ultrasonic_ranging",
|
|
"inertial_measurement"
|
|
],
|
|
"maxSpeed": 0.55,
|
|
"batteryLife": 1.5
|
|
},
|
|
"ros2Config": {
|
|
"namespace": "nao",
|
|
"nodePrefix": "hri_studio",
|
|
"defaultTopics": {
|
|
"cmd_vel": "/cmd_vel",
|
|
"odom": "/odom",
|
|
"joint_states": "/joint_states",
|
|
"joint_angles": "/joint_angles",
|
|
"camera_front": "/camera/front/image_raw",
|
|
"camera_bottom": "/camera/bottom/image_raw",
|
|
"imu": "/imu/torso",
|
|
"speech": "/speech",
|
|
"bumper": "/bumper",
|
|
"hand_touch": "/hand_touch",
|
|
"head_touch": "/head_touch",
|
|
"sonar_left": "/sonar/left",
|
|
"sonar_right": "/sonar/right",
|
|
"info": "/info"
|
|
}
|
|
},
|
|
"settingsSchema": {
|
|
"type": "object",
|
|
"title": "NAO6 Robot Settings",
|
|
"description": "Configure robot behavior and connection parameters for this study",
|
|
"properties": {
|
|
"speech": {
|
|
"type": "object",
|
|
"title": "Speech Settings",
|
|
"properties": {
|
|
"voice": {
|
|
"type": "string",
|
|
"title": "Voice",
|
|
"description": "Text-to-speech voice language",
|
|
"enum": [
|
|
"naoenu",
|
|
"naofrf",
|
|
"naoges",
|
|
"naojpj",
|
|
"naokrk",
|
|
"naozhs"
|
|
],
|
|
"enumNames": [
|
|
"English (US)",
|
|
"French",
|
|
"German",
|
|
"Japanese",
|
|
"Korean",
|
|
"Chinese"
|
|
],
|
|
"default": "naoenu"
|
|
},
|
|
"speed": {
|
|
"type": "number",
|
|
"title": "Speech Speed",
|
|
"description": "Speech speed percentage (50-400%)",
|
|
"minimum": 50,
|
|
"maximum": 400,
|
|
"default": 100
|
|
},
|
|
"pitch": {
|
|
"type": "number",
|
|
"title": "Voice Pitch",
|
|
"description": "Voice pitch percentage (50-200%)",
|
|
"minimum": 50,
|
|
"maximum": 200,
|
|
"default": 100
|
|
},
|
|
"volume": {
|
|
"type": "number",
|
|
"title": "Volume",
|
|
"description": "Speech volume percentage (0-100%)",
|
|
"minimum": 0,
|
|
"maximum": 100,
|
|
"default": 80
|
|
}
|
|
}
|
|
},
|
|
"movement": {
|
|
"type": "object",
|
|
"title": "Movement Settings",
|
|
"properties": {
|
|
"defaultSpeed": {
|
|
"type": "number",
|
|
"title": "Default Speed",
|
|
"description": "Default movement speed multiplier (0.1-1.0)",
|
|
"minimum": 0.1,
|
|
"maximum": 1.0,
|
|
"default": 0.5
|
|
},
|
|
"safetyMode": {
|
|
"type": "boolean",
|
|
"title": "Safety Mode",
|
|
"description": "Enable movement safety limits and collision detection",
|
|
"default": true
|
|
},
|
|
"stiffness": {
|
|
"type": "number",
|
|
"title": "Joint Stiffness",
|
|
"description": "Default joint stiffness (0.0-1.0)",
|
|
"minimum": 0.0,
|
|
"maximum": 1.0,
|
|
"default": 0.9
|
|
}
|
|
}
|
|
},
|
|
"connection": {
|
|
"type": "object",
|
|
"title": "Connection Settings",
|
|
"properties": {
|
|
"rosbridgeUrl": {
|
|
"type": "string",
|
|
"title": "ROS Bridge URL",
|
|
"description": "WebSocket URL for ROS bridge connection",
|
|
"default": "ws://localhost:9090",
|
|
"pattern": "^wss?://.+"
|
|
},
|
|
"reconnectAttempts": {
|
|
"type": "integer",
|
|
"title": "Reconnect Attempts",
|
|
"description": "Number of automatic reconnection attempts",
|
|
"minimum": 1,
|
|
"maximum": 10,
|
|
"default": 3
|
|
},
|
|
"connectionTimeout": {
|
|
"type": "integer",
|
|
"title": "Connection Timeout",
|
|
"description": "Connection timeout in milliseconds",
|
|
"minimum": 1000,
|
|
"maximum": 30000,
|
|
"default": 5000
|
|
}
|
|
}
|
|
},
|
|
"behavior": {
|
|
"type": "object",
|
|
"title": "Behavior Settings",
|
|
"properties": {
|
|
"autonomousLifeEnabled": {
|
|
"type": "boolean",
|
|
"title": "Autonomous Life Default",
|
|
"description": "Default state for autonomous life on connection",
|
|
"default": true
|
|
},
|
|
"breathingEnabled": {
|
|
"type": "boolean",
|
|
"title": "Breathing Animation",
|
|
"description": "Enable idle breathing animation",
|
|
"default": true
|
|
},
|
|
"awarenessEnabled": {
|
|
"type": "boolean",
|
|
"title": "Basic Awareness",
|
|
"description": "Enable basic awareness behaviors",
|
|
"default": false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"actions": [
|
|
{
|
|
"id": "walk_velocity",
|
|
"name": "Walk with Velocity",
|
|
"description": "Control robot walking with linear and angular velocities",
|
|
"category": "movement",
|
|
"icon": "navigation",
|
|
"timeout": 5000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"linear": {
|
|
"type": "number",
|
|
"minimum": -0.55,
|
|
"maximum": 0.55,
|
|
"default": 0.0,
|
|
"description": "Forward velocity in m/s"
|
|
},
|
|
"angular": {
|
|
"type": "number",
|
|
"minimum": -2.0,
|
|
"maximum": 2.0,
|
|
"default": 0.0,
|
|
"description": "Angular 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": "walk_forward",
|
|
"name": "Walk Forward",
|
|
"description": "Make the robot walk forward at specified speed",
|
|
"category": "movement",
|
|
"icon": "arrow-up",
|
|
"timeout": 30000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.01,
|
|
"maximum": 0.3,
|
|
"default": 0.1,
|
|
"description": "Walking speed in m/s"
|
|
},
|
|
"duration": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 30,
|
|
"default": 0,
|
|
"description": "Duration to walk in seconds (0 = indefinite)"
|
|
}
|
|
},
|
|
"required": [
|
|
"speed"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"topic": "/cmd_vel",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"linear": {
|
|
"x": "{{speed}}",
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/cmd_vel",
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"messageTemplate": {
|
|
"linear": {
|
|
"x": "{{speed}}",
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "walk_backward",
|
|
"name": "Walk Backward",
|
|
"description": "Make the robot walk backward at specified speed",
|
|
"category": "movement",
|
|
"icon": "arrow-down",
|
|
"timeout": 30000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.01,
|
|
"maximum": 0.3,
|
|
"default": 0.1,
|
|
"description": "Walking speed in m/s"
|
|
},
|
|
"duration": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 30,
|
|
"default": 0,
|
|
"description": "Duration to walk in seconds (0 = indefinite)"
|
|
}
|
|
},
|
|
"required": [
|
|
"speed"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"topic": "/cmd_vel",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"linear": {
|
|
"x": "-{{speed}}",
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/cmd_vel",
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"messageTemplate": {
|
|
"linear": {
|
|
"x": "-{{speed}}",
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "turn_left",
|
|
"name": "Turn Left",
|
|
"description": "Make the robot turn left at specified angular speed",
|
|
"category": "movement",
|
|
"icon": "rotate-ccw",
|
|
"timeout": 30000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.1,
|
|
"maximum": 1.0,
|
|
"default": 0.3,
|
|
"description": "Angular speed in rad/s"
|
|
},
|
|
"duration": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 30,
|
|
"default": 0,
|
|
"description": "Duration to turn in seconds (0 = indefinite)"
|
|
}
|
|
},
|
|
"required": [
|
|
"speed"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"topic": "/cmd_vel",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"linear": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": "{{speed}}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/cmd_vel",
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"messageTemplate": {
|
|
"linear": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": "{{speed}}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "turn_right",
|
|
"name": "Turn Right",
|
|
"description": "Make the robot turn right at specified angular speed",
|
|
"category": "movement",
|
|
"icon": "rotate-cw",
|
|
"timeout": 30000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.1,
|
|
"maximum": 1.0,
|
|
"default": 0.3,
|
|
"description": "Angular speed in rad/s"
|
|
},
|
|
"duration": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 30,
|
|
"default": 0,
|
|
"description": "Duration to turn in seconds (0 = indefinite)"
|
|
}
|
|
},
|
|
"required": [
|
|
"speed"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"topic": "/cmd_vel",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"linear": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": "-{{speed}}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/cmd_vel",
|
|
"messageType": "geometry_msgs/msg/Twist",
|
|
"messageTemplate": {
|
|
"linear": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"angular": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": "-{{speed}}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "stop_walking",
|
|
"name": "Stop Walking",
|
|
"description": "Immediately stop robot movement",
|
|
"category": "movement",
|
|
"icon": "square",
|
|
"timeout": 3000,
|
|
"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": "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 from NAO!",
|
|
"description": "Text to speak"
|
|
}
|
|
},
|
|
"required": [
|
|
"text"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "std_msgs/msg/String",
|
|
"topic": "/speech",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "transformToStringMessage"
|
|
},
|
|
"qos": {
|
|
"reliability": "reliable",
|
|
"durability": "volatile"
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/speech",
|
|
"messageType": "std_msgs/msg/String",
|
|
"messageTemplate": {
|
|
"data": "{{text}}"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "say_with_emotion",
|
|
"name": "Say Text with Emotion",
|
|
"description": "Speak text with emotional expression using SSML-like markup",
|
|
"category": "interaction",
|
|
"icon": "heart",
|
|
"timeout": 15000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"text": {
|
|
"type": "string",
|
|
"default": "Hello! I'm feeling great today!",
|
|
"description": "Text for the robot to speak"
|
|
},
|
|
"emotion": {
|
|
"type": "string",
|
|
"enum": [
|
|
"neutral",
|
|
"happy",
|
|
"sad",
|
|
"excited",
|
|
"calm"
|
|
],
|
|
"default": "neutral",
|
|
"description": "Emotional tone for speech"
|
|
},
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.5,
|
|
"maximum": 2.0,
|
|
"default": 1.0,
|
|
"description": "Speech speed multiplier"
|
|
}
|
|
},
|
|
"required": [
|
|
"text"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "std_msgs/msg/String",
|
|
"topic": "/speech",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"data": "\\rspd={{speed}}\\\\rst={{emotion}}\\{{text}}"
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/speech",
|
|
"messageType": "std_msgs/msg/String",
|
|
"messageTemplate": {
|
|
"data": "\\\\rspd={{speed}}\\\\rst={{emotion}}\\{{text}}"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "set_volume",
|
|
"name": "Set Volume",
|
|
"description": "Adjust the robot's audio volume level",
|
|
"category": "interaction",
|
|
"icon": "volume-x",
|
|
"timeout": 5000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"volume": {
|
|
"type": "number",
|
|
"minimum": 0.0,
|
|
"maximum": 1.0,
|
|
"default": 0.5,
|
|
"description": "Volume level (0.0 = silent, 1.0 = maximum)"
|
|
}
|
|
},
|
|
"required": [
|
|
"volume"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "std_msgs/msg/Float32",
|
|
"topic": "/audio_volume",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"data": "{{volume}}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "set_language",
|
|
"name": "Set Language",
|
|
"description": "Change the robot's speech language",
|
|
"category": "interaction",
|
|
"icon": "globe",
|
|
"timeout": 5000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"language": {
|
|
"type": "string",
|
|
"enum": [
|
|
"en-US",
|
|
"en-GB",
|
|
"fr-FR",
|
|
"de-DE",
|
|
"es-ES",
|
|
"it-IT",
|
|
"ja-JP",
|
|
"ko-KR",
|
|
"zh-CN"
|
|
],
|
|
"default": "en-US",
|
|
"description": "Speech language"
|
|
}
|
|
},
|
|
"required": [
|
|
"language"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "std_msgs/msg/String",
|
|
"topic": "/set_language",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"data": "{{language}}"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "move_head",
|
|
"name": "Move Head",
|
|
"description": "Control head orientation (yaw and pitch)",
|
|
"category": "movement",
|
|
"icon": "eye",
|
|
"timeout": 10000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"yaw": {
|
|
"type": "number",
|
|
"minimum": -2.09,
|
|
"maximum": 2.09,
|
|
"default": 0,
|
|
"description": "Head yaw angle in radians"
|
|
},
|
|
"pitch": {
|
|
"type": "number",
|
|
"minimum": -0.67,
|
|
"maximum": 0.51,
|
|
"default": 0,
|
|
"description": "Head pitch angle in radians"
|
|
},
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.1,
|
|
"maximum": 1.0,
|
|
"default": 0.3,
|
|
"description": "Movement speed (0.1 = slow, 1.0 = fast)"
|
|
}
|
|
},
|
|
"required": [
|
|
"yaw",
|
|
"pitch"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"topic": "/joint_angles",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": [
|
|
"HeadYaw",
|
|
"HeadPitch"
|
|
],
|
|
"joint_angles": [
|
|
"{{yaw}}",
|
|
"{{pitch}}"
|
|
],
|
|
"speed": "{{speed}}"
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["HeadYaw", "HeadPitch"],
|
|
"joint_angles": ["{{yaw}}", "{{pitch}}"],
|
|
"speed": "{{speed}}"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "move_arm",
|
|
"name": "Move Arm",
|
|
"description": "Control arm joint positions",
|
|
"category": "movement",
|
|
"icon": "hand",
|
|
"timeout": 10000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"arm": {
|
|
"type": "string",
|
|
"enum": [
|
|
"left",
|
|
"right"
|
|
],
|
|
"default": "right",
|
|
"description": "Which arm to control"
|
|
},
|
|
"shoulder_pitch": {
|
|
"type": "number",
|
|
"minimum": -2.09,
|
|
"maximum": 2.09,
|
|
"default": 1.4,
|
|
"description": "Shoulder pitch angle in radians"
|
|
},
|
|
"shoulder_roll": {
|
|
"type": "number",
|
|
"minimum": -0.31,
|
|
"maximum": 1.33,
|
|
"default": 0.2,
|
|
"description": "Shoulder roll angle in radians"
|
|
},
|
|
"elbow_yaw": {
|
|
"type": "number",
|
|
"minimum": -2.09,
|
|
"maximum": 2.09,
|
|
"default": 0,
|
|
"description": "Elbow yaw angle in radians"
|
|
},
|
|
"elbow_roll": {
|
|
"type": "number",
|
|
"minimum": -1.54,
|
|
"maximum": -0.03,
|
|
"default": -0.5,
|
|
"description": "Elbow roll angle in radians"
|
|
},
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.1,
|
|
"maximum": 1.0,
|
|
"default": 0.3,
|
|
"description": "Movement speed (0.1 = slow, 1.0 = fast)"
|
|
}
|
|
},
|
|
"required": [
|
|
"arm",
|
|
"shoulder_pitch",
|
|
"shoulder_roll",
|
|
"elbow_yaw",
|
|
"elbow_roll"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"topic": "/joint_angles",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": [
|
|
"{{arm === 'left' ? 'L' : 'R'}}ShoulderPitch",
|
|
"{{arm === 'left' ? 'L' : 'R'}}ShoulderRoll",
|
|
"{{arm === 'left' ? 'L' : 'R'}}ElbowYaw",
|
|
"{{arm === 'left' ? 'L' : 'R'}}ElbowRoll"
|
|
],
|
|
"joint_angles": [
|
|
"{{shoulder_pitch}}",
|
|
"{{shoulder_roll}}",
|
|
"{{elbow_yaw}}",
|
|
"{{elbow_roll}}"
|
|
],
|
|
"speed": "{{speed}}"
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["{{arm === 'left' ? 'L' : 'R'}}ShoulderPitch", "{{arm === 'left' ? 'L' : 'R'}}ShoulderRoll", "{{arm === 'left' ? 'L' : 'R'}}ElbowYaw", "{{arm === 'left' ? 'L' : 'R'}}ElbowRoll"],
|
|
"joint_angles": ["{{shoulder_pitch}}", "{{shoulder_roll}}", "{{elbow_yaw}}", "{{elbow_roll}}"],
|
|
"speed": "{{speed}}"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "set_joint_angle",
|
|
"name": "Set Joint Angle",
|
|
"description": "Control individual joint angles",
|
|
"category": "movement",
|
|
"icon": "settings",
|
|
"timeout": 10000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"joint_name": {
|
|
"type": "string",
|
|
"enum": [
|
|
"HeadYaw",
|
|
"HeadPitch",
|
|
"LShoulderPitch",
|
|
"LShoulderRoll",
|
|
"LElbowYaw",
|
|
"LElbowRoll",
|
|
"LWristYaw",
|
|
"RShoulderPitch",
|
|
"RShoulderRoll",
|
|
"RElbowYaw",
|
|
"RElbowRoll",
|
|
"RWristYaw",
|
|
"LHipYawPitch",
|
|
"LHipRoll",
|
|
"LHipPitch",
|
|
"LKneePitch",
|
|
"LAnklePitch",
|
|
"LAnkleRoll",
|
|
"RHipRoll",
|
|
"RHipPitch",
|
|
"RKneePitch",
|
|
"RAnklePitch",
|
|
"RAnkleRoll"
|
|
],
|
|
"default": "HeadYaw",
|
|
"description": "Joint to control"
|
|
},
|
|
"angle": {
|
|
"type": "number",
|
|
"minimum": -3.14159,
|
|
"maximum": 3.14159,
|
|
"default": 0.0,
|
|
"description": "Target angle in radians"
|
|
},
|
|
"speed": {
|
|
"type": "number",
|
|
"minimum": 0.01,
|
|
"maximum": 1.0,
|
|
"default": 0.2,
|
|
"description": "Movement speed (fraction of max)"
|
|
}
|
|
},
|
|
"required": [
|
|
"joint_name",
|
|
"angle"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"topic": "/joint_angles",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "transformToJointAngles"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "turn_head",
|
|
"name": "Turn Head",
|
|
"description": "Control head orientation",
|
|
"category": "movement",
|
|
"icon": "rotate-ccw",
|
|
"timeout": 8000,
|
|
"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.672,
|
|
"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"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"topic": "/joint_angles",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "transformToHeadMovement"
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["HeadYaw", "HeadPitch"],
|
|
"joint_angles": ["{{yaw}}", "{{pitch}}"],
|
|
"speed": "{{speed}}"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_camera_image",
|
|
"name": "Get Camera Image",
|
|
"description": "Capture image from front or bottom camera",
|
|
"category": "sensors",
|
|
"icon": "camera",
|
|
"timeout": 5000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"camera": {
|
|
"type": "string",
|
|
"enum": [
|
|
"front",
|
|
"bottom"
|
|
],
|
|
"default": "front",
|
|
"description": "Camera to use"
|
|
}
|
|
},
|
|
"required": [
|
|
"camera"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "sensor_msgs/msg/Image",
|
|
"topic": "/naoqi_driver/camera/{camera}/image_raw",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getCameraImage"
|
|
},
|
|
"qos": {
|
|
"reliability": "reliable",
|
|
"durability": "volatile"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_joint_states",
|
|
"name": "Get Joint States",
|
|
"description": "Read current joint positions and velocities",
|
|
"category": "sensors",
|
|
"icon": "activity",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {},
|
|
"required": []
|
|
},
|
|
"ros2": {
|
|
"messageType": "sensor_msgs/msg/JointState",
|
|
"topic": "/naoqi_driver/joint_states",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getJointStates"
|
|
},
|
|
"qos": {
|
|
"reliability": "reliable",
|
|
"durability": "volatile"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_imu_data",
|
|
"name": "Get IMU Data",
|
|
"description": "Read inertial measurement unit data from torso",
|
|
"category": "sensors",
|
|
"icon": "compass",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {},
|
|
"required": []
|
|
},
|
|
"ros2": {
|
|
"messageType": "sensor_msgs/msg/Imu",
|
|
"topic": "/naoqi_driver/imu/torso",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getImuData"
|
|
},
|
|
"qos": {
|
|
"reliability": "reliable",
|
|
"durability": "volatile"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_bumper_status",
|
|
"name": "Get Bumper Status",
|
|
"description": "Read foot bumper contact sensors",
|
|
"category": "sensors",
|
|
"icon": "zap",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {},
|
|
"required": []
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/Bumper",
|
|
"topic": "/naoqi_driver/bumper",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getBumperStatus"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_touch_sensors",
|
|
"name": "Get Touch Sensors",
|
|
"description": "Read hand and head touch sensor states",
|
|
"category": "sensors",
|
|
"icon": "hand",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"sensor_type": {
|
|
"type": "string",
|
|
"enum": [
|
|
"hand",
|
|
"head"
|
|
],
|
|
"default": "hand",
|
|
"description": "Touch sensor type to read"
|
|
}
|
|
},
|
|
"required": [
|
|
"sensor_type"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/HandTouch",
|
|
"topic": "/naoqi_driver/{sensor_type}_touch",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getTouchSensors"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_sonar_range",
|
|
"name": "Get Sonar Range",
|
|
"description": "Read ultrasonic range sensor data",
|
|
"category": "sensors",
|
|
"icon": "radio",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"sensor": {
|
|
"type": "string",
|
|
"enum": [
|
|
"left",
|
|
"right",
|
|
"both"
|
|
],
|
|
"default": "both",
|
|
"description": "Sonar sensor to read"
|
|
}
|
|
},
|
|
"required": [
|
|
"sensor"
|
|
]
|
|
},
|
|
"ros2": {
|
|
"messageType": "sensor_msgs/msg/Range",
|
|
"topic": "/naoqi_driver/sonar/{sensor}",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getSonarRange"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "get_robot_info",
|
|
"name": "Get Robot Info",
|
|
"description": "Read general robot information and status",
|
|
"category": "sensors",
|
|
"icon": "info",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {},
|
|
"required": []
|
|
},
|
|
"ros2": {
|
|
"messageType": "naoqi_bridge_msgs/msg/RobotInfo",
|
|
"topic": "/naoqi_driver/info",
|
|
"payloadMapping": {
|
|
"type": "transform",
|
|
"transformFn": "getRobotInfo"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "wake_up",
|
|
"name": "Wake Up",
|
|
"description": "Initialize robot motors and stand up",
|
|
"category": "movement",
|
|
"icon": "zap",
|
|
"timeout": 15000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/dummy",
|
|
"messageType": "std_msgs/msg/String",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"data": "wake_up"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "rest",
|
|
"name": "Rest",
|
|
"description": "Disable motors and sit down safely",
|
|
"category": "movement",
|
|
"icon": "moon",
|
|
"timeout": 15000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/dummy",
|
|
"messageType": "std_msgs/msg/String",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"data": "rest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "bow",
|
|
"name": "Bow",
|
|
"description": "Perform a polite bow gesture (head down + lean forward + return)",
|
|
"category": "gesture",
|
|
"icon": "user-check",
|
|
"timeout": 2000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": ["HeadYaw", "HeadPitch"],
|
|
"joint_angles": [0, 0.5],
|
|
"speed": 0.3
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["HeadYaw", "HeadPitch"],
|
|
"joint_angles": [0, 0.5],
|
|
"speed": 0.3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "wave",
|
|
"name": "Wave",
|
|
"description": "Perform a friendly wave gesture with right arm",
|
|
"category": "gesture",
|
|
"icon": "hand",
|
|
"timeout": 2000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": ["RShoulderPitch", "RShoulderRoll", "RElbowYaw", "RElbowRoll"],
|
|
"joint_angles": [1.5, 0.2, -1.0, 0.5],
|
|
"speed": 0.4
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["RShoulderPitch", "RShoulderRoll", "RElbowYaw", "RElbowRoll"],
|
|
"joint_angles": [1.5, 0.2, -1.0, 0.5],
|
|
"speed": 0.4
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "nod",
|
|
"name": "Nod",
|
|
"description": "Perform a nodding gesture (head up and down)",
|
|
"category": "gesture",
|
|
"icon": "chevrons-down",
|
|
"timeout": 1500,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": ["HeadPitch"],
|
|
"joint_angles": [0.3],
|
|
"speed": 0.5
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["HeadPitch"],
|
|
"joint_angles": [0.3],
|
|
"speed": 0.5
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "shake_head",
|
|
"name": "Shake Head",
|
|
"description": "Perform a head shaking gesture (no)",
|
|
"category": "gesture",
|
|
"icon": "x-circle",
|
|
"timeout": 1500,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": ["HeadYaw"],
|
|
"joint_angles": [0.4],
|
|
"speed": 0.5
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["HeadYaw"],
|
|
"joint_angles": [0.4],
|
|
"speed": 0.5
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "point",
|
|
"name": "Point",
|
|
"description": "Point at something with left arm",
|
|
"category": "gesture",
|
|
"icon": "finger-pointer",
|
|
"timeout": 1500,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": ["LShoulderPitch", "LShoulderRoll", "LElbowYaw", "LElbowRoll", "LWristYaw"],
|
|
"joint_angles": [0.8, 0.3, -1.0, 0.1, 0],
|
|
"speed": 0.4
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["LShoulderPitch", "LShoulderRoll", "LElbowYaw", "LElbowRoll", "LWristYaw"],
|
|
"joint_angles": [0.8, 0.3, -1.0, 0.1, 0],
|
|
"speed": 0.4
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": "greet",
|
|
"name": "Greet",
|
|
"description": "Combined greeting gesture: bow + wave",
|
|
"category": "gesture",
|
|
"icon": "sparkles",
|
|
"timeout": 3000,
|
|
"retryable": true,
|
|
"parameterSchema": {
|
|
"type": "object",
|
|
"properties": {}
|
|
},
|
|
"ros2": {
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"payloadMapping": {
|
|
"type": "static",
|
|
"payload": {
|
|
"joint_names": ["HeadYaw", "HeadPitch"],
|
|
"joint_angles": [0, 0.3],
|
|
"speed": 0.4
|
|
}
|
|
}
|
|
},
|
|
"implementation": {
|
|
"type": "ros2_topic",
|
|
"topic": "/joint_angles",
|
|
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
|
|
"messageTemplate": {
|
|
"joint_names": ["HeadYaw", "HeadPitch"],
|
|
"joint_angles": [0, 0.3],
|
|
"speed": 0.4
|
|
}
|
|
}
|
|
}
|
|
]
|
|
} |