Fix say_with_emotion, add wave_goodbye and play_animation actions, fix topic mappings

This commit is contained in:
Sean O'Connor
2026-03-21 19:29:15 -04:00
parent 9e0921c69c
commit 14137ba631

View File

@@ -243,10 +243,7 @@
"description": "Angular velocity in rad/s" "description": "Angular velocity in rad/s"
} }
}, },
"required": [ "required": ["linear", "angular"]
"linear",
"angular"
]
}, },
"ros2": { "ros2": {
"messageType": "geometry_msgs/msg/Twist", "messageType": "geometry_msgs/msg/Twist",
@@ -289,9 +286,7 @@
"description": "Duration to walk in seconds (0 = indefinite)" "description": "Duration to walk in seconds (0 = indefinite)"
} }
}, },
"required": [ "required": ["speed"]
"speed"
]
}, },
"ros2": { "ros2": {
"messageType": "geometry_msgs/msg/Twist", "messageType": "geometry_msgs/msg/Twist",
@@ -356,9 +351,7 @@
"description": "Duration to walk in seconds (0 = indefinite)" "description": "Duration to walk in seconds (0 = indefinite)"
} }
}, },
"required": [ "required": ["speed"]
"speed"
]
}, },
"ros2": { "ros2": {
"messageType": "geometry_msgs/msg/Twist", "messageType": "geometry_msgs/msg/Twist",
@@ -423,9 +416,7 @@
"description": "Duration to turn in seconds (0 = indefinite)" "description": "Duration to turn in seconds (0 = indefinite)"
} }
}, },
"required": [ "required": ["speed"]
"speed"
]
}, },
"ros2": { "ros2": {
"messageType": "geometry_msgs/msg/Twist", "messageType": "geometry_msgs/msg/Twist",
@@ -490,9 +481,7 @@
"description": "Duration to turn in seconds (0 = indefinite)" "description": "Duration to turn in seconds (0 = indefinite)"
} }
}, },
"required": [ "required": ["speed"]
"speed"
]
}, },
"ros2": { "ros2": {
"messageType": "geometry_msgs/msg/Twist", "messageType": "geometry_msgs/msg/Twist",
@@ -587,9 +576,7 @@
"description": "Text to speak" "description": "Text to speak"
} }
}, },
"required": [ "required": ["text"]
"text"
]
}, },
"ros2": { "ros2": {
"messageType": "std_msgs/msg/String", "messageType": "std_msgs/msg/String",
@@ -615,10 +602,10 @@
{ {
"id": "say_with_emotion", "id": "say_with_emotion",
"name": "Say Text with Emotion", "name": "Say Text with Emotion",
"description": "Speak text with emotional expression using SSML-like markup", "description": "Speak text with emotional expression and animated gestures. Emotions: happy (excited gestures), sad (slower, lower pitch), neutral, excited (fast, animated), calm (slower, relaxed)",
"category": "interaction", "category": "interaction",
"icon": "heart", "icon": "heart",
"timeout": 15000, "timeout": 20000,
"retryable": true, "retryable": true,
"parameterSchema": { "parameterSchema": {
"type": "object", "type": "object",
@@ -630,15 +617,9 @@
}, },
"emotion": { "emotion": {
"type": "string", "type": "string",
"enum": [ "enum": ["neutral", "happy", "sad", "excited", "calm"],
"neutral",
"happy",
"sad",
"excited",
"calm"
],
"default": "neutral", "default": "neutral",
"description": "Emotional tone for speech" "description": "Emotional tone: happy (animated), sad (slow/low pitch), excited (fast + gestures), calm (slower + relaxed)"
}, },
"speed": { "speed": {
"type": "number", "type": "number",
@@ -648,18 +629,14 @@
"description": "Speech speed multiplier" "description": "Speech speed multiplier"
} }
}, },
"required": [ "required": ["text"]
"text"
]
}, },
"ros2": { "ros2": {
"messageType": "std_msgs/msg/String", "messageType": "std_msgs/msg/String",
"topic": "/speech", "topic": "/speech",
"payloadMapping": { "payloadMapping": {
"type": "static", "type": "transform",
"payload": { "transformFn": "transformToEmotionalSpeech"
"data": "\\rspd={{speed}}\\\\rst={{emotion}}\\{{text}}"
}
} }
}, },
"implementation": { "implementation": {
@@ -667,7 +644,7 @@
"topic": "/speech", "topic": "/speech",
"messageType": "std_msgs/msg/String", "messageType": "std_msgs/msg/String",
"messageTemplate": { "messageTemplate": {
"data": "\\\\rspd={{speed}}\\\\rst={{emotion}}\\{{text}}" "data": "{{text}}"
} }
} }
}, },
@@ -690,9 +667,7 @@
"description": "Volume level (0.0 = silent, 1.0 = maximum)" "description": "Volume level (0.0 = silent, 1.0 = maximum)"
} }
}, },
"required": [ "required": ["volume"]
"volume"
]
}, },
"ros2": { "ros2": {
"messageType": "std_msgs/msg/Float32", "messageType": "std_msgs/msg/Float32",
@@ -733,9 +708,7 @@
"description": "Speech language" "description": "Speech language"
} }
}, },
"required": [ "required": ["language"]
"language"
]
}, },
"ros2": { "ros2": {
"messageType": "std_msgs/msg/String", "messageType": "std_msgs/msg/String",
@@ -781,10 +754,7 @@
"description": "Movement speed (0.1 = slow, 1.0 = fast)" "description": "Movement speed (0.1 = slow, 1.0 = fast)"
} }
}, },
"required": [ "required": ["yaw", "pitch"]
"yaw",
"pitch"
]
}, },
"ros2": { "ros2": {
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
@@ -792,14 +762,8 @@
"payloadMapping": { "payloadMapping": {
"type": "static", "type": "static",
"payload": { "payload": {
"joint_names": [ "joint_names": ["HeadYaw", "HeadPitch"],
"HeadYaw", "joint_angles": ["{{yaw}}", "{{pitch}}"],
"HeadPitch"
],
"joint_angles": [
"{{yaw}}",
"{{pitch}}"
],
"speed": "{{speed}}" "speed": "{{speed}}"
} }
} }
@@ -828,10 +792,7 @@
"properties": { "properties": {
"arm": { "arm": {
"type": "string", "type": "string",
"enum": [ "enum": ["left", "right"],
"left",
"right"
],
"default": "right", "default": "right",
"description": "Which arm to control" "description": "Which arm to control"
}, },
@@ -906,8 +867,18 @@
"topic": "/joint_angles", "topic": "/joint_angles",
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
"messageTemplate": { "messageTemplate": {
"joint_names": ["{{arm === 'left' ? 'L' : 'R'}}ShoulderPitch", "{{arm === 'left' ? 'L' : 'R'}}ShoulderRoll", "{{arm === 'left' ? 'L' : 'R'}}ElbowYaw", "{{arm === 'left' ? 'L' : 'R'}}ElbowRoll"], "joint_names": [
"joint_angles": ["{{shoulder_pitch}}", "{{shoulder_roll}}", "{{elbow_yaw}}", "{{elbow_roll}}"], "{{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}}" "speed": "{{speed}}"
} }
} }
@@ -968,10 +939,7 @@
"description": "Movement speed (fraction of max)" "description": "Movement speed (fraction of max)"
} }
}, },
"required": [ "required": ["joint_name", "angle"]
"joint_name",
"angle"
]
}, },
"ros2": { "ros2": {
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
@@ -1015,10 +983,7 @@
"description": "Movement speed fraction" "description": "Movement speed fraction"
} }
}, },
"required": [ "required": ["yaw", "pitch"]
"yaw",
"pitch"
]
}, },
"ros2": { "ros2": {
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
@@ -1052,21 +1017,16 @@
"properties": { "properties": {
"camera": { "camera": {
"type": "string", "type": "string",
"enum": [ "enum": ["front", "bottom"],
"front",
"bottom"
],
"default": "front", "default": "front",
"description": "Camera to use" "description": "Camera to use"
} }
}, },
"required": [ "required": ["camera"]
"camera"
]
}, },
"ros2": { "ros2": {
"messageType": "sensor_msgs/msg/Image", "messageType": "sensor_msgs/msg/Image",
"topic": "/naoqi_driver/camera/{camera}/image_raw", "topic": "/camera/{camera}/image_raw",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getCameraImage" "transformFn": "getCameraImage"
@@ -1092,7 +1052,7 @@
}, },
"ros2": { "ros2": {
"messageType": "sensor_msgs/msg/JointState", "messageType": "sensor_msgs/msg/JointState",
"topic": "/naoqi_driver/joint_states", "topic": "/joint_states",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getJointStates" "transformFn": "getJointStates"
@@ -1118,7 +1078,7 @@
}, },
"ros2": { "ros2": {
"messageType": "sensor_msgs/msg/Imu", "messageType": "sensor_msgs/msg/Imu",
"topic": "/naoqi_driver/imu/torso", "topic": "/imu/torso",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getImuData" "transformFn": "getImuData"
@@ -1144,7 +1104,7 @@
}, },
"ros2": { "ros2": {
"messageType": "naoqi_bridge_msgs/msg/Bumper", "messageType": "naoqi_bridge_msgs/msg/Bumper",
"topic": "/naoqi_driver/bumper", "topic": "/bumper",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getBumperStatus" "transformFn": "getBumperStatus"
@@ -1164,21 +1124,16 @@
"properties": { "properties": {
"sensor_type": { "sensor_type": {
"type": "string", "type": "string",
"enum": [ "enum": ["hand", "head"],
"hand",
"head"
],
"default": "hand", "default": "hand",
"description": "Touch sensor type to read" "description": "Touch sensor type to read"
} }
}, },
"required": [ "required": ["sensor_type"]
"sensor_type"
]
}, },
"ros2": { "ros2": {
"messageType": "naoqi_bridge_msgs/msg/HandTouch", "messageType": "naoqi_bridge_msgs/msg/HandTouch",
"topic": "/naoqi_driver/{sensor_type}_touch", "topic": "/{sensor_type}_touch",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getTouchSensors" "transformFn": "getTouchSensors"
@@ -1198,22 +1153,16 @@
"properties": { "properties": {
"sensor": { "sensor": {
"type": "string", "type": "string",
"enum": [ "enum": ["left", "right", "both"],
"left",
"right",
"both"
],
"default": "both", "default": "both",
"description": "Sonar sensor to read" "description": "Sonar sensor to read"
} }
}, },
"required": [ "required": ["sensor"]
"sensor"
]
}, },
"ros2": { "ros2": {
"messageType": "sensor_msgs/msg/Range", "messageType": "sensor_msgs/msg/Range",
"topic": "/naoqi_driver/sonar/{sensor}", "topic": "/sonar/{sensor}",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getSonarRange" "transformFn": "getSonarRange"
@@ -1235,7 +1184,7 @@
}, },
"ros2": { "ros2": {
"messageType": "naoqi_bridge_msgs/msg/RobotInfo", "messageType": "naoqi_bridge_msgs/msg/RobotInfo",
"topic": "/naoqi_driver/info", "topic": "/info",
"payloadMapping": { "payloadMapping": {
"type": "transform", "type": "transform",
"transformFn": "getRobotInfo" "transformFn": "getRobotInfo"
@@ -1341,7 +1290,12 @@
"payloadMapping": { "payloadMapping": {
"type": "static", "type": "static",
"payload": { "payload": {
"joint_names": ["RShoulderPitch", "RShoulderRoll", "RElbowYaw", "RElbowRoll"], "joint_names": [
"RShoulderPitch",
"RShoulderRoll",
"RElbowYaw",
"RElbowRoll"
],
"joint_angles": [1.5, 0.2, -1.0, 0.5], "joint_angles": [1.5, 0.2, -1.0, 0.5],
"speed": 0.4 "speed": 0.4
} }
@@ -1352,7 +1306,12 @@
"topic": "/joint_angles", "topic": "/joint_angles",
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
"messageTemplate": { "messageTemplate": {
"joint_names": ["RShoulderPitch", "RShoulderRoll", "RElbowYaw", "RElbowRoll"], "joint_names": [
"RShoulderPitch",
"RShoulderRoll",
"RElbowYaw",
"RElbowRoll"
],
"joint_angles": [1.5, 0.2, -1.0, 0.5], "joint_angles": [1.5, 0.2, -1.0, 0.5],
"speed": 0.4 "speed": 0.4
} }
@@ -1446,7 +1405,13 @@
"payloadMapping": { "payloadMapping": {
"type": "static", "type": "static",
"payload": { "payload": {
"joint_names": ["LShoulderPitch", "LShoulderRoll", "LElbowYaw", "LElbowRoll", "LWristYaw"], "joint_names": [
"LShoulderPitch",
"LShoulderRoll",
"LElbowYaw",
"LElbowRoll",
"LWristYaw"
],
"joint_angles": [0.8, 0.3, -1.0, 0.1, 0], "joint_angles": [0.8, 0.3, -1.0, 0.1, 0],
"speed": 0.4 "speed": 0.4
} }
@@ -1457,7 +1422,13 @@
"topic": "/joint_angles", "topic": "/joint_angles",
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed",
"messageTemplate": { "messageTemplate": {
"joint_names": ["LShoulderPitch", "LShoulderRoll", "LElbowYaw", "LElbowRoll", "LWristYaw"], "joint_names": [
"LShoulderPitch",
"LShoulderRoll",
"LElbowYaw",
"LElbowRoll",
"LWristYaw"
],
"joint_angles": [0.8, 0.3, -1.0, 0.1, 0], "joint_angles": [0.8, 0.3, -1.0, 0.1, 0],
"speed": 0.4 "speed": 0.4
} }
@@ -1486,17 +1457,91 @@
"speed": 0.4 "speed": 0.4
} }
} }
}
},
{
"id": "wave_goodbye",
"name": "Wave Goodbye",
"description": "Animated wave goodbye gesture with speech",
"category": "interaction",
"icon": "hand",
"timeout": 4000,
"retryable": true,
"parameterSchema": {
"type": "object",
"properties": {
"text": {
"type": "string",
"default": "Goodbye!",
"description": "Text to say while waving"
}
}
},
"ros2": {
"messageType": "std_msgs/msg/String",
"topic": "/speech",
"payloadMapping": {
"type": "transform",
"transformFn": "transformToWaveGoodbye"
}
}, },
"implementation": { "implementation": {
"type": "ros2_topic", "type": "ros2_topic",
"topic": "/joint_angles", "topic": "/speech",
"messageType": "naoqi_bridge_msgs/msg/JointAnglesWithSpeed", "messageType": "std_msgs/msg/String",
"messageTemplate": { "messageTemplate": {
"joint_names": ["HeadYaw", "HeadPitch"], "data": "{{text}}"
"joint_angles": [0, 0.3], }
"speed": 0.4 }
},
{
"id": "play_animation",
"name": "Play Animation",
"description": "Play a predefined NAO animation/gesture",
"category": "movement",
"icon": "play",
"timeout": 5000,
"retryable": true,
"parameterSchema": {
"type": "object",
"properties": {
"animation": {
"type": "string",
"enum": [
"Hey_1",
"Happy_1",
"Happy_4",
"Enthusiastic_1",
"Yes_1",
"Yes_2",
"No_1",
"Blow_1",
"Gesture_Ok_1",
"Gesture_Nice_1",
"Gesture_You_1"
],
"default": "Hey_1",
"description": "Animation to play"
}
},
"required": ["animation"]
},
"ros2": {
"messageType": "std_msgs/msg/String",
"topic": "/speech",
"payloadMapping": {
"type": "transform",
"transformFn": "transformToAnimation"
}
},
"implementation": {
"type": "ros2_topic",
"topic": "/speech",
"messageType": "std_msgs/msg/String",
"messageTemplate": {
"data": "^start(animations/Stand/Gestures/{{animation}})"
} }
} }
} }
] ]
} }