feat: Redesign Landing, Auth, and Dashboard Pages

Also fixed schema type exports and seed script errors.
This commit is contained in:
2026-02-01 22:28:19 -05:00
parent 816b2b9e31
commit dbfdd91dea
300 changed files with 17239 additions and 5952 deletions

View File

@@ -0,0 +1,289 @@
# NAO6 HRIStudio Plugin Repository
**Official NAO6 robot integration plugins for the HRIStudio platform**
## Overview
This repository contains production-ready plugins for integrating NAO6 robots with HRIStudio experiments. The plugins provide comprehensive robot control capabilities including movement, speech synthesis, sensor monitoring, and safety features optimized for human-robot interaction research.
## Available Plugins
### 🤖 NAO6 Enhanced ROS2 Integration (`nao6-ros2-enhanced.json`)
**Complete NAO6 robot control for HRIStudio experiments**
**Features:**
-**Speech Synthesis** - Text-to-speech with volume and speed control
-**Movement Control** - Walking, turning, and precise positioning
-**Posture Management** - Stand, sit, crouch, and custom poses
-**Head Movement** - Gaze control and attention direction
-**Gesture Library** - Wave, point, applause, and custom animations
-**LED Control** - Visual feedback with colors and patterns
-**Sensor Monitoring** - Touch, bumper, sonar, and camera sensors
-**Safety Features** - Emergency stop and velocity limits
-**System Control** - Wake/rest and status monitoring
**Requirements:**
- NAO6 robot with NAOqi 2.8.7.4+
- ROS2 Humble or compatible
- Network connectivity to robot
- `nao_launch` package for ROS integration
**Installation:**
1. Install in HRIStudio study via Plugin Management
2. Configure robot IP and WebSocket URL
3. Launch ROS integration: `ros2 launch nao_launch nao6_production.launch.py`
4. Test connection in HRIStudio experiment designer
## Plugin Actions Reference
### Speech & Communication
| Action | Description | Parameters |
|--------|-------------|------------|
| **Speak Text** | Text-to-speech synthesis | text, volume, speed, wait |
| **LED Control** | Visual feedback with colors | ledGroup, color, intensity, pattern |
### Movement & Posture
| Action | Description | Parameters |
|--------|-------------|------------|
| **Move Robot** | Linear and angular movement | direction, distance, speed, duration |
| **Set Posture** | Predefined poses | posture, speed, waitForCompletion |
| **Move Head** | Gaze and attention control | yaw, pitch, speed, presetDirection |
| **Perform Gesture** | Animations and gestures | gesture, intensity, speed, repeatCount |
### Sensors & Monitoring
| Action | Description | Parameters |
|--------|-------------|------------|
| **Monitor Sensors** | Touch, bumper, sonar detection | sensorType, duration, sensitivity |
| **Check Robot Status** | Battery, joints, system health | statusType, logToExperiment |
### Safety & System
| Action | Description | Parameters |
|--------|-------------|------------|
| **Emergency Stop** | Immediate motion termination | stopType, safePosture |
| **Wake Up / Rest** | Power management | action, waitForCompletion |
## Quick Start Examples
### 1. Basic Greeting
```json
{
"sequence": [
{"action": "nao_wake_rest", "parameters": {"action": "wake"}},
{"action": "nao_speak", "parameters": {"text": "Hello! Welcome to our experiment."}},
{"action": "nao_gesture", "parameters": {"gesture": "wave"}}
]
}
```
### 2. Interactive Task
```json
{
"sequence": [
{"action": "nao_speak", "parameters": {"text": "Please touch my head when ready."}},
{"action": "nao_sensor_monitor", "parameters": {"sensorType": "touch", "duration": 30}},
{"action": "nao_speak", "parameters": {"text": "Thank you! Let's begin."}}
]
}
```
### 3. Attention Direction
```json
{
"sequence": [
{"action": "nao_head_movement", "parameters": {"presetDirection": "left"}},
{"action": "nao_speak", "parameters": {"text": "Look over there please."}},
{"action": "nao_gesture", "parameters": {"gesture": "point_left"}}
]
}
```
## Installation & Setup
### Prerequisites
- **HRIStudio Platform** - Web-based WoZ research platform
- **NAO6 Robot** - With NAOqi 2.8.7.4 or compatible
- **ROS2 Humble** - Robot Operating System 2
- **Network Setup** - Robot and computer on same network
### Step 1: Install NAO ROS2 Packages
```bash
# Clone and build NAO ROS2 workspace
cd ~/naoqi_ros2_ws
colcon build --packages-select nao_launch
source install/setup.bash
```
### Step 2: Start Robot Integration
```bash
# Launch comprehensive NAO integration
ros2 launch nao_launch nao6_production.launch.py \
nao_ip:=nao.local \
password:=robolab \
bridge_port:=9090
```
### Step 3: Install Plugin in HRIStudio
1. **Access HRIStudio** - Open your study in HRIStudio
2. **Plugin Management** - Go to Study → Plugins
3. **Browse Store** - Find "NAO6 Robot (Enhanced ROS2 Integration)"
4. **Install Plugin** - Click install and configure settings
5. **Configure WebSocket** - Set URL to `ws://localhost:9090`
### Step 4: Test Integration
1. **Open Experiment Designer** - Create or edit an experiment
2. **Add Robot Action** - Drag NAO6 action from plugin section
3. **Configure Parameters** - Set speech text, movement, etc.
4. **Test Connection** - Use "Check Robot Status" action
5. **Run Trial** - Execute experiment and verify robot responds
## Configuration Options
### Robot Connection
- **Robot IP** - IP address or hostname (default: `nao.local`)
- **Password** - Robot authentication password
- **WebSocket URL** - ROS bridge connection (default: `ws://localhost:9090`)
### Safety Settings
- **Max Linear Velocity** - Maximum movement speed (default: 0.2 m/s)
- **Max Angular Velocity** - Maximum rotation speed (default: 0.8 rad/s)
- **Safety Monitoring** - Enable automatic safety checks
- **Auto Wake-up** - Automatically wake robot when experiment starts
### Performance Tuning
- **Speech Volume** - Default volume level (default: 0.7)
- **Movement Speed** - Default movement speed factor (default: 0.5)
- **Battery Monitoring** - Track battery level during experiments
## Troubleshooting
### ❌ Robot Not Responding
**Problem:** Commands sent but robot doesn't react
**Solution:**
- Check robot is awake: Press chest button for 3 seconds
- Verify network connectivity: `ping nao.local`
- Use "Wake Up / Rest Robot" action in experiment
### ❌ WebSocket Connection Failed
**Problem:** HRIStudio cannot connect to robot
**Solution:**
- Verify rosbridge is running: `ros2 node list | grep rosbridge`
- Check port availability: `ss -an | grep 9090`
- Restart integration: Kill processes and relaunch
### ❌ Movements Too Fast/Unsafe
**Problem:** Robot moves too quickly or unpredictably
**Solution:**
- Reduce max velocities in plugin configuration
- Lower movement speed parameters in actions
- Use "Emergency Stop" action if needed
### ❌ Speech Not Working
**Problem:** Robot doesn't speak or audio issues
**Solution:**
- Check robot volume settings
- Verify text-to-speech service: `ros2 topic echo /speech`
- Ensure speakers are functioning
## Safety Guidelines
### ⚠️ Important Safety Notes
- **Clear Space** - Ensure 2m clearance around robot during movement
- **Emergency Stop** - Keep emergency stop action easily accessible
- **Supervision** - Never leave robot unattended during experiments
- **Battery Monitoring** - Check battery level for long sessions
- **Stable Surface** - Keep robot on level, stable flooring
### Emergency Procedures
```bash
# Immediate stop via CLI
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist '{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}'
# Or use HRIStudio emergency stop action
# Add "Emergency Stop" action to experiment for quick access
```
## Technical Details
### ROS2 Topics Used
- **Input Topics** (Robot Control):
- `/speech` - Text-to-speech commands
- `/cmd_vel` - Movement commands
- `/joint_angles` - Joint position control
- `/led_control` - LED color control
- **Output Topics** (Sensor Data):
- `/naoqi_driver/joint_states` - Joint positions
- `/naoqi_driver/bumper` - Foot sensors
- `/naoqi_driver/hand_touch` - Hand sensors
- `/naoqi_driver/head_touch` - Head sensors
- `/naoqi_driver/sonar/*` - Ultrasonic sensors
### WebSocket Communication
- **Protocol** - rosbridge v2.0 WebSocket
- **Default Port** - 9090
- **Message Format** - JSON-based ROS message serialization
- **Authentication** - None (local network)
## Development & Contributing
### Plugin Development
1. **Follow Schema** - Use provided JSON schema for action definitions
2. **Test Thoroughly** - Verify with real NAO6 hardware
3. **Document Actions** - Provide clear parameter descriptions
4. **Safety First** - Include appropriate safety measures
### Testing Checklist
- [ ] Robot connectivity and wake-up
- [ ] All movement actions with safety limits
- [ ] Speech synthesis with various texts
- [ ] Sensor monitoring and event detection
- [ ] Emergency stop functionality
- [ ] WebSocket communication stability
## Support & Resources
### Documentation
- **HRIStudio Docs** - [Platform documentation](../../docs/)
- **NAO6 Integration Guide** - [Complete setup guide](../../docs/nao6-integration-complete-guide.md)
- **Quick Reference** - [Essential commands](../../docs/nao6-quick-reference.md)
### Community & Support
- **GitHub Repository** - [hristudio/nao6-ros2-plugins](https://github.com/hristudio/nao6-ros2-plugins)
- **Issue Tracker** - Report bugs and request features
- **Email Support** - robolab@hristudio.com
### Version Information
- **Plugin Version** - 2.0.0 (Enhanced Integration)
- **HRIStudio Compatibility** - v1.0+
- **ROS2 Distro** - Humble (recommended)
- **NAO6 Compatibility** - NAOqi 2.8.7.4+
- **Last Updated** - December 2024
---
## License
**MIT License** - See [LICENSE](LICENSE) file for details
## Citation
If you use these plugins in your research, please cite:
```bibtex
@software{nao6_hristudio_plugins,
title={NAO6 HRIStudio Integration Plugins},
author={HRIStudio RoboLab Team},
year={2024},
url={https://github.com/hristudio/nao6-ros2-plugins},
version={2.0.0}
}
```
---
**Maintained by:** HRIStudio RoboLab Team
**Contact:** robolab@hristudio.com
**Repository:** [hristudio/nao6-ros2-plugins](https://github.com/hristudio/nao6-ros2-plugins)
*Part of the HRIStudio platform for advancing Human-Robot Interaction research*

View File

@@ -0,0 +1,769 @@
{
"id": "nao6-ros2-enhanced",
"name": "NAO6 Robot (Enhanced ROS2 Integration)",
"version": "2.0.0",
"description": "Comprehensive NAO6 robot integration for HRIStudio experiments via ROS2. Provides full robot control including movement, speech synthesis, posture control, sensor monitoring, and safety features. Optimized for human-robot interaction research with production-ready reliability.",
"author": {
"name": "HRIStudio RoboLab Team",
"email": "robolab@hristudio.com",
"organization": "HRIStudio Research Platform"
},
"license": "MIT",
"repositoryUrl": "https://github.com/hristudio/nao6-ros2-plugins",
"documentationUrl": "https://docs.hristudio.com/robots/nao6",
"trustLevel": "official",
"status": "active",
"tags": ["nao6", "ros2", "speech", "movement", "sensors", "hri", "production"],
"robotId": "nao6-softbank",
"communicationProtocol": "ros2_websocket",
"metadata": {
"robotModel": "NAO V6.0",
"manufacturer": "SoftBank Robotics",
"naoqiVersion": "2.8.7.4",
"ros2Distro": "humble",
"websocketUrl": "ws://localhost:9090",
"launchPackage": "nao_launch",
"requiredPackages": [
"naoqi_driver2",
"naoqi_bridge_msgs",
"rosbridge_server",
"rosapi"
],
"safetyFeatures": {
"emergencyStop": true,
"velocityLimits": true,
"fallDetection": true,
"batteryMonitoring": true,
"automaticWakeup": true
},
"capabilities": [
"bipedal_walking",
"speech_synthesis",
"head_movement",
"arm_gestures",
"touch_sensors",
"visual_sensors",
"audio_sensors",
"posture_control",
"balance_control"
]
},
"configurationSchema": {
"type": "object",
"properties": {
"robotIp": {
"type": "string",
"default": "nao.local",
"title": "Robot IP Address",
"description": "IP address or hostname of the NAO6 robot"
},
"robotPassword": {
"type": "string",
"default": "robolab",
"title": "Robot Password",
"description": "Password for robot authentication",
"format": "password"
},
"websocketUrl": {
"type": "string",
"default": "ws://localhost:9090",
"title": "WebSocket URL",
"description": "ROS bridge WebSocket URL for robot communication"
},
"maxLinearVelocity": {
"type": "number",
"default": 0.2,
"minimum": 0.01,
"maximum": 0.5,
"title": "Max Linear Velocity (m/s)",
"description": "Maximum allowed linear movement speed for safety"
},
"maxAngularVelocity": {
"type": "number",
"default": 0.8,
"minimum": 0.1,
"maximum": 2.0,
"title": "Max Angular Velocity (rad/s)",
"description": "Maximum allowed rotational speed for safety"
},
"defaultMovementSpeed": {
"type": "number",
"default": 0.5,
"minimum": 0.1,
"maximum": 1.0,
"title": "Default Movement Speed",
"description": "Speed factor for posture and gesture movements (0.1-1.0)"
},
"speechVolume": {
"type": "number",
"default": 0.7,
"minimum": 0.1,
"maximum": 1.0,
"title": "Speech Volume",
"description": "Default volume for speech synthesis (0.1-1.0)"
},
"enableSafetyMonitoring": {
"type": "boolean",
"default": true,
"title": "Enable Safety Monitoring",
"description": "Enable automatic safety monitoring and emergency stops"
},
"autoWakeUp": {
"type": "boolean",
"default": true,
"title": "Auto Wake-up Robot",
"description": "Automatically wake up robot when experiment starts"
},
"monitorBattery": {
"type": "boolean",
"default": true,
"title": "Monitor Battery",
"description": "Monitor robot battery level during experiments"
}
},
"required": ["robotIp", "websocketUrl"]
},
"actionDefinitions": [
{
"id": "nao_speak",
"name": "Speak Text",
"description": "Make the NAO robot speak the specified text using text-to-speech synthesis",
"category": "speech",
"icon": "volume2",
"parametersSchema": {
"type": "object",
"properties": {
"text": {
"type": "string",
"title": "Text to Speak",
"description": "The text that the robot should speak aloud",
"minLength": 1,
"maxLength": 500
},
"volume": {
"type": "number",
"title": "Volume",
"description": "Speech volume level (0.1 = quiet, 1.0 = loud)",
"default": 0.7,
"minimum": 0.1,
"maximum": 1.0,
"step": 0.1
},
"speed": {
"type": "number",
"title": "Speech Speed",
"description": "Speech rate multiplier (0.5 = slow, 2.0 = fast)",
"default": 1.0,
"minimum": 0.5,
"maximum": 2.0,
"step": 0.1
},
"waitForCompletion": {
"type": "boolean",
"title": "Wait for Speech to Complete",
"description": "Wait until speech finishes before continuing to next action",
"default": true
}
},
"required": ["text"]
},
"implementation": {
"type": "ros2_topic",
"topic": "/speech",
"messageType": "std_msgs/String",
"messageMapping": {
"data": "{{text}}"
}
}
},
{
"id": "nao_move",
"name": "Move Robot",
"description": "Move the NAO robot with specified linear and angular velocities",
"category": "movement",
"icon": "move",
"parametersSchema": {
"type": "object",
"properties": {
"direction": {
"type": "string",
"title": "Movement Direction",
"description": "Predefined movement direction",
"enum": ["forward", "backward", "left", "right", "turn_left", "turn_right", "custom"],
"enumNames": ["Forward", "Backward", "Step Left", "Step Right", "Turn Left", "Turn Right", "Custom"],
"default": "forward"
},
"distance": {
"type": "number",
"title": "Distance/Angle",
"description": "Distance in meters for linear movement, or angle in degrees for rotation",
"default": 0.1,
"minimum": 0.01,
"maximum": 2.0,
"step": 0.01
},
"speed": {
"type": "number",
"title": "Movement Speed",
"description": "Speed factor (0.1 = very slow, 1.0 = normal speed)",
"default": 0.5,
"minimum": 0.1,
"maximum": 1.0,
"step": 0.1
},
"customX": {
"type": "number",
"title": "Custom X Velocity (m/s)",
"description": "Forward/backward velocity (positive = forward)",
"default": 0.0,
"minimum": -0.3,
"maximum": 0.3,
"step": 0.01
},
"customY": {
"type": "number",
"title": "Custom Y Velocity (m/s)",
"description": "Left/right velocity (positive = left)",
"default": 0.0,
"minimum": -0.3,
"maximum": 0.3,
"step": 0.01
},
"customTheta": {
"type": "number",
"title": "Custom Angular Velocity (rad/s)",
"description": "Rotational velocity (positive = counter-clockwise)",
"default": 0.0,
"minimum": -1.5,
"maximum": 1.5,
"step": 0.01
},
"duration": {
"type": "number",
"title": "Duration (seconds)",
"description": "How long to maintain the movement",
"default": 2.0,
"minimum": 0.1,
"maximum": 10.0,
"step": 0.1
}
},
"required": ["direction"]
},
"implementation": {
"type": "ros2_topic",
"topic": "/cmd_vel",
"messageType": "geometry_msgs/Twist",
"messageMapping": {
"linear": {
"x": "{{#eq direction 'forward'}}{{multiply distance speed 0.1}}{{/eq}}{{#eq direction 'backward'}}{{multiply distance speed -0.1}}{{/eq}}{{#eq direction 'custom'}}{{customX}}{{/eq}}{{#default}}0.0{{/default}}",
"y": "{{#eq direction 'left'}}{{multiply distance speed 0.1}}{{/eq}}{{#eq direction 'right'}}{{multiply distance speed -0.1}}{{/eq}}{{#eq direction 'custom'}}{{customY}}{{/eq}}{{#default}}0.0{{/default}}",
"z": 0.0
},
"angular": {
"x": 0.0,
"y": 0.0,
"z": "{{#eq direction 'turn_left'}}{{multiply distance speed 0.1}}{{/eq}}{{#eq direction 'turn_right'}}{{multiply distance speed -0.1}}{{/eq}}{{#eq direction 'custom'}}{{customTheta}}{{/eq}}{{#default}}0.0{{/default}}"
}
}
}
},
{
"id": "nao_pose",
"name": "Set Posture",
"description": "Set the NAO robot to a specific posture or pose",
"category": "movement",
"icon": "user",
"parametersSchema": {
"type": "object",
"properties": {
"posture": {
"type": "string",
"title": "Posture",
"description": "Target posture for the robot",
"enum": ["Stand", "Sit", "SitRelax", "StandInit", "StandZero", "Crouch", "LyingBack", "LyingBelly"],
"enumNames": ["Stand", "Sit", "Sit Relaxed", "Stand Initial", "Stand Zero", "Crouch", "Lying on Back", "Lying on Belly"],
"default": "Stand"
},
"speed": {
"type": "number",
"title": "Movement Speed",
"description": "Speed of posture transition (0.1 = slow, 1.0 = fast)",
"default": 0.5,
"minimum": 0.1,
"maximum": 1.0,
"step": 0.1
},
"waitForCompletion": {
"type": "boolean",
"title": "Wait for Completion",
"description": "Wait until posture change is complete before continuing",
"default": true
}
},
"required": ["posture"]
},
"implementation": {
"type": "ros2_service",
"service": "/naoqi_driver/robot_posture/go_to_posture",
"serviceType": "naoqi_bridge_msgs/srv/SetString",
"requestMapping": {
"data": "{{posture}}"
}
}
},
{
"id": "nao_head_movement",
"name": "Move Head",
"description": "Control NAO robot head movement for gaze direction and attention",
"category": "movement",
"icon": "eye",
"parametersSchema": {
"type": "object",
"properties": {
"headYaw": {
"type": "number",
"title": "Head Yaw (degrees)",
"description": "Left/right head rotation (-90° = right, +90° = left)",
"default": 0.0,
"minimum": -90.0,
"maximum": 90.0,
"step": 1.0
},
"headPitch": {
"type": "number",
"title": "Head Pitch (degrees)",
"description": "Up/down head rotation (-25° = down, +25° = up)",
"default": 0.0,
"minimum": -25.0,
"maximum": 25.0,
"step": 1.0
},
"speed": {
"type": "number",
"title": "Movement Speed",
"description": "Speed of head movement (0.1 = slow, 1.0 = fast)",
"default": 0.3,
"minimum": 0.1,
"maximum": 1.0,
"step": 0.1
},
"presetDirection": {
"type": "string",
"title": "Preset Direction",
"description": "Use preset head direction instead of custom angles",
"enum": ["none", "center", "left", "right", "up", "down", "look_left", "look_right"],
"enumNames": ["Custom Angles", "Center", "Left", "Right", "Up", "Down", "Look Left", "Look Right"],
"default": "none"
}
},
"required": []
},
"implementation": {
"type": "ros2_topic",
"topic": "/joint_angles",
"messageType": "naoqi_bridge_msgs/JointAnglesWithSpeed",
"messageMapping": {
"joint_names": ["HeadYaw", "HeadPitch"],
"joint_angles": [
"{{#ne presetDirection 'none'}}{{#eq presetDirection 'left'}}1.57{{/eq}}{{#eq presetDirection 'right'}}-1.57{{/eq}}{{#eq presetDirection 'center'}}0.0{{/eq}}{{#eq presetDirection 'look_left'}}0.78{{/eq}}{{#eq presetDirection 'look_right'}}-0.78{{/eq}}{{#default}}{{multiply headYaw 0.0175}}{{/default}}{{/ne}}{{#eq presetDirection 'none'}}{{multiply headYaw 0.0175}}{{/eq}}",
"{{#ne presetDirection 'none'}}{{#eq presetDirection 'up'}}0.44{{/eq}}{{#eq presetDirection 'down'}}-0.44{{/eq}}{{#eq presetDirection 'center'}}0.0{{/eq}}{{#default}}{{multiply headPitch 0.0175}}{{/default}}{{/ne}}{{#eq presetDirection 'none'}}{{multiply headPitch 0.0175}}{{/eq}}"
],
"speed": "{{speed}}"
}
}
},
{
"id": "nao_gesture",
"name": "Perform Gesture",
"description": "Make NAO robot perform predefined gestures and animations",
"category": "interaction",
"icon": "hand",
"parametersSchema": {
"type": "object",
"properties": {
"gesture": {
"type": "string",
"title": "Gesture Type",
"description": "Select a predefined gesture or animation",
"enum": ["wave", "point_left", "point_right", "applause", "thumbs_up", "open_arms", "bow", "celebration", "thinking", "custom"],
"enumNames": ["Wave Hello", "Point Left", "Point Right", "Applause", "Thumbs Up", "Open Arms", "Bow", "Celebration", "Thinking Pose", "Custom Joint Movement"],
"default": "wave"
},
"intensity": {
"type": "number",
"title": "Gesture Intensity",
"description": "Intensity of the gesture movement (0.5 = subtle, 1.0 = full)",
"default": 0.8,
"minimum": 0.3,
"maximum": 1.0,
"step": 0.1
},
"speed": {
"type": "number",
"title": "Gesture Speed",
"description": "Speed of gesture execution (0.1 = slow, 1.0 = fast)",
"default": 0.5,
"minimum": 0.1,
"maximum": 1.0,
"step": 0.1
},
"repeatCount": {
"type": "integer",
"title": "Repeat Count",
"description": "Number of times to repeat the gesture",
"default": 1,
"minimum": 1,
"maximum": 5
}
},
"required": ["gesture"]
},
"implementation": {
"type": "ros2_service",
"service": "/naoqi_driver/animation_player/run_animation",
"serviceType": "naoqi_bridge_msgs/srv/SetString",
"requestMapping": {
"data": "{{#eq gesture 'wave'}}animations/Stand/Gestures/Hey_1{{/eq}}{{#eq gesture 'point_left'}}animations/Stand/Gestures/YouKnowWhat_1{{/eq}}{{#eq gesture 'point_right'}}animations/Stand/Gestures/YouKnowWhat_2{{/eq}}{{#eq gesture 'applause'}}animations/Stand/Gestures/Applause_1{{/eq}}{{#eq gesture 'thumbs_up'}}animations/Stand/Gestures/Yes_1{{/eq}}{{#eq gesture 'open_arms'}}animations/Stand/Gestures/Everything_1{{/eq}}{{#eq gesture 'bow'}}animations/Stand/Gestures/BowShort_1{{/eq}}{{#eq gesture 'celebration'}}animations/Stand/Gestures/Excited_1{{/eq}}{{#eq gesture 'thinking'}}animations/Stand/Gestures/Thinking_1{{/eq}}"
}
}
},
{
"id": "nao_led_control",
"name": "Control LEDs",
"description": "Control NAO robot LED colors and patterns for visual feedback",
"category": "interaction",
"icon": "lightbulb",
"parametersSchema": {
"type": "object",
"properties": {
"ledGroup": {
"type": "string",
"title": "LED Group",
"description": "Which LED group to control",
"enum": ["eyes", "ears", "chest", "feet", "all"],
"enumNames": ["Eyes", "Ears", "Chest", "Feet", "All LEDs"],
"default": "eyes"
},
"color": {
"type": "string",
"title": "LED Color",
"description": "Color for the LEDs",
"enum": ["red", "green", "blue", "yellow", "cyan", "magenta", "white", "orange", "purple", "off"],
"enumNames": ["Red", "Green", "Blue", "Yellow", "Cyan", "Magenta", "White", "Orange", "Purple", "Off"],
"default": "blue"
},
"intensity": {
"type": "number",
"title": "LED Intensity",
"description": "Brightness of the LEDs (0.0 = off, 1.0 = maximum)",
"default": 0.8,
"minimum": 0.0,
"maximum": 1.0,
"step": 0.1
},
"pattern": {
"type": "string",
"title": "LED Pattern",
"description": "LED animation pattern",
"enum": ["solid", "blink", "fade", "pulse", "rainbow"],
"enumNames": ["Solid", "Blink", "Fade In/Out", "Pulse", "Rainbow Cycle"],
"default": "solid"
},
"duration": {
"type": "number",
"title": "Duration (seconds)",
"description": "How long to maintain the LED state (0 = indefinite)",
"default": 0,
"minimum": 0,
"maximum": 60,
"step": 1
}
},
"required": ["ledGroup", "color"]
},
"implementation": {
"type": "ros2_topic",
"topic": "/led_control",
"messageType": "naoqi_bridge_msgs/Led",
"messageMapping": {
"name": "{{ledGroup}}",
"color": "{{color}}",
"intensity": "{{intensity}}"
}
}
},
{
"id": "nao_sensor_monitor",
"name": "Monitor Sensors",
"description": "Monitor NAO robot sensors for interaction detection and environmental awareness",
"category": "sensors",
"icon": "activity",
"parametersSchema": {
"type": "object",
"properties": {
"sensorType": {
"type": "string",
"title": "Sensor Type",
"description": "Which sensors to monitor",
"enum": ["touch", "bumper", "sonar", "camera", "audio", "all"],
"enumNames": ["Touch Sensors", "Foot Bumpers", "Ultrasonic Sensors", "Cameras", "Audio", "All Sensors"],
"default": "touch"
},
"duration": {
"type": "number",
"title": "Monitoring Duration (seconds)",
"description": "How long to monitor sensors (0 = continuous)",
"default": 10,
"minimum": 0,
"maximum": 300,
"step": 1
},
"sensitivity": {
"type": "number",
"title": "Detection Sensitivity",
"description": "Sensitivity level for sensor detection (0.1 = low, 1.0 = high)",
"default": 0.7,
"minimum": 0.1,
"maximum": 1.0,
"step": 0.1
},
"logEvents": {
"type": "boolean",
"title": "Log Sensor Events",
"description": "Log all sensor events to experiment data",
"default": true
},
"triggerAction": {
"type": "string",
"title": "Trigger Action",
"description": "Action to take when sensor is activated",
"enum": ["none", "speak", "gesture", "move", "led"],
"enumNames": ["No Action", "Speak Response", "Perform Gesture", "Move Robot", "LED Feedback"],
"default": "none"
}
},
"required": ["sensorType"]
},
"implementation": {
"type": "ros2_subscription",
"topics": [
"/naoqi_driver/bumper",
"/naoqi_driver/hand_touch",
"/naoqi_driver/head_touch",
"/naoqi_driver/sonar/left",
"/naoqi_driver/sonar/right"
],
"messageTypes": [
"naoqi_bridge_msgs/Bumper",
"naoqi_bridge_msgs/HandTouch",
"naoqi_bridge_msgs/HeadTouch",
"sensor_msgs/Range",
"sensor_msgs/Range"
]
}
},
{
"id": "nao_emergency_stop",
"name": "Emergency Stop",
"description": "Immediately stop all robot movement and animations for safety",
"category": "safety",
"icon": "stop-circle",
"parametersSchema": {
"type": "object",
"properties": {
"stopType": {
"type": "string",
"title": "Stop Type",
"description": "Type of emergency stop to perform",
"enum": ["movement", "all", "freeze"],
"enumNames": ["Stop Movement Only", "Stop All Actions", "Freeze in Place"],
"default": "all"
},
"safePosture": {
"type": "boolean",
"title": "Move to Safe Posture",
"description": "Automatically move to a safe posture after stopping",
"default": true
}
},
"required": []
},
"implementation": {
"type": "ros2_topic",
"topic": "/cmd_vel",
"messageType": "geometry_msgs/Twist",
"messageMapping": {
"linear": {"x": 0.0, "y": 0.0, "z": 0.0},
"angular": {"x": 0.0, "y": 0.0, "z": 0.0}
}
}
},
{
"id": "nao_wake_rest",
"name": "Wake Up / Rest Robot",
"description": "Wake up the robot or put it to rest position for power management",
"category": "system",
"icon": "power",
"parametersSchema": {
"type": "object",
"properties": {
"action": {
"type": "string",
"title": "Action",
"description": "Wake up robot or put to rest",
"enum": ["wake", "rest"],
"enumNames": ["Wake Up Robot", "Put Robot to Rest"],
"default": "wake"
},
"waitForCompletion": {
"type": "boolean",
"title": "Wait for Completion",
"description": "Wait until wake/rest action is complete",
"default": true
}
},
"required": ["action"]
},
"implementation": {
"type": "ros2_service",
"service": "/naoqi_driver/motion/{{action}}_up",
"serviceType": "std_srvs/srv/Empty",
"requestMapping": {}
}
},
{
"id": "nao_status_check",
"name": "Check Robot Status",
"description": "Get current robot status including battery, temperature, and system health",
"category": "system",
"icon": "info",
"parametersSchema": {
"type": "object",
"properties": {
"statusType": {
"type": "string",
"title": "Status Information",
"description": "What status information to retrieve",
"enum": ["basic", "battery", "sensors", "joints", "all"],
"enumNames": ["Basic Status", "Battery Info", "Sensor Status", "Joint Status", "Complete Status"],
"default": "basic"
},
"logToExperiment": {
"type": "boolean",
"title": "Log to Experiment Data",
"description": "Save status information to experiment logs",
"default": true
}
},
"required": ["statusType"]
},
"implementation": {
"type": "ros2_service",
"service": "/naoqi_driver/get_robot_config",
"serviceType": "naoqi_bridge_msgs/srv/GetRobotInfo",
"requestMapping": {}
}
}
],
"installation": {
"requirements": [
"ROS2 Humble or compatible",
"NAO6 robot with NAOqi 2.8.7.4+",
"Network connectivity to robot",
"naoqi_driver2 package",
"rosbridge_suite package"
],
"setup": [
{
"step": 1,
"description": "Install NAO ROS2 packages",
"command": "cd ~/naoqi_ros2_ws && colcon build"
},
{
"step": 2,
"description": "Start NAO integration",
"command": "ros2 launch nao_launch nao6_production.launch.py nao_ip:=nao.local password:=robolab"
},
{
"step": 3,
"description": "Configure HRIStudio plugin",
"description_detail": "Set WebSocket URL to ws://localhost:9090 in plugin configuration"
}
],
"verification": [
{
"description": "Test robot connectivity",
"command": "ping nao.local"
},
{
"description": "Verify ROS topics",
"command": "ros2 topic list | grep naoqi"
},
{
"description": "Test WebSocket bridge",
"command": "ros2 node list | grep rosbridge"
}
]
},
"troubleshooting": {
"commonIssues": [
{
"issue": "Robot not responding to commands",
"solution": "Ensure robot is awake. Use 'Wake Up / Rest Robot' action or press chest button for 3 seconds."
},
{
"issue": "WebSocket connection failed",
"solution": "Check that rosbridge is running: ros2 node list | grep rosbridge. Restart if needed."
},
{
"issue": "Robot movements too fast/unsafe",
"solution": "Adjust maxLinearVelocity and maxAngularVelocity in plugin configuration."
},
{
"issue": "Speech not working",
"solution": "Check robot volume settings and ensure speech synthesis service is active."
}
],
"safetyNotes": [
"Always ensure clear space around robot during movement",
"Use Emergency Stop action if robot behaves unexpectedly",
"Monitor battery level during long experiments",
"Start with slow movements to test robot response",
"Keep robot on stable, level surfaces"
]
},
"examples": [
{
"name": "Basic Greeting Interaction",
"description": "Simple greeting sequence with speech and gesture",
"actions": [
{"action": "nao_wake_rest", "parameters": {"action": "wake"}},
{"action": "nao_speak", "parameters": {"text": "Hello! Welcome to our experiment."}},
{"action": "nao_gesture", "parameters": {"gesture": "wave"}},
{"action": "nao_pose", "parameters": {"posture": "Stand"}}
]
},
{
"name": "Attention and Pointing",
"description": "Direct attention using head movement and pointing",
"actions": [
{"action": "nao_head_movement", "parameters": {"presetDirection": "left"}},
{"action": "nao_speak", "parameters": {"text": "Please look over there."}},
{"action": "nao_gesture", "parameters": {"gesture": "point_left"}},
{"action": "nao_head_movement", "parameters": {"presetDirection": "center"}}
]
},
{
"name": "Interactive Sensor Monitoring",
"description": "Monitor for touch interactions and respond",
"actions": [
{"action": "nao_speak", "parameters": {"text": "Touch my head when you're ready to continue."}},
{"action": "nao_sensor_monitor", "parameters": {"sensorType": "touch", "triggerAction": "speak"}},
{"action": "nao_speak", "parameters": {"text": "Thank you! Let's continue."}}
]
}
],
"createdAt": "2024-12-16T00:00:00Z",
"updatedAt": "2024-12-16T00:00:00Z"
}

View File

@@ -0,0 +1,7 @@
[
"nao6-movement.json",
"nao6-speech.json",
"nao6-sensors.json",
"nao6-vision.json",
"nao6-interaction.json"
]

View File

@@ -0,0 +1,342 @@
{
"name": "NAO6 Movement Control",
"version": "1.0.0",
"description": "Complete movement control for NAO6 robot including walking, turning, and joint manipulation",
"platform": "NAO6",
"category": "movement",
"manufacturer": {
"name": "SoftBank Robotics",
"website": "https://www.softbankrobotics.com"
},
"documentation": {
"mainUrl": "https://docs.hristudio.com/robots/nao6/movement",
"quickStart": "https://docs.hristudio.com/robots/nao6/movement/quickstart"
},
"ros2Config": {
"namespace": "/naoqi_driver",
"topics": {
"cmd_vel": {
"type": "geometry_msgs/Twist",
"description": "Velocity commands for robot base movement"
},
"joint_angles": {
"type": "naoqi_bridge_msgs/JointAnglesWithSpeed",
"description": "Individual joint angle control with speed"
},
"joint_states": {
"type": "sensor_msgs/JointState",
"description": "Current joint positions and velocities"
}
}
},
"actions": [
{
"id": "walk_forward",
"name": "Walk Forward",
"description": "Make the robot walk forward at specified speed",
"category": "movement",
"parameters": [
{
"name": "speed",
"type": "number",
"description": "Walking speed in m/s",
"required": true,
"min": 0.01,
"max": 0.3,
"default": 0.1,
"step": 0.01
},
{
"name": "duration",
"type": "number",
"description": "Duration to walk in seconds (0 = indefinite)",
"required": false,
"min": 0,
"max": 30,
"default": 0,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/cmd_vel",
"messageType": "geometry_msgs/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",
"parameters": [
{
"name": "speed",
"type": "number",
"description": "Walking speed in m/s",
"required": true,
"min": 0.01,
"max": 0.3,
"default": 0.1,
"step": 0.01
},
{
"name": "duration",
"type": "number",
"description": "Duration to walk in seconds (0 = indefinite)",
"required": false,
"min": 0,
"max": 30,
"default": 0,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/cmd_vel",
"messageType": "geometry_msgs/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",
"parameters": [
{
"name": "speed",
"type": "number",
"description": "Angular speed in rad/s",
"required": true,
"min": 0.1,
"max": 1.0,
"default": 0.3,
"step": 0.1
},
{
"name": "duration",
"type": "number",
"description": "Duration to turn in seconds (0 = indefinite)",
"required": false,
"min": 0,
"max": 30,
"default": 0,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/cmd_vel",
"messageType": "geometry_msgs/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",
"parameters": [
{
"name": "speed",
"type": "number",
"description": "Angular speed in rad/s",
"required": true,
"min": 0.1,
"max": 1.0,
"default": 0.3,
"step": 0.1
},
{
"name": "duration",
"type": "number",
"description": "Duration to turn in seconds (0 = indefinite)",
"required": false,
"min": 0,
"max": 30,
"default": 0,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/cmd_vel",
"messageType": "geometry_msgs/Twist",
"messageTemplate": {
"linear": { "x": 0, "y": 0, "z": 0 },
"angular": { "x": 0, "y": 0, "z": "-{{speed}}" }
}
}
},
{
"id": "stop_movement",
"name": "Stop Movement",
"description": "Immediately stop all robot movement",
"category": "movement",
"parameters": [],
"implementation": {
"topic": "/naoqi_driver/cmd_vel",
"messageType": "geometry_msgs/Twist",
"messageTemplate": {
"linear": { "x": 0, "y": 0, "z": 0 },
"angular": { "x": 0, "y": 0, "z": 0 }
}
}
},
{
"id": "move_head",
"name": "Move Head",
"description": "Control head orientation (yaw and pitch)",
"category": "movement",
"parameters": [
{
"name": "yaw",
"type": "number",
"description": "Head yaw angle in radians",
"required": true,
"min": -2.09,
"max": 2.09,
"default": 0,
"step": 0.1
},
{
"name": "pitch",
"type": "number",
"description": "Head pitch angle in radians",
"required": true,
"min": -0.67,
"max": 0.51,
"default": 0,
"step": 0.1
},
{
"name": "speed",
"type": "number",
"description": "Movement speed (0.1 = slow, 1.0 = fast)",
"required": false,
"min": 0.1,
"max": 1.0,
"default": 0.3,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/joint_angles",
"messageType": "naoqi_bridge_msgs/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",
"parameters": [
{
"name": "arm",
"type": "select",
"description": "Which arm to control",
"required": true,
"options": [
{ "value": "left", "label": "Left Arm" },
{ "value": "right", "label": "Right Arm" }
],
"default": "right"
},
{
"name": "shoulder_pitch",
"type": "number",
"description": "Shoulder pitch angle in radians",
"required": true,
"min": -2.09,
"max": 2.09,
"default": 1.4,
"step": 0.1
},
{
"name": "shoulder_roll",
"type": "number",
"description": "Shoulder roll angle in radians",
"required": true,
"min": -0.31,
"max": 1.33,
"default": 0.2,
"step": 0.1
},
{
"name": "elbow_yaw",
"type": "number",
"description": "Elbow yaw angle in radians",
"required": true,
"min": -2.09,
"max": 2.09,
"default": 0,
"step": 0.1
},
{
"name": "elbow_roll",
"type": "number",
"description": "Elbow roll angle in radians",
"required": true,
"min": -1.54,
"max": -0.03,
"default": -0.5,
"step": 0.1
},
{
"name": "speed",
"type": "number",
"description": "Movement speed (0.1 = slow, 1.0 = fast)",
"required": false,
"min": 0.1,
"max": 1.0,
"default": 0.3,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/joint_angles",
"messageType": "naoqi_bridge_msgs/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}}"
}
}
}
],
"safety": {
"maxSpeed": 0.3,
"emergencyStop": {
"action": "stop_movement",
"description": "Immediately stops all movement"
},
"jointLimits": {
"HeadYaw": { "min": -2.09, "max": 2.09 },
"HeadPitch": { "min": -0.67, "max": 0.51 },
"LShoulderPitch": { "min": -2.09, "max": 2.09 },
"RShoulderPitch": { "min": -2.09, "max": 2.09 },
"LShoulderRoll": { "min": -0.31, "max": 1.33 },
"RShoulderRoll": { "min": -1.33, "max": 0.31 },
"LElbowYaw": { "min": -2.09, "max": 2.09 },
"RElbowYaw": { "min": -2.09, "max": 2.09 },
"LElbowRoll": { "min": 0.03, "max": 1.54 },
"RElbowRoll": { "min": -1.54, "max": -0.03 }
}
}
}

View File

@@ -0,0 +1,464 @@
{
"name": "NAO6 Sensors & Feedback",
"version": "1.0.0",
"description": "Complete sensor suite for NAO6 robot including touch sensors, sonar, IMU, cameras, and joint state monitoring",
"platform": "NAO6",
"category": "sensors",
"manufacturer": {
"name": "SoftBank Robotics",
"website": "https://www.softbankrobotics.com"
},
"documentation": {
"mainUrl": "https://docs.hristudio.com/robots/nao6/sensors",
"quickStart": "https://docs.hristudio.com/robots/nao6/sensors/quickstart"
},
"ros2Config": {
"namespace": "/naoqi_driver",
"topics": {
"joint_states": {
"type": "sensor_msgs/JointState",
"description": "Current positions, velocities, and efforts of all joints"
},
"imu": {
"type": "sensor_msgs/Imu",
"description": "Inertial measurement unit data (acceleration, angular velocity, orientation)"
},
"bumper": {
"type": "naoqi_bridge_msgs/Bumper",
"description": "Foot bumper sensor states"
},
"hand_touch": {
"type": "naoqi_bridge_msgs/HandTouch",
"description": "Hand tactile sensor states"
},
"head_touch": {
"type": "naoqi_bridge_msgs/HeadTouch",
"description": "Head tactile sensor states"
},
"sonar/left": {
"type": "sensor_msgs/Range",
"description": "Left ultrasonic range sensor"
},
"sonar/right": {
"type": "sensor_msgs/Range",
"description": "Right ultrasonic range sensor"
},
"camera/front/image_raw": {
"type": "sensor_msgs/Image",
"description": "Front camera image feed"
},
"camera/bottom/image_raw": {
"type": "sensor_msgs/Image",
"description": "Bottom camera image feed"
},
"battery": {
"type": "sensor_msgs/BatteryState",
"description": "Battery level and charging status"
}
}
},
"actions": [
{
"id": "get_joint_states",
"name": "Get Joint States",
"description": "Read current positions and velocities of all robot joints",
"category": "sensors",
"parameters": [
{
"name": "specific_joints",
"type": "multiselect",
"description": "Specific joints to monitor (empty = all joints)",
"required": false,
"options": [
{ "value": "HeadYaw", "label": "Head Yaw" },
{ "value": "HeadPitch", "label": "Head Pitch" },
{ "value": "LShoulderPitch", "label": "Left Shoulder Pitch" },
{ "value": "LShoulderRoll", "label": "Left Shoulder Roll" },
{ "value": "LElbowYaw", "label": "Left Elbow Yaw" },
{ "value": "LElbowRoll", "label": "Left Elbow Roll" },
{ "value": "RShoulderPitch", "label": "Right Shoulder Pitch" },
{ "value": "RShoulderRoll", "label": "Right Shoulder Roll" },
{ "value": "RElbowYaw", "label": "Right Elbow Yaw" },
{ "value": "RElbowRoll", "label": "Right Elbow Roll" }
]
}
],
"implementation": {
"topic": "/naoqi_driver/joint_states",
"messageType": "sensor_msgs/JointState",
"mode": "subscribe"
}
},
{
"id": "get_touch_sensors",
"name": "Get Touch Sensors",
"description": "Monitor all tactile sensors on head and hands",
"category": "sensors",
"parameters": [
{
"name": "sensor_type",
"type": "select",
"description": "Type of touch sensors to monitor",
"required": false,
"options": [
{ "value": "all", "label": "All Touch Sensors" },
{ "value": "head", "label": "Head Touch Only" },
{ "value": "hands", "label": "Hand Touch Only" }
],
"default": "all"
}
],
"implementation": {
"topics": [
"/naoqi_driver/head_touch",
"/naoqi_driver/hand_touch"
],
"messageTypes": [
"naoqi_bridge_msgs/HeadTouch",
"naoqi_bridge_msgs/HandTouch"
],
"mode": "subscribe"
}
},
{
"id": "get_sonar_distance",
"name": "Get Sonar Distance",
"description": "Read ultrasonic distance sensors for obstacle detection",
"category": "sensors",
"parameters": [
{
"name": "sensor_side",
"type": "select",
"description": "Which sonar sensor to read",
"required": false,
"options": [
{ "value": "both", "label": "Both Sensors" },
{ "value": "left", "label": "Left Sensor Only" },
{ "value": "right", "label": "Right Sensor Only" }
],
"default": "both"
},
{
"name": "min_range",
"type": "number",
"description": "Minimum detection range in meters",
"required": false,
"min": 0.1,
"max": 1.0,
"default": 0.25,
"step": 0.05
},
{
"name": "max_range",
"type": "number",
"description": "Maximum detection range in meters",
"required": false,
"min": 1.0,
"max": 3.0,
"default": 2.55,
"step": 0.05
}
],
"implementation": {
"topics": [
"/naoqi_driver/sonar/left",
"/naoqi_driver/sonar/right"
],
"messageType": "sensor_msgs/Range",
"mode": "subscribe"
}
},
{
"id": "get_imu_data",
"name": "Get IMU Data",
"description": "Read inertial measurement unit data (acceleration, gyroscope, orientation)",
"category": "sensors",
"parameters": [
{
"name": "data_type",
"type": "select",
"description": "Type of IMU data to monitor",
"required": false,
"options": [
{ "value": "all", "label": "All IMU Data" },
{ "value": "orientation", "label": "Orientation Only" },
{ "value": "acceleration", "label": "Linear Acceleration" },
{ "value": "angular_velocity", "label": "Angular Velocity" }
],
"default": "all"
}
],
"implementation": {
"topic": "/naoqi_driver/imu",
"messageType": "sensor_msgs/Imu",
"mode": "subscribe"
}
},
{
"id": "get_camera_image",
"name": "Get Camera Image",
"description": "Capture image from robot's cameras",
"category": "sensors",
"parameters": [
{
"name": "camera",
"type": "select",
"description": "Which camera to use",
"required": true,
"options": [
{ "value": "front", "label": "Front Camera" },
{ "value": "bottom", "label": "Bottom Camera" }
],
"default": "front"
},
{
"name": "resolution",
"type": "select",
"description": "Image resolution",
"required": false,
"options": [
{ "value": "160x120", "label": "QQVGA (160x120)" },
{ "value": "320x240", "label": "QVGA (320x240)" },
{ "value": "640x480", "label": "VGA (640x480)" }
],
"default": "320x240"
},
{
"name": "fps",
"type": "number",
"description": "Frames per second",
"required": false,
"min": 1,
"max": 30,
"default": 15,
"step": 1
}
],
"implementation": {
"topic": "/naoqi_driver/camera/{{camera}}/image_raw",
"messageType": "sensor_msgs/Image",
"mode": "subscribe"
}
},
{
"id": "get_battery_status",
"name": "Get Battery Status",
"description": "Monitor robot battery level and charging status",
"category": "sensors",
"parameters": [],
"implementation": {
"topic": "/naoqi_driver/battery",
"messageType": "sensor_msgs/BatteryState",
"mode": "subscribe"
}
},
{
"id": "detect_obstacle",
"name": "Detect Obstacle",
"description": "Check for obstacles using sonar sensors with customizable thresholds",
"category": "sensors",
"parameters": [
{
"name": "detection_distance",
"type": "number",
"description": "Distance threshold for obstacle detection (meters)",
"required": true,
"min": 0.1,
"max": 2.0,
"default": 0.5,
"step": 0.1
},
{
"name": "sensor_side",
"type": "select",
"description": "Which sensors to use for detection",
"required": false,
"options": [
{ "value": "both", "label": "Both Sensors" },
{ "value": "left", "label": "Left Sensor Only" },
{ "value": "right", "label": "Right Sensor Only" }
],
"default": "both"
}
],
"implementation": {
"topics": [
"/naoqi_driver/sonar/left",
"/naoqi_driver/sonar/right"
],
"messageType": "sensor_msgs/Range",
"mode": "subscribe",
"processing": "obstacle_detection"
}
},
{
"id": "monitor_fall_detection",
"name": "Monitor Fall Detection",
"description": "Monitor robot stability using IMU data to detect potential falls",
"category": "sensors",
"parameters": [
{
"name": "tilt_threshold",
"type": "number",
"description": "Maximum tilt angle before fall alert (degrees)",
"required": false,
"min": 10,
"max": 45,
"default": 25,
"step": 5
},
{
"name": "acceleration_threshold",
"type": "number",
"description": "Acceleration threshold for impact detection (m/s²)",
"required": false,
"min": 5,
"max": 20,
"default": 10,
"step": 1
}
],
"implementation": {
"topic": "/naoqi_driver/imu",
"messageType": "sensor_msgs/Imu",
"mode": "subscribe",
"processing": "fall_detection"
}
},
{
"id": "wait_for_touch",
"name": "Wait for Touch",
"description": "Wait for user to touch a specific sensor before continuing",
"category": "sensors",
"parameters": [
{
"name": "sensor_location",
"type": "select",
"description": "Which sensor to wait for",
"required": true,
"options": [
{ "value": "head_front", "label": "Head Front" },
{ "value": "head_middle", "label": "Head Middle" },
{ "value": "head_rear", "label": "Head Rear" },
{ "value": "left_hand", "label": "Left Hand" },
{ "value": "right_hand", "label": "Right Hand" },
{ "value": "any_head", "label": "Any Head Sensor" },
{ "value": "any_hand", "label": "Any Hand Sensor" },
{ "value": "any_touch", "label": "Any Touch Sensor" }
],
"default": "head_front"
},
{
"name": "timeout",
"type": "number",
"description": "Maximum time to wait for touch (seconds, 0 = infinite)",
"required": false,
"min": 0,
"max": 300,
"default": 30,
"step": 5
}
],
"implementation": {
"topics": [
"/naoqi_driver/head_touch",
"/naoqi_driver/hand_touch"
],
"messageTypes": [
"naoqi_bridge_msgs/HeadTouch",
"naoqi_bridge_msgs/HandTouch"
],
"mode": "wait_for_condition",
"condition": "touch_detected"
}
}
],
"sensorSpecifications": {
"touchSensors": {
"head": {
"locations": ["front", "middle", "rear"],
"sensitivity": "capacitive",
"responseTime": "< 50ms"
},
"hands": {
"locations": ["left", "right"],
"sensitivity": "capacitive",
"responseTime": "< 50ms"
}
},
"sonarSensors": {
"count": 2,
"locations": ["left", "right"],
"minRange": "0.25m",
"maxRange": "2.55m",
"fieldOfView": "60°",
"frequency": "40kHz"
},
"cameras": {
"front": {
"resolution": "640x480",
"maxFps": 30,
"fieldOfView": "60.9° x 47.6°"
},
"bottom": {
"resolution": "640x480",
"maxFps": 30,
"fieldOfView": "60.9° x 47.6°"
}
},
"imu": {
"accelerometer": {
"range": "±2g",
"sensitivity": "high"
},
"gyroscope": {
"range": "±500°/s",
"sensitivity": "high"
},
"magnetometer": {
"available": false
}
},
"joints": {
"count": 25,
"encoderResolution": "12-bit",
"positionAccuracy": "±0.1°"
}
},
"dataTypes": {
"jointState": {
"position": "radians",
"velocity": "radians/second",
"effort": "arbitrary units"
},
"imu": {
"orientation": "quaternion",
"angularVelocity": "radians/second",
"linearAcceleration": "m/s²"
},
"range": {
"distance": "meters",
"minRange": "meters",
"maxRange": "meters"
},
"image": {
"encoding": "rgb8",
"width": "pixels",
"height": "pixels"
}
},
"safety": {
"fallDetection": {
"enabled": true,
"defaultThreshold": "25°"
},
"obstacleDetection": {
"enabled": true,
"safeDistance": "0.3m"
},
"batteryMonitoring": {
"lowBatteryWarning": "20%",
"criticalBatteryShutdown": "5%"
}
}
}

View File

@@ -0,0 +1,338 @@
{
"name": "NAO6 Speech & Audio",
"version": "1.0.0",
"description": "Text-to-speech and audio capabilities for NAO6 robot including voice synthesis, volume control, and language settings",
"platform": "NAO6",
"category": "speech",
"manufacturer": {
"name": "SoftBank Robotics",
"website": "https://www.softbankrobotics.com"
},
"documentation": {
"mainUrl": "https://docs.hristudio.com/robots/nao6/speech",
"quickStart": "https://docs.hristudio.com/robots/nao6/speech/quickstart"
},
"ros2Config": {
"namespace": "/naoqi_driver",
"topics": {
"speech": {
"type": "std_msgs/String",
"description": "Text-to-speech commands"
},
"set_language": {
"type": "std_msgs/String",
"description": "Set speech language"
},
"audio_volume": {
"type": "std_msgs/Float32",
"description": "Control audio volume level"
}
}
},
"actions": [
{
"id": "say_text",
"name": "Say Text",
"description": "Make the robot speak the specified text using text-to-speech",
"category": "speech",
"parameters": [
{
"name": "text",
"type": "text",
"description": "Text for the robot to speak",
"required": true,
"maxLength": 500,
"placeholder": "Enter text for NAO to say..."
},
{
"name": "wait_for_completion",
"type": "boolean",
"description": "Wait for speech to finish before continuing",
"required": false,
"default": true
}
],
"implementation": {
"topic": "/naoqi_driver/speech",
"messageType": "std_msgs/String",
"messageTemplate": {
"data": "{{text}}"
}
}
},
{
"id": "say_with_emotion",
"name": "Say Text with Emotion",
"description": "Speak text with emotional expression using SSML-like markup",
"category": "speech",
"parameters": [
{
"name": "text",
"type": "text",
"description": "Text for the robot to speak",
"required": true,
"maxLength": 500,
"placeholder": "Enter text for NAO to say..."
},
{
"name": "emotion",
"type": "select",
"description": "Emotional tone for speech",
"required": false,
"options": [
{ "value": "neutral", "label": "Neutral" },
{ "value": "happy", "label": "Happy" },
{ "value": "sad", "label": "Sad" },
{ "value": "excited", "label": "Excited" },
{ "value": "calm", "label": "Calm" }
],
"default": "neutral"
},
{
"name": "speed",
"type": "number",
"description": "Speech speed multiplier",
"required": false,
"min": 0.5,
"max": 2.0,
"default": 1.0,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/speech",
"messageType": "std_msgs/String",
"messageTemplate": {
"data": "\\rspd={{speed}}\\\\rst={{emotion}}\\{{text}}"
}
}
},
{
"id": "set_volume",
"name": "Set Volume",
"description": "Adjust the robot's audio volume level",
"category": "speech",
"parameters": [
{
"name": "volume",
"type": "number",
"description": "Volume level (0.0 = silent, 1.0 = maximum)",
"required": true,
"min": 0.0,
"max": 1.0,
"default": 0.5,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/audio_volume",
"messageType": "std_msgs/Float32",
"messageTemplate": {
"data": "{{volume}}"
}
}
},
{
"id": "set_language",
"name": "Set Language",
"description": "Change the robot's speech language",
"category": "speech",
"parameters": [
{
"name": "language",
"type": "select",
"description": "Speech language",
"required": true,
"options": [
{ "value": "en-US", "label": "English (US)" },
{ "value": "en-GB", "label": "English (UK)" },
{ "value": "fr-FR", "label": "French" },
{ "value": "de-DE", "label": "German" },
{ "value": "es-ES", "label": "Spanish" },
{ "value": "it-IT", "label": "Italian" },
{ "value": "ja-JP", "label": "Japanese" },
{ "value": "ko-KR", "label": "Korean" },
{ "value": "zh-CN", "label": "Chinese (Simplified)" }
],
"default": "en-US"
}
],
"implementation": {
"topic": "/naoqi_driver/set_language",
"messageType": "std_msgs/String",
"messageTemplate": {
"data": "{{language}}"
}
}
},
{
"id": "say_random_phrase",
"name": "Say Random Phrase",
"description": "Make the robot say a random phrase from predefined categories",
"category": "speech",
"parameters": [
{
"name": "category",
"type": "select",
"description": "Category of phrases",
"required": true,
"options": [
{ "value": "greeting", "label": "Greetings" },
{ "value": "encouragement", "label": "Encouragement" },
{ "value": "question", "label": "Questions" },
{ "value": "farewell", "label": "Farewells" },
{ "value": "instruction", "label": "Instructions" }
],
"default": "greeting"
}
],
"implementation": {
"topic": "/naoqi_driver/speech",
"messageType": "std_msgs/String",
"messageTemplate": {
"data": "{{getRandomPhrase(category)}}"
}
},
"phrases": {
"greeting": [
"Hello! Nice to meet you!",
"Hi there! How are you today?",
"Welcome! I'm excited to work with you.",
"Good day! Ready to get started?",
"Greetings! What shall we do today?"
],
"encouragement": [
"Great job! Keep it up!",
"You're doing wonderfully!",
"Excellent work! I'm impressed.",
"That's fantastic! Well done!",
"Perfect! You've got this!"
],
"question": [
"How can I help you today?",
"What would you like to do next?",
"Is there anything you'd like to know?",
"Shall we try something different?",
"What are you thinking about?"
],
"farewell": [
"Goodbye! It was great working with you!",
"See you later! Take care!",
"Until next time! Have a wonderful day!",
"Farewell! Thanks for spending time with me!",
"Bye for now! Look forward to seeing you again!"
],
"instruction": [
"Please follow my movements.",
"Let's try this step by step.",
"Watch carefully and then repeat.",
"Take your time, there's no rush.",
"Remember to stay focused."
]
}
},
{
"id": "spell_word",
"name": "Spell Word",
"description": "Have the robot spell out a word letter by letter",
"category": "speech",
"parameters": [
{
"name": "word",
"type": "text",
"description": "Word to spell out",
"required": true,
"maxLength": 50,
"placeholder": "Enter word to spell..."
},
{
"name": "pause_duration",
"type": "number",
"description": "Pause between letters in seconds",
"required": false,
"min": 0.1,
"max": 2.0,
"default": 0.5,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/speech",
"messageType": "std_msgs/String",
"messageTemplate": {
"data": "{{word.split('').join('\\pau={{pause_duration * 1000}}\\\\pau=0\\')}}"
}
}
},
{
"id": "count_numbers",
"name": "Count Numbers",
"description": "Have the robot count from one number to another",
"category": "speech",
"parameters": [
{
"name": "start",
"type": "number",
"description": "Starting number",
"required": true,
"min": 0,
"max": 100,
"default": 1,
"step": 1
},
{
"name": "end",
"type": "number",
"description": "Ending number",
"required": true,
"min": 0,
"max": 100,
"default": 10,
"step": 1
},
{
"name": "pause_duration",
"type": "number",
"description": "Pause between numbers in seconds",
"required": false,
"min": 0.1,
"max": 2.0,
"default": 0.8,
"step": 0.1
}
],
"implementation": {
"topic": "/naoqi_driver/speech",
"messageType": "std_msgs/String",
"messageTemplate": {
"data": "{{Array.from({length: end - start + 1}, (_, i) => start + i).join('\\pau={{pause_duration * 1000}}\\\\pau=0\\')}}"
}
}
}
],
"features": {
"languages": [
"en-US", "en-GB", "fr-FR", "de-DE", "es-ES",
"it-IT", "ja-JP", "ko-KR", "zh-CN"
],
"emotions": [
"neutral", "happy", "sad", "excited", "calm"
],
"voiceEffects": [
"speed", "pitch", "volume", "emotion"
],
"ssmlSupport": true,
"maxTextLength": 500
},
"safety": {
"maxVolume": 1.0,
"defaultVolume": 0.5,
"profanityFilter": true,
"maxSpeechDuration": 60,
"emergencyQuiet": {
"action": "set_volume",
"parameters": { "volume": 0 },
"description": "Immediately mute robot audio"
}
}
}

View File

@@ -0,0 +1,44 @@
{
"name": "NAO6 ROS2 Integration Repository",
"description": "Official NAO6 robot plugins for ROS2-based Human-Robot Interaction experiments",
"version": "1.0.0",
"author": {
"name": "HRIStudio Team",
"email": "support@hristudio.com"
},
"urls": {
"git": "https://github.com/hristudio/nao6-ros2-plugins",
"documentation": "https://docs.hristudio.com/robots/nao6",
"issues": "https://github.com/hristudio/nao6-ros2-plugins/issues"
},
"trust": "official",
"license": "MIT",
"robots": [
{
"name": "NAO6",
"manufacturer": "SoftBank Robotics",
"model": "NAO V6",
"communicationProtocol": "ros2"
}
],
"categories": [
"movement",
"speech",
"sensors",
"interaction",
"vision"
],
"ros2": {
"distro": "humble",
"packages": [
"naoqi_driver2",
"naoqi_bridge_msgs",
"rosbridge_suite"
],
"bridge": {
"protocol": "websocket",
"defaultPort": 9090
}
},
"lastUpdated": "2025-01-16T00:00:00Z"
}