Protocolo de comunicaciones
Cuando un dispositivo periférico se comunica con el controlador principal a través del puerto serie, es necesario un protocolo de interacción determinado para completar la transmisión de datos o comandos. Sentry2 es compatible con los protocolos de comandos estándar y simples, y utilizan el mismo formato de protocolo de comunicación. No obstante, es posible que diferentes productos admitan comandos de protocolo ligeramente diferentes. A continuación, se toma como base el Sentry2. Para obtener más información detallada o requisitos técnicos, hay que ponerse en contacto con:
- Soporte técnico: support@aitosee.com
- Ventas: sales@aitosee.com.
Protocolo de comandos estándar¶
El protocolo de comando estándar tiene un formato de datos estandarizado, y combinado con la tabla de registro, puede lograr funciones completas de interacción de datos y una alta eficiencia de comunicación.
Formato del comando¶
START | LEN | ADDR | CMD | DATA | CHKSUM | END
Símbolo | Significado | Longitud | Descripción |
---|---|---|---|
START | Marco Cabecera | 1 Byte | Indica el inicio de un paquete de datos, siempre 0xFF |
LEN | Longitud | 1 Byte | Longitud total del paquete de datos (en bytes), incluyendo la cabecera y el final de la trama |
ADDR | Dirección | 1 Byte | Dirección física del dispositivo |
CMD | Comando | 1 Byte | Código de comando, véase la lista de comandos para más detalles |
DATA | Dato | (LEN-6)Byte | Contenido de los datos, véase la lista de comandos para más detalles |
CHKSUM | Suma de comprobación | 1 Byte | La suma de todos los bytes desde la cabecera de la trama (inclusive) hasta los datos DATA, con el carry descartado |
END | Fin del frame | 1 Byte | Indica el final de un paquete de datos, siempre 0xED |
Modo de interacción de datos¶
El mecanismo de respuesta se adopta en el modo de puerto serie. El proceso de intercambio de datos está completamente controlado por el controlador principal y el sensor no envía datos de forma activa a este. Durante la interacción de datos, el controlador principal envía primero una trama de comando y, a continuación, el sensor devuelve una o varias tramas de respuesta para completarla.
Comando Introducción¶
Código del comando | Nombre | Descripción |
---|---|---|
0x01 | SetRegister | Establecer registro |
0x02 | GetRegister | Leer registro |
0x20 | SetParam | Establecer los parámetros del algoritmo |
0x21 | SetParamGroup | Establecer los parámetros del algoritmo por grupo |
0x22 | GetResult | Obtener resultados del algoritmo |
0x23 | GetResultGroup | Obtener resultados del algoritmo por grupo |
0x24 | SetResult | Establecer los resultados del algoritmo |
0x25 | SetResultGroup | Establecer los resultados del algoritmo por grupo |
- Grupo de parámetros: cada grupo de parámetros contiene hasta cinco valores, cuyo significado puede variar según los diferentes algoritmos.
Solo algunos algoritmos tienen funciones de configuración de parámetros y algunos también pueden configurar varios grupos de parámetros, cada uno de los cuales está marcado con un ParamID. Por ejemplo, para el algoritmo Color, si se necesitan configurar 25 regiones de reconocimiento, se deben escribir 25 grupos de parámetros.
- Valor del parámetro
Algoritmo | Valor 1 | Valor 2 | Valor 3 | Valor 4 | Valor 5 |
---|---|---|---|---|---|
Color | Coordenada x central de la región de reconocimiento | Coordenada y central de la región de reconocimiento | Anchura de la región de reconocimiento | Altura de la región de reconocimiento | Ninguno |
Blob | Ninguno | Ninguno | Anchura mínima del bloque de color | Altura mínima del bloque de color | Etiqueta de clasificación de color |
Learning | Ninguno | Ninguno | Ninguno | Ninguno | 0 = borrar los datos del objeto, 100 = aprender el objeto de destino |
Learning | Ninguno | Ninguno | Ninguno | Ninguno | 0 = borrar los datos de caras, 100 = aprender la cara destino |
- Grupo de resultados: Un grupo de datos de resultados representa un resultado, y cada grupo contiene 5 valores de retorno. El significado de estos valores de retorno puede variar según los distintos algoritmos. Algunos algoritmos pueden devolver múltiples resultados, cada uno marcado por un ResultID.
Algoritmo | Valor 1 | Valor 2 | Valor 3 | Valor 4 | Valor 5 | Observaciones |
---|---|---|---|---|---|---|
Color | Valor del canal rojo R | Valor del canal verde G | Valor del canal azul B | Ninguno | Etiqueta de clasificación de color | |
Blob | Centro coordenada X | Centro coordenada Y | Ancho | Alto | Etiqueta de clasificación de color | |
Line | Punto final coordenada X | Punto final coordenada Y | Punto inicial coordenada X | Punto inicial coordenada Y | Ángulo de inclinación | |
Apriltag | Centro coordenada X | Centro coordenada Y | Ancho | Alto | Etiqueta n de clasificación | |
Learning | Centro coordenada X (valor fijo) | Centro coordenada Y (valor fijo) | Ancho (valor fijo) | Alto (valor fijo) | Etiqueta n de clasificación | Primero hay que aprender el objeto de destino |
Card | Centro coordenada X | Centro coordenada Y | Ancho | Alto | Etiqueta n de clasificación | |
Face | Centro coordenada X | Centro coordenada Y | Ancho | Alto | Etiqueta n de clasificación | Primero hay que aprender la cara objetivo |
20Class | Centro coordenada X | Centro coordenada Y | Ancho | Alto | Etiqueta n de clasificación | |
QrCode | Centro coordenada X | Centro coordenada Y | Ancho | Alto | Número de caracteres | El siguiente grupo de resultados son datos de caracteres |
Custom | Significado personalizado | Significado personalizado | Significado personalizado | Significado personalizado | Significado personalizado | |
Motion | Centro coordenada X | Centro coordenada Y | Ancho (valor fijo) | Alto (valor fijo) | Ninguno |
- 0x01-SetRegister. Descripción: Establece el registro, sólo se puede establecer un registro (un byte) cada vez.
command frame CMD: 0x01
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
Registro de direcciones | Dato a escribir |
Respuesta desde CMD: 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
0x01 | Dato escrito |
- 0x02-GetRegister. Descripción: Leer el registro, sólo un registro (un byte) se puede leer cada vez.
command frame CMD: 0x02
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
Registro de direcciones |
Respuesta desde CMD: 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
0x01 | Dato leido |
- 0x20-SetParam. Descripción: Establece los valores de los parámetros del mismo tipo para el algoritmo especificado, y se pueden establecer varios parámetros al mismo tiempo. Por ejemplo, se pueden establecer las coordenadas x de 10 regiones de reconocimiento del algoritmo "Color" solo.
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
ID del algoritmo | Tipo de parámetro | Inicio ID1 de parámetro | Fin IDn de parámetro | Parámetro 1 | Parámetro 2 | Parámetro n |
Respuesta desde CMD: 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
0x20 | ID del algoritmo |
- 0x21-SetParamGroup. Descripción: Establece los parámetros del algoritmo especificado por grupo, cada grupo contiene 5 elementos de datos. Por ejemplo, establezca los parámetros x, y, w, h de 10 regiones de reconocimiento del algoritmo "Color" al mismo tiempo.
command frame CMD: 0x21
Byte1 | Byte2 | Byte3 | Byte4 | Bytes | Bytes | Bytes |
---|---|---|---|---|---|---|
ID del algoritmo | Inicio ID1 de parámetro | Fin IDn de parámetro | Parámetro grupo 1 | Parámetro grupo 2 | Parámetro grupo n |
Respuesta desde CMD: 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
0x21 | ID del algoritmo |
- 0x22-GetResult. Descripción: Obtener un determinado tipo de datos de resultado del algoritmo especificado. Por ejemplo, obtener únicamente la etiqueta de clasificación del algoritmo "Color".
command frame CMD: 0x22
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
ID del algoritmo | Tipo de dato | Inicio ID1 de resultado | Fin IDn de resultado |
Dado que la longitud máxima de cada trama de datos es de sólo 255 bytes, cuando la longitud supere este valor se generarán múltiples tramas de datos. Cuando el CMD es 0xEC, indica una trama intermedia, y cuando es 0xE0, indica una trama final.
Respuesta desde CMD: 0xEC o 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Bytes |
---|---|---|---|---|---|---|
0x22 | Número de cuadro de imagen | ID del algoritmo | Tipo de dato | Inicio ID1 de resultado | Fin IDn de resultado | Datos de resultados |
- 0x23-GetResultGroup. Descripción: Obtener los datos de resultado del algoritmo especificado por grupo, cada grupo contiene 5 elementos de datos. Por ejemplo, obtener los valores RGB y las etiquetas de clasificación de 5 regiones del algoritmo "Color" al mismo tiempo.
command frame CMD: 0x23
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
ID del algoritmo | Inicio ID1 de resultado | Fin IDn de resultado |
Dado que la longitud máxima de cada trama de datos es de sólo 255 bytes, cuando la longitud de los datos de la trama de resultados de detección supere este valor, se generarán múltiples tramas de datos. Cuando el CMD es 0xEC, indica una trama intermedia, y cuando es 0xE0, indica una trama final.
Respuesta desde CMD: 0xEC o 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Bytes |
---|---|---|---|---|---|---|
0x23 | Número de cuadro de imagen | ID del algoritmo | Inicio ID1 de resultado | Fin IDn de resultado | Grupo 1 de resultados | Grupo n de resultados |
- 0x24-SetResult. Descripción: Establece un determinado tipo de datos de resultado del algoritmo especificado, que se utiliza para escribir los datos de resultado del algoritmo "Custom" que se ejecuta en el chip WiFi en el registro K210 para que el controlador principal los lea.
command frame CMD: 0x24
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|
ID del algoritmo | Tipo de dato | Inicio ID1 de resultado | Fin IDn de resultado |
Respuesta desde CMD: 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Bytes |
---|---|---|---|---|---|---|
0x24 | ID del algoritmo |
- 0x25-SetResultGroup. Descripción: Establecer varios grupos de datos de resultado del algoritmo especificado, cada grupo contiene 5 elementos de datos, que se utiliza para escribir los resultados del algoritmo personalizado que se ejecuta en el chip WiFi en el registro K210 para que el controlador principal lo lea.
command frame CMD: 0x25
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Bytes |
---|---|---|---|---|---|---|
ID del algoritmo | Inicio ID1 de resultado | Fin IDn de resultado |
Respuesta desde CMD: 0xE0
Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Bytes |
---|---|---|---|---|---|---|
0x25 | ID del algoritmo |
Protocolo de comandos simples¶
Este comando no tiene especificaciones de protocolo complejas. Solo es necesario enviar un carácter y/o números a través del puerto serie para iniciar el algoritmo y obtener datos. No es necesario desarrollar una librería de controladores. Es adecuado para cualquier plataforma de control principal con función UART, pero solo para escenarios de aplicación simples.
Formato del comando¶
- Send (Enviar)
CMD | DATA | END
Símbolo | Significado | Longitud | Descripción |
---|---|---|---|
CMD | Símbolo de comando | 1 | Ver la lista de comandos para mas detalles |
DATA | Parámetro | - | Parámetro del comando |
END | La bandera del final del paquete de datos | 1 | No es necesario, también puede ser un salto de línea, un retorno de carro o un espacioen blanco |
- Return (Retorno)
DATA | END
Símbolo | Significado | Longitud | Descripción |
---|---|---|---|
DATA | Resultado de Dato | - | Resultado de Dato |
END | La bandera del final del paquete de datos | 1 | Todos terminan con un salto de línea |
Lista de comandos¶
Operación | Carácter del comando | Parámetro | Retorno | Ejemplo |
---|---|---|---|---|
Ejecuta algoritmo | O u o | ID algoritmo | 1:Éxito 0:Fallo |
O7: Ejecuta algoritmo Face |
Detén algoritmo | C o c | ID algoritmo | 1:Éxito 0:Fallo |
C7: Detén algoritmo Face |
Obtener el número de resultados de detección | N o n | ID algoritmo | Número de objetos detectados, 0 si no se detectan | N7: retorna el número de caras |
Obtener la coordenada horizontal (X) | X o x | ID resultado, se puede omitir, por defecto es 1 | Valor de la coordenada horizontal del objeto | X1: Devuelve la coordenada de la primera cara |
Obtener la coordenada vertical (Y) | Y o y | ID resultado, se puede omitir, por defecto es 1 | Valor de la coordenada vertical del objeto | Y3: Devuelve la coordenada de la tercera cara |
Obtener el ancho del objeto (W) | W o w | ID resultado, se puede omitir, por defecto es 1 | Valor del ancho del objeto | W: retorna el ancho de la primera cara |
Obtener el alto del objeto (H) | H o h | ID resultado, se puede omitir, por defecto es 1 | Valor de la altura del objeto | H: retorna la altura de la primera cara |
Obtener la etiqueta de clasificación del objeto (L) | L o l | ID resultado, se puede omitir, por defecto es 1 | Etiqueta de clasificación del objeto | L2: retorna la etiqueta de clasificación de la segunda cara |
Obtener todos los resultados | A o a | ID resultado, se puede omitir, por defecto es 1 | El comando A devuelve la descripción del resultado | A2: Devuelve todos los datos de la segunda cara |
Obtener imagen | I o i | Ninguno | Marco de datos de imagen | I: retorna una imagen |
Establecer parámetros | S o s | Parámetro ID+X parámetro+Y parámetro+W parámetro+H parámetro+L parámetro |
1:Éxito 0:Fallo |
S2+100+50+10+10+0: Establece el segundo conjunto de parámetros, x=100, y=50, w=10, h=10, l=0(asumiendo que el algoritmo Color está funcionando) |
- Comando A Descripción de los datos del resultado devuelto
El formato de los datos devueltos es: A+001+002+003+004+005
Donde 001 es la coordenada X, 002 es la coordenada Y, 003 es la anchura W, 004 es la altura H y 005 es la etiqueta L.
Para facilitar el análisis, cada resultado se compone de 3 dígitos fijos, y la parte que falta se rellena con 0.
Nota:
Para los algoritmos con resultados de retorno especiales, como Color, Línea y Código QR, el significado de los resultados de retorno se muestra en la introducción de cada algoritmo.
- Comando S de descripción del parámetro
No a todos los algoritmos se pueden establecer parámetros. El algoritmo debe iniciarse antes de establecer los parámetros. El primer parámetro que sigue al comando S es Param-ID, que es el ID del conjunto de parámetros que se va a establecer. El sensor admite hasta 25 conjuntos de parámetros, y el ID no debe superar este límite.
Al establecer los parámetros, los cinco parámetros XYWHL deben escribirse al mismo tiempo. Si los parámetros de entrada son insuficientes, se establecerán por defecto en 0.
No se puede omitir el símbolo de conexión «+» entre los números.
Protocolo de transmisión de imágenes¶
Sentry2 admite la función de transmisión de imágenes, que puede enviar imágenes al chip WiFi, al puerto UART o al puerto USB, y es compatible con los formatos RGB565, JPEG y JPEG-Base64.
Formato del comando
START | TYPE | WIDTH | HEIGHT | LEN | DATA
|Símbolo|Significado|Longitud|Descripción| |START|Cabecera del marco|1 byte|Indica el inicio de un paquete de datos, siempre 0xF0| |TYPE|Formato de imagen|1 byte|2=RGB565, 4=JPEG, 5=JPEG-Base64| |WIDTH|Ancho de la imagen|2 bytes|Ancho de la imagen| |HEIGHT|Alto de la imagen|2 bytes|Alto de la imagen| |LEN|Longitud del dato|4 bytes|Longitud de los datos de la imagen| |DATA|Datos de imagen|LEN|Datos de imagen|
RGB565¶
Los datos de muestreo originales de la imagen, que utilizan dos bytes para representar un punto de píxel, tienen un volumen relativamente grande: una imagen de 320 x 240 píxeles equivale a 153 600 bytes.
El RGB565 es un RGB de 16 bits (2 bytes). Podemos encontrar mas detalles en esta entrada de la Wikipedia
JPEG¶
Un formato de compresión de imágenes común, que puede comprimir una imagen RGB565 a un tamaño de entre 10 y 30 KB. El tamaño de la relación de compresión depende de la riqueza cromática de la imagen. Cuanto menos color, mayor será la relación de compresión.
Se trata del formato de archivo estándar para las imágenes digitales. Las imágenes JPG pueden tener tambien la extensión JPEG.
En la entrada Joint Photographic Experts Group de la Wikipedia se encuentran todos los detalles.
JPEG-Base64¶
Se trata de codificar la imagen JPEG según las reglas Base64, convertir los datos hexadecimales en caracteres de texto, lo que resulta conveniente para la transmisión y el análisis en red, y se utiliza normalmente para el reconocimiento de imágenes en la nube.
Base64 es un grupo de esquemas de codificación similares para convertir datos binarios en un formato de texto ASCII. Base64 se usa generalmente para transferir datos a través de Internet. El resultado de convertir una imagen a Base64 es solo un conjunto de letras latinas, números y dos caracteres: “+” y “/”.
En la Wikipedia podemos encontrar la entrada Base64 donde están todos los detalles.
Hay numerosos sitios web que ofrecen convertidores de JPG a Base64. Algunos ejemplos son Base64 Image Encoder, Browserling, y Online JPG Tools. Simplemente sube tu archivo JPG y obtendrás la cadena Base64 correspondiente.
Para convertir una imagen JPG a Base64, también puedes escribir código en lenguajes como JavaScript o Python.
- Ejemplo en JavaScript
function toBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = (error) => reject(error);
});
}
async function convertImageToBase64(file) {
const base64String = await toBase64(file);
return base64String;
}
// Ejemplo de uso:
const fileInput = document.getElementById('imageInput'); // Asume un input de tipo file
fileInput.addEventListener('change', async (event) => {
const file = event.target.files[0];
if (file) {
try {
const base64 = await convertImageToBase64(file);
console.log(base64); // Imprime la cadena Base64
// Aquí puedes usar la cadena Base64 como necesites
} catch (error) {
console.error("Error al convertir la imagen:", error);
}
}
});
- Ejemplo en Python
import base64
def image_to_base64(image_path):
with open(image_path, "rb") as img_file:
encoded_string = base64.b64encode(img_file.read()).decode('utf-8')
return encoded_string
# Ejemplo de uso:
image_path = 'ruta/a/tu/imagen.jpg'
base64_string = image_to_base64(image_path)
print(base64_string)
# Agregar el prefijo (opcional)
prefixed_string = "data:image/jpeg;base64," + base64_string
print(prefixed_string)