Interacción por voz en ROS1
1、Preparación del entorno
Requisitos del sistema
Sistema operativo: Ubuntu 20.04 u 18.04
Versión de ROS1: Noetic (recomendado) o Melodic
Instalar las bibliotecas de dependencias
# 1. Actualizar las fuentes
sudo apt update
# 2. Instalar ROS1 Desktop completo
# (si ROS1 ya está instalado, omitir)
sudo apt install ros-noetic-desktop-full -y # Ubuntu 20.04
sudo apt install ros-melodic-desktop-full -y # Ubuntu 18.04
# 3. Instalar las dependencias de este proyecto (compatible con puerto serie e I2C)
sudo apt install python3-pip ros-noetic-rviz i2c-tools -y
pip3 install pyserial smbus2
# Si es Melodic (Python2)
sudo apt install python-pip ros-melodic-rviz i2c-tools -y
pip install pyserial smbus2
# 4. Si se usa el cableado I2C, instalar además
sudo apt install python3-smbus2 -y2、Descripción de los tres métodos de cableado
El módulo de interacción por voz de IA admite los siguientes tres métodos de cableado:
Mecanismo de detección automática
Cuando se inicia el nodo de ROS1, detecta automáticamente el método de cableado en el siguiente orden:
Primero prueba el puerto serie: comprueba sucesivamente
/dev/ttyUSB0→/dev/ttyACM0→/dev/ttyAMA0→/dev/ttyS0Después prueba I2C: comprueba si existe el esclavo
0x2Aen/dev/i2c-1Para la detección del puerto serie, basta con que el archivo de dispositivo exista y se pueda abrir para considerarlo disponible; no se requiere verificación adicional
Una vez detectado cualquiera de los métodos, la detección se detiene y se fija ese método para su uso. No se requiere ninguna configuración manual.
3、Descripción del protocolo IIC
Configuración del esclavo IIC
Definición de registros
4、Descripción del protocolo de puerto serie (Type-C / UART)
Formato de trama
Cada trama es fija de 5 bytes:
Velocidad en baudios
Fija de 115200 bps.
5、Crear el espacio de trabajo y la estructura de directorios
Crear el espacio de trabajo catkin
mkdir -p ~/juxi_speech_ws/src
cd ~/juxi_speech_ws/srcCrear el paquete de ROS
catkin_create_pkg juxi_voice rospy std_msgs visualization_msgsEstructura de directorios final
Coloque los archivos proporcionados con este proyecto en las ubicaciones correspondientes:
~/juxi_speech_ws/
├── build/
├── devel/
└── src/
└── juxi_voice/
├── CMakeLists.txt # (sustituir por el proporcionado en este proyecto)
├── package.xml # (sustituir por el proporcionado en este proyecto)
├── juxi_voice.rviz # (nuevo: archivo de preconfiguración de RViz)
├── launch/
│ └── juxi_voice.launch # (nuevo: archivo de inicio con un clic)
└── scripts/
├── voice_node.py # (nuevo: nodo de voz)
└── rviz_control.py # (nuevo: nodo de control de RViz)6、Contenido y ubicación de los archivos
Archivo 1: voice_node.py (Nodo de control por voz)
Ubicación: ~/juxi_speech_ws/src/juxi_voice/scripts/voice_node.py
Funciones principales:
Detecta automáticamente el método de cableado Type-C / UART / IIC
Tabla unificada de asignación de palabras de comando (114 palabras de comando, totalmente coherente con la tabla de protocolo V1 de Excel)
Utiliza el backend de comunicación correspondiente (puerto serie / I2C) según el método de cableado
Arquitectura clave:
# Datos de comando unificados: ID → (byte 2 del puerto serie, byte 3 del puerto serie, texto del comando, modo de reproducción)
CMD_DATA = {
1: (0x01, 0x00, "欢迎语", "被"),
3: (0x03, 0x00, "你好小犀", "主"),
14: (0x00, 0x04, "小车前进", "主"),
84: (0xFF, 0x5F, "这是红色", "被"),
...
}
# Función de detección automática
def detect_connection():
# 1. Probar el puerto serie /dev/ttyUSB0, /dev/ttyACM0, /dev/ttyAMA0, /dev/ttyS0
# 2. Probar I2C /dev/i2c-1 (dirección de esclavo 0x2A)
...(Para ver el código completo, consulte el archivo voice_node.py proporcionado con el proyecto)
Archivo 2: rviz_control.py (Nodo de control de RViz)
Ubicación: ~/juxi_speech_ws/src/juxi_voice/scripts/rviz_control.py
Se suscribe al tema /juxi_voice_cmd para recibir el texto del comando y actualiza la visualización del cubo según el comando.
(Para ver el código completo, consulte el archivo rviz_control.py proporcionado con el proyecto)
Archivo 3: CMakeLists.txt y package.xml
Ya se proporcionan en este proyecto; simplemente reemplace los archivos predeterminados generados automáticamente por catkin_create_pkg.
7、Compilar y ejecutar
Compilar
cd ~/juxi_speech_ws
catkin_makeVariables de entorno
source ~/juxi_speech_ws/devel/setup.bash
# o añadirlo a ~/.bashrc
echo "source ~/juxi_speech_ws/devel/setup.bash" >> ~/.bashrcConfiguración de permisos
# Permisos de I2C
sudo chmod 666 /dev/i2c-1
# Permisos del puerto serie
sudo chmod 666 /dev/ttyUSB0
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyAMA0
# o unirse al grupo de usuarios
sudo usermod -aG dialout $USER
sudo usermod -aG i2c $USER
# Después de configurarlo, hay que volver a iniciar sesión para que surta efectoEjecutar los nodos
Método 1: Inicio con un solo clic (recomendado)
cd ~/juxi_speech_ws
source devel/setup.bash
roslaunch juxi_voice juxi_voice.launchAl iniciar, se abren automáticamente el nodo de voz, el nodo de control de RViz y la interfaz de visualización de RViz.
Método 2: Inicio por pasos (3 terminales)
Terminal 1: iniciar roscore
roscoreTerminal 2: nodo de voz
cd ~/juxi_speech_ws
source devel/setup.bash
rosrun juxi_voice voice_node.pyAl iniciar, se muestra el método de cableado detectado:
[INFO] 自动检测: IIC /dev/i2c-1 (从机地址 0x2A)
[INFO] 语音节点启动完成 - IIC /dev/i2c-1 (从机地址 0x2A)o
[INFO] 自动检测: UART /dev/ttyUSB0
[INFO] 语音节点启动完成 - UART /dev/ttyUSB0Si no se detecta ningún dispositivo:
[FATAL] 未检测到AI语音交互模块!请检查接线 (Type-C / UART / IIC)
[FATAL] 支持的端口: I2C(/dev/i2c-1) | 串口(/dev/ttyUSB0 /dev/ttyACM0 /dev/ttyAMA0 /dev/ttyS0)Terminal 3: nodo de control de RViz
cd ~/juxi_speech_ws
source devel/setup.bash
rosrun juxi_voice rviz_control.pyTerminal 4: visualización de RViz (carga directamente el archivo preconfigurado, sin necesidad de configuración manual)
rviz -d ~/juxi_speech_ws/src/juxi_voice/juxi_voice.rvizO bien abra primero RViz y luego cárguelo:
rviz
# Barra de menú: File → Open Config → seleccionar juxi_voice.rviz8、Descripción de la preconfiguración de RViz
juxi_voice.rviz ya viene preconfigurado con lo siguiente; se puede usar directamente al iniciarlo, sin necesidad de ninguna operación manual:
Fixed Frame:
mapVisualización de Marker: suscrito a
/juxi_visual_marker(marcador único)Visualización de MarkerArray: suscrito a
/juxi_visual_markers(marcadores múltiples: brazo robótico, nivel de batería, alarma, etc.)Punto de vista: observado desde arriba en diagonal, con el centro en el origen
9、Método de uso
Activación
Diga "你好小犀" al módulo → el módulo responde "我在"
Enviar comandos
"小车前进" → el cubo avanza
"亮红灯" → el cubo se vuelve rojo
"打开流水灯" → el color cambia cíclicamente
"报警" → esfera roja pulsante
"显示电量" → texto del nivel de batería
Reproducción activada por el anfitrión
# Reproducción pasiva (I2C → escribir 0xD1; puerto serie → enviar FE EF FF XX EE)
rostopic pub /juxi_passive_play std_msgs/String "data: '这是红色'"
# Reproducción de palabra de función (I2C → escribir 0xD2; puerto serie → enviar FE EF 01 00 EE)
rostopic pub /juxi_func_play std_msgs/String "data: '欢迎语'"
# Reproducción de palabra de comando (I2C → escribir 0xD3; puerto serie → enviar FE EF 00 04 EE)
rostopic pub /juxi_cmd_play std_msgs/String "data: '小车前进'"10、Tabla de referencia de ID de palabras de comando
Un total de 114 palabras de comando, totalmente coherente con
命令词播报词协议列表V1_中文.xlsx.
Palabras de función (ID 1-10)
Palabras de comando (ID 11-83, 113)
Palabras de reproducción pasiva (ID 84-112, 114)
11、Descripción de los temas de ROS1
12、Solución de problemas
1. Al iniciar se muestra "módulo de interacción por voz de IA no detectado"
Compruebe si existe el archivo de dispositivo correspondiente al método de cableado:
# Cableado I2C
ls /dev/i2c-1
sudo i2cdetect -y 1 # Debería verse 0x2A
# Cableado Type-C
ls /dev/ttyUSB0 /dev/ttyACM0
# Cableado UART
ls /dev/ttyAMA0 /dev/ttyS02. Error de permisos del puerto serie
sudo chmod 666 /dev/ttyUSB0 # o /dev/ttyACM0, etc.
# o unirse al grupo de usuarios dialout (requiere volver a iniciar sesión)
sudo usermod -aG dialout $USER3. Error de permisos de I2C
sudo chmod 666 /dev/i2c-1
# o unirse al grupo de usuarios i2c (requiere volver a iniciar sesión)
sudo usermod -aG i2c $USER4. No aparece ningún cubo en RViz
Compruebe si Fixed Frame es
mapCompruebe si el Topic es
/juxi_visual_markerConfirme que el nodo rviz_control.py se ha iniciado
5. No hay reacción a los comandos tras la activación
rostopic echo /juxi_voice_cmdSi hay datos → problema de configuración de RViz; si no hay datos → anomalía de cableado/comunicación.
6. rosrun no encuentra el nodo
Confirme que ya se han ejecutado la compilación y el source:
cd ~/juxi_speech_ws
catkin_make
source devel/setup.bash7. Se informa de un error de sintaxis
# Confirmar que el script de Python tiene permisos de ejecución
chmod +x ~/juxi_speech_ws/src/juxi_voice/scripts/voice_node.py
chmod +x ~/juxi_speech_ws/src/juxi_voice/scripts/rviz_control.py
