{ "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", "platform": "ROS2", "version": "2.1.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" } }, "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 } } } } }, { "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 } } } } }, { "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}}" } } } } }, { "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}}" } } } } }, { "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" } } }, { "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}}" } } } }, { "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}}" } } } }, { "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}}" } } } }, { "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" } } }, { "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": "/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": "/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": "/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": "/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": "/{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": "/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": "/info", "payloadMapping": { "type": "transform", "transformFn": "getRobotInfo" } } } ] }