Files
robot-plugins/plugins/nao6-ros2.json
2025-11-12 13:12:05 -05:00

900 lines
24 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",
"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"
}
}
}
]
}