4. Conexão às redes subjacentes
4.2 Rede WiF
O modelo de rede Wifi adotado para a configuração dos robôs é o modelo de estrutura, ou ad- hoc. Ou seja, os robôs possuem endereço de IP fixo que devem ser conhecidos pelo controlador para que uma conexão seja estabelecida.
Todo robô possui um servidor no port de número 2000 esperando por conexões TCP/IP. Quando uma conexão é solicitada pelo controlador ao robô, um novo endpoint é criado, em um outro port, e as requisições do controlador solicitante passam a ser atendidas neste novo endpoint. Ao mesmo tempo, o robô continua a esperar por outros pedidos de conexão no port 2000.
Em resumo, o controlador deve conhecer o ESSID da rede na qual o robô está associado e o endereço IP atribuído ao robô em questão.
Dados para a Rede WiFi IP: 192.168.1.1 Netmask: 255.255.255.0 Port: 2000 Channel: 1 ESSID: ROBODECK Mode: ad-hoc 4.3 Rede Bluetooth
Ao ser iniciado, o robô registra um serviço no dispositivo Bluetooth chamado RoboDeck usando o identificador de classe classId = 0x3000 e o identificador de perfil profileId = 0x3000. O canal utilizado é o primeiro canal disponível encontrado no protocolo RFCOMM.
Assim, para conectar-se ao robô utilzando Bluetooth, o controlador deverá descobrir o canal do robô ao qual deseja conectar-se perguntando aos servidores SDP por serviços chamados RoboDeck que sejam da classe 0x3000.
Caso mais de um robô seja encontrado, o controlador deverá conectar-se a cada um dos robôs e enviar o comando ConfigGetIdentity. Este comando retornará o identificador e o nome do robô,
71 permitindo ao controlador descobrir o robô ao qual deseja conectar-se.
Dados para a Rede Bluetooth ServiceName: RoboDeck ClassId: 0x3000
ProfileId: 0x3000 Protocol: RFCOMM
ANEXO A – Aplicativos Robóticos
A.1 CameraApp
Este aplicativo robótico lê as imagens geradas por uma webcam conectada ao hardware do Módulo de Alta Performance (MAP) e as transmite ao controlador por um canal Wifi. A seguir são descritos os comandos e respostas implementados por este aplicativo.
A.1.1 CameraError
Resposta enviada ao controlador indicando erros ocorridos no aplicativo.
Rsp: 0x84 0x04 0x00 message
Onde:
message: descrição do erro ocorrido. String terminada em nulo.
A.1.2 CameraStart
Inicia a captura continua das imagens da câmera. Quando este comando é recebido, o aplicativo inicia um servidor de imagens que passa a ouvir em um canal Wifi. Em seguida, a resposta é enviada ao controlador passando o número do port no qual o servidor está esperando por conexões.
O aplicativo espera por uma conexão do controlador durante 4 segundos. Caso nenhuma conexão seja estabelecida, o servidor é baixado e uma mensagem de erro é enviada. Após a primeira conexão ser estabelecida outras conexões são rejeitadas, ou seja, o servidor de imagens é exclusivo do controlador que o solicitou.
72 As imagens são enviadas sequencialmente e ininterruptamente até que o comando CameraStop seja recebido pelo aplicativo. Cada imagem é serializada seguindo o formato descrito na tabela Sending a seguir.
Cmd: 0x04 0x04 0x01
Rsp: 0x84 0x04 0x01 port
Sending: width height size format data
Onde:
port: número do port no qual o servidor espera por conexões. Inteiro não sinalizado (2 bytes). width: largura da imagem, em pixels. Inteiro não sinalizado (2 bytes).
height: altura da imagem, em pixels. Inteiro não sinalizado (2 bytes).
size: número de bytes dos dados da imagem. Inteiro não sinalizado (2 bytes).
format: 4 bytes em ASCII indicando o formato da imagem. Segue o padrão da biblioteca Video 4 Linux (V4L). Ex: ’JPEG’, ’RGB3’, etc.
data: dados da imagem seguindo o formato especificado em format.
A.1.3 CameraStop
Interrompe a captura e o envio de imagens ao controlador. A resposta relativa a este comando é sempre enviada, independentemente do processo de captura e envio de imagens não estar sendo executado quando do recebimento deste comando.
Cmd: 0x04 0x04 0x02
Rsp: 0x84 0x04 0x02
A.1.4 CameraTakePhoto
Captura uma única imagem da câmera e a envia ao controlador. Este comando inicia um canal Wifi e espera por uma conexão do controlador por até 4 segundos. Depois de estabelecida a conexão, a imagem é enviada e o canal é fechado logo em seguida. A imagem é serializada seguindo o formato descrito na tabela Sending a seguir.
73
Cmd: 0x04 0x04 0x03
Rsp: 0x84 0x04 0x03 port-H port-L
Sending: width-H weidth-L height-H height-L rgb
Onde:
port: número do port no qual o servidor espera por conexões. Inteiro não sinalizado (2 bytes). width: largura da imagem, empixels. Inteiro não sinalizado (2 bytes).
height: altura da imagem, em pixels. Inteiro não sinalizado (2 bytes).
rgb: valores dos pixels da imagem. Cada pixel é representado pela trinca [R, G, B], indicando os valores das cores vermelho verde e azul, respectivamente. Cada uma das três cores é um inteiro não sinalizado de 1 byte. Os valores dos pixels são serializados seguindo o padrão raster, ou seja, a imagem é enviada em linhas, serializadas da esquerda para a direita, onde as linhas superiores da imagem são enviados primeiro.
A.2 RtspServerApp
Este aplicativo robótico lê as imagens geradas por uma webcam conectada ao hardware do Módulo de Alta Performance (MAP) e inicia um servidor RTSP capaz de servir um stream de vídeo no formato MPEG4 com o vídeo captado. A seguir são descritos os comandos e respostas implementados por este aplicativo.
A.2.1 RtspServerError
Resposta enviada ao controlador indicando erros ocorridos no aplicativo.
Rsp: 0x84 0x06 0x00 message
Onde:
message: descrição do erro corrido. String termina da em nulo.
A.2.2 RtspServerStart
74 RTSP que passa a servir o stream do vídeo captado pela câmera, recebendo requisições em um port TCP.
Em seguida, a resposta é enviada ao controlador passando a URL na qual o servidor está esperando por requisições.
Cmd: 0x04 0x06 0x01
Rsp: 0x84 0x06 0x01 url
Onde:
url: URL do servidor RTSP esperando por conexões. String termina da em nulo.
A.2.3 RtspServerStop
Finaliza o servidor de streams RTSP.
Cmd: 0x04 0x06 0x02
75 PARTE III – RoboDeck SDK
A terceira parte do documento traz informações referentes à elaboração do RoboDeck SDK, uma biblioteca de classes em C++ a ser empregada como interface entre uma aplicação para o robô e o robô propriamente dito. Está organizado nas seguintes seções:
1. Requisitos para Elaboração do RoboDeck SDK. Levanta as necessidades e os itens que o SDK