Protocolo » Histórico » Versão 5
Joao Manuel Leite da Silva, 19/02/2013 12:21
1 | 3 | Joao Manuel Leite da Silva | h1. Protocolo de comunicação (AINDA EM CONSTRUÇÃO) |
---|---|---|---|
2 | 1 | Joao Manuel Leite da Silva | |
3 | 5 | Joao Manuel Leite da Silva | h2. Definição geral do protocolo |
4 | 5 | Joao Manuel Leite da Silva | |
5 | 1 | Joao Manuel Leite da Silva | O protocolo de comunicação definido para a comunicação entre robô e uma qualquer aplicação de controlo é baseado em dois tipos de mensagem: uma transmitida pelo robô para o controlador, outra transmitida pelo controlador para o robô. |
6 | 1 | Joao Manuel Leite da Silva | |
7 | 2 | Joao Manuel Leite da Silva | Estas mensagens são na sua essência um fluxo de bytes, que têm que ser escritos de um lado e interpretados do outro em concordância. Foram definidos 3 bytes especias para que seja possível sincronizar os pacotes de dados: |
8 | 1 | Joao Manuel Leite da Silva | |
9 | 1 | Joao Manuel Leite da Silva | * *0x25* - Início de trama: o primeiro byte em qualquer mensagem, sinalizando o início de uma trama. É usado o valor *0x25* (carácter '%' na tabela ASCII) |
10 | 1 | Joao Manuel Leite da Silva | * *0x03* - Fim de trama: o último byte em qualquer mensagem, sinalizando o final de uma trama. É usado o valor *0x03* (carácter ETX na tabela ASCII) |
11 | 2 | Joao Manuel Leite da Silva | * *0x5C* - Byte de escape: byte para retirar o significado especial ao seguinte, de forma a que o byte seguinte seja interpretado como dados. É usado o valor *0x5C* (carácter '\' na tabela ASCII) |
12 | 1 | Joao Manuel Leite da Silva | |
13 | 1 | Joao Manuel Leite da Silva | Assim, qualquer mensagem tem o formato: |
14 | 1 | Joao Manuel Leite da Silva | | 0x25 | ...(data bytes) | Checksum | 0x03 | |
15 | 1 | Joao Manuel Leite da Silva | |
16 | 1 | Joao Manuel Leite da Silva | No entanto, qualquer valor do bloco de dados da mensagem pode ser igual a um dos bytes especiais. Nesse caso é necessário fazer o escape desse valor para que seja interpretado como dados. Nesse caso, é necessário adicionar o byte de escape antes do byte de dados. É necessário fazer o excape a qualquer byte de dados que tenha o mesmo valor que um especial, incluindo ao próprio byte de escape. |
17 | 1 | Joao Manuel Leite da Silva | |
18 | 1 | Joao Manuel Leite da Silva | No cálculo do Checksum *NÃO* se incluem os valores dos bytes de escape. |
19 | 5 | Joao Manuel Leite da Silva | O checksum é calculado pela soma de todos os bytes *úteis* a enviar, truncada a 1 byte e transformada em complemento para dois. |
20 | 1 | Joao Manuel Leite da Silva | |
21 | 5 | Joao Manuel Leite da Silva | h2. Mensages controlador -> robô |
22 | 5 | Joao Manuel Leite da Silva | |
23 | 1 | Joao Manuel Leite da Silva | A definição base da mensagem do controlador para o robô é a seguinte: |
24 | 1 | Joao Manuel Leite da Silva | | 0x25 | Lmotor | Rmotor | beaconMotor | Checksum | 0x03 | |
25 | 1 | Joao Manuel Leite da Silva | |
26 | 1 | Joao Manuel Leite da Silva | Assim, o tamanho padrão desta mensagem é 6 bytes. No pior caso, se todos os bytes de dados tiverem o valor de um byte especial, ficará com 10 bytes. |
27 | 4 | Joao Manuel Leite da Silva | Quanto aos dados, seus domínos e significados: |
28 | 3 | Joao Manuel Leite da Silva | |
29 | 4 | Joao Manuel Leite da Silva | * *Lmotor*, *Rmotor*: valores no intervalo [-100, 100], indicando a percentagem de velocidade a aplicar à roda correspondente. O sinal define o sentido de rotação (para a frente ou para trás). |
30 | 3 | Joao Manuel Leite da Silva | * *beaconMotor*: comando para a posição do receptor do farol. O valor está no intervalo [-15, 15], onde -15 é aproximadamente 180º para a esquerda e 15 é aproximadamente 180º para a direita. Este valor terá que sofrer um shift à esquerda de uma posição, para que o bit menos significativo seja usado como flag de controlo: |
31 | 3 | Joao Manuel Leite da Silva | ** 0 significa que não há envio de posição, o receptor fará automaticamente 1 varrimento a cada 4 segundos. |
32 | 1 | Joao Manuel Leite da Silva | ** 1 significa que o robô deverá colocar o receptor no valor que está a ser enviado neste byte. |
33 | 3 | Joao Manuel Leite da Silva | |
34 | 5 | Joao Manuel Leite da Silva | h3. Exemplos |
35 | 1 | Joao Manuel Leite da Silva | |
36 | 5 | Joao Manuel Leite da Silva | Consideremos o envio de uma ordem com valores para os motores de 50 e 80 e a posição 10 para o receptor do farol: |
37 | 5 | Joao Manuel Leite da Silva | * Neste caso, os valores do bytes para os motores serão 0x32 e 0x50 respectivamente. |
38 | 5 | Joao Manuel Leite da Silva | * Para o byte do receptor do farol, temos o valor 0x0A, que terá que sofrer um shift à esquerda para que o bit menos significativo seja colocado a 1, obtendo assim o byte final de 0x15. |
39 | 5 | Joao Manuel Leite da Silva | * O checksum terá um resultado de ~(0x32+0x50+0x15)+1 = 0x69. |
40 | 5 | Joao Manuel Leite da Silva | O pacote final terá a sequência de bytes: *| 0x25 | 0x32 | 0x50 | 0x15 | 0x69 | 0x03 |* |
41 | 1 | Joao Manuel Leite da Silva | |
42 | 5 | Joao Manuel Leite da Silva | Consideremos um segundo exemplo, com valores para os motores de 37 e 92 e sem uma ordem explícita para a posição do receptor do farol: |
43 | 5 | Joao Manuel Leite da Silva | * Os valores para os motores serão 0x25 e 0x5C respectivamente. |
44 | 5 | Joao Manuel Leite da Silva | * O byte do receptor do farol, como não queresmo controlá-lo, será 0x00; |
45 | 5 | Joao Manuel Leite da Silva | * O checksum terá o resultado de ~(0x25+0x5C+0x00)+1 = 0x7F. |
46 | 5 | Joao Manuel Leite da Silva | * Neste exemplo temos dois valores que são caracteres especiais e portanto, na construção do pacote, é necessário colocar caracteres de escape antes desses valores |
47 | 5 | Joao Manuel Leite da Silva | O pacote final terá a sequência de bytes: *| 0x25 | 0x5C | 0x25 | 0x5C | 0x5C | 0x00 | 0x7F | 0x03 |* |
48 | 5 | Joao Manuel Leite da Silva | |
49 | 5 | Joao Manuel Leite da Silva | h2. Mensagens robô -> controlador |
50 | 5 | Joao Manuel Leite da Silva | |
51 | 1 | Joao Manuel Leite da Silva | A definição base da mensagem do robô para o controlador é a seguinte: |
52 | 1 | Joao Manuel Leite da Silva | | 0x25 | Lsensor | Csensor | Rsensor | Ground | Beacon | Bat | xOdoHigh | xOdoLow | yOdoHigh | yOdoLow | thetaOdoHigh | thetaOdoLow | Checksum | 0x03 | |
53 | 4 | Joao Manuel Leite da Silva | |
54 | 4 | Joao Manuel Leite da Silva | O tamanho padrão desta mensagem é 15 bytes. No pior caso, terá 28 bytes. |
55 | 4 | Joao Manuel Leite da Silva | Os dados, seus domínios e interpretação: |
56 | 4 | Joao Manuel Leite da Silva | |
57 | 4 | Joao Manuel Leite da Silva | * *Lsensor*, *Csensor*, *Rsensor*: valores sem sinal em toda a gama do byte [0; 255] que representam aproximadamente a tensão lida pelos sensores de distância frontais esquerdo, central e direito respectivamente. O valor de tensão é multiplicado por 100. Os valores enviados pelo robô são na verdade apenas os 8 bits mais significativos, dos 10 que os sensores utilizam. A aproximação da distância é feita de acordo com as características apresentadas no datasheet dos sensores (*nome do modelo*) |
58 | 1 | Joao Manuel Leite da Silva | * *Ground*: valores dos sensores de "detecção de chão"- Estes são, na plataforma actual, 5 sensores de reflexão, que têm o valor 0 quando estão sobre uma superfície reflectora (branco) e 1 quando estão sobre uma superfície não reflectora (preto). Os valores dos 5 sensores são os bits menos significativos deste byte, sendo o menos significativo o sensor da direita. |
59 | 1 | Joao Manuel Leite da Silva | * *Beacon*: De forma semelhante ao comando do receptor do farol, este valor está no mesmo intervalo de [-15; 15]. Como no comando, este valor sofreu um shift à esquerda e o bit menos significativo serve para sinalizar se o farol foi detectado nesta posição (1) ou não (0). |
60 | 1 | Joao Manuel Leite da Silva | * *Bat*: Este byte é um valor sem sinal que indica a tensão da bateria, uma vez mais multiplicado por 100. |
61 | 1 | Joao Manuel Leite da Silva | |
62 | 5 | Joao Manuel Leite da Silva | Os 6 bytes seguintes indicam a posição do robô dada pela odometria. O sistema de coordenadas é centrado na posição inicial do robô, sendo o sentido positivo de XX a frente do robô e YY a esquerda do robô. Os valores de posição em XX e YY são valores inteiros (short) expressos em milimetros e portanto na gama [-32768; 32767]. A orientação é também um valor inteiro (short) na gama [-180; 180]. |
63 | 5 | Joao Manuel Leite da Silva | * *xOdoHigh*, *xOdoLow*: os bytes mais e menos significativos, respectivamente, da posição do robô ao longo do eixo XX. |
64 | 5 | Joao Manuel Leite da Silva | * *yOdoHigh*, *yOdoLow*: os bytes mais e menos significativos, respectivamente, da posição do robô ao longo do eixo YY. |
65 | 5 | Joao Manuel Leite da Silva | * *thetaOdoHigh*, *thetaOdoLow*: os bytes mais e menos significativos, respectivamente, da orientação do robô. |
66 | 5 | Joao Manuel Leite da Silva | |
67 | 5 | Joao Manuel Leite da Silva | h3. Exemplos (brevemente) |