Hoje recebi um LIDAR neato xv11 que comprei no ebay em segunda mão.

Desejoso de experimentar se funcionava e como não tinha os conectores apropriados para efectuar as ligações, antes de cortar os fios e colocar outros conectores, encaixei uns fios fininhos e testei.

O ambiente de teste do LIDAR neato xv11 consistiu num Banana Pi M1 com o Armbian Xenial, com o ROS kinetic (v 1.12.14).
uname -a Linux m6 4.19.38-sunxi #5.85 SMP Wed May 8 14:20:48 CEST 2019 armv7l armv7l armv7l GNU/Linux lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.6 LTS Release: 16.04 Codename: xenial
Nos primeiros testes de ligação usei o terminal kermit
sudo apt install ckermit
Com o seguinte ficheiro de lançamento: terminal.kermit
#!/usr/bin/kermit # Custom C-Kermit settings set line /dev/ttyS1 set speed 115200 set serial 8n1 # General C-Kermit settings. These probably don't need to change. set flow-control none set file type bin set carrier-watch off set prefixing all set modem none echo "Prepared to connect." connect
Ligações do LIDAR neato xv11
As primeiras experiências foram efectuadas com base no descrito no link 1 indicado nas referencias.

O neato xv11 tem os seguintes conectores:
- Conector de 2 fios (motor):
- red: 3V;
- black: GND;
- Conector de 4 fios (electrónica):
- red: 3V a 3.3V;
- yellow: TX (ligar ao rx);
- brown: RX (não usado):
- Black: GND;
A minha primeira experiência consistiu efectuar as ligações conforme indicado acima e verificar o sinal no fio amarelo (yellow) com um osciloscópio (DSO138). Confirmada a existência de sinal, a segunda experiência foi ligar o TX do xv11 ao RX do Banana Pi (ttyS1, uart4 rxd na imagem abaixo) e partilhar a terra (GND).

Executei o kermit com o ficheiro indicado acima e recebi a seguinte resposta sucessivamente:
./terminal.kermit neato xv11 lidar Piccolo Laser Distance Scanner Copyright (c) 2009-2011 Neato Robotics, Inc. All Rights Reserved Loader V2.5.15295 CPU F2802x/c001 Serial WTD09113AA-0237246 LastCal [5371726C] Runtime V2.6.15295 #Spin...3 ESCs or BREAK to abort.�:)
Duas ou 3 tentativas em que desliguei e liguei o lidar, e o resultado foi o mesmo.
Resolvi aumentar ligeiramente a tensão (que era inferior aos 3V) e após um ligeiro aumento da dpp a mensagem desapareceu e passou a aparecer uns caracteres esquisitos, conforme a imagem abaixo:

Pareceu-me que os caracteres esquisitos seriam os dados numéricos e portanto os resultados das leituras.
LIDAR neato xv11 no ROS
O passo seguinte foi experimentar LIDAR xv11 com o ROS. Para o efeito segui o descrito no link 2 indicado nas referencias.
Instalei o software com o seguinte comando (adequado a minha versão do ROS):
sudo apt-get install ros-kinetic-xv-11-laser-driver
Seguidamente executei os seguintes comandos:
roscore & #optional rosrun xv_11_laser_driver neato_laser_publisher _port:=/dev/tty1 &
O resultado das leituras pode ser observado com o seguinte comando:
rostopic echo scan

rostopic hz scan subscribed to [/scan] average rate: 4.020 min: 0.178s max: 0.331s std dev: 0.06276s window: 4 average rate: 3.970 min: 0.178s max: 0.331s std dev: 0.05667s window: 8 average rate: 3.828 min: 0.178s max: 0.340s std dev: 0.06054s window: 11 average rate: 3.812 min: 0.178s max: 0.340s std dev: 0.05890s window: 15 average rate: 3.833 min: 0.178s max: 0.340s std dev: 0.05679s window: 19 average rate: 3.769 min: 0.130s max: 0.386s std dev: 0.06629s window: 23 average rate: 3.740 min: 0.130s max: 0.386s std dev: 0.06617s window: 26 average rate: 3.684 min: 0.130s max: 0.386s std dev: 0.06343s window: 30 average rate: 3.671 min: 0.130s max: 0.386s std dev: 0.06350s window: 33 average rate: 3.698 min: 0.130s max: 0.386s std dev: 0.06370s window: 37 average rate: 3.627 min: 0.130s max: 0.386s std dev: 0.06393s window: 40
O node neato_laser_publisher também publica as rpms do motor do lidar, no topico rpms.
Pelas minha experiência o LIDAR funciona bem com cerca de 300 RPM.
Launch code para o node neato_laser_publisher:
<node pkg="xv_11_laser_driver" type="neato_laser_publisher" name="neato_laser_publisher" respawn="true" output="screen"> <param name="port" value="/dev/ttyUSB0"/> <!--<param name="firmware_version" value="2"/>--> /> </node>
Neato xv11 rviz
O node descrito acima publica uma mensagem do tipo: sensor_msgs/LaserScan, que está contemplada no rviz e permite a exibição das leituras como pontos.

Para visualizar os resultados do neato xv11 no temos que configurar o rviz da seguinte forma (ver tb: imagem acima):
Fixed frame: /neato_laser (tem de se inserir a mão, e só é obrigatório se não existir um transform)
Clicar em Add, selecionar LaserScan da lista e clicar em Add.
Desenrolar o LaserScan na área á esquerda (Displays) e seleccionar:
Topic: scan
O resultado foram pontos difusos, conforme o video abaixo.
Não consigo avaliar a correcção das leituras. Espero que estejam bem.
Terei que repetir a experiência num ambiente cujo o varrimento seja mais perceptível de visualizar.
Avaliação das leituras do lidar Neato xv11
Coloquei o Lidar no chão com o banana pi por perto de modo a ter superfícies rectas grandes. O ambiente de teste ficou como na fotografia abaixo.

Depois de alguns problemas em colocar o lidar a funcionar, outra vez, com o ROS (ver mais abaixo), obtive as seguintes leituras no rviz:

As leituras que o xv11 fez parecem estar correctas. Pelo menos quando exibidas no rviz reproduzem o ambiente de forma correcta.
Esta experiência acabou quando o rviz deixou de receber mensagens no tópico. Por alguma razão que não percebi o node deixou de publicar as mensagens, provavelmente porque deixou de receber leituras do lidar.
Colocar o node do ROS para o xv11 voltou a ser complicado. Ao fim de umas tentativas voltou a funcionar.
Por enquanto o que observei e está sujeito a validação foi o seguinte:
Parece que o xv11 tem de ser ligado com o node já a funcionar (para detectar alguma mensagem inicial?).
Parece que a correcção das leituras está ligada a dpp aplicada ao motor e à electrónica (nestas experiências estou a alimentar ambos com a mesma dpp)
Os vídeos abaixo ilustram a influencia do tensão na alimentação que descrevo acima.
No video acima as leituras estão correctas, no video abaixo a visualização está instável.
O seguinte video ilustra leituras completamente erradas.
O factor que diferencia os diversos exemplos expostos acima é a tensão (comum) aplicada ao motor e à electrónica.
Numa próxima experiência, onde vou estudar um circuito de alimentação, terei que separar a alimentação do motor da electrónica.
Placa de alimentação para o neato xv11
Fotografia da placa de alimentação que montei para o xv11 com base em dois reguladores de tensão LM317


O circuito que usei para os LM317 foi baseado na aplicação descrita no datasheet da ST.
Condensadores e diodos
- C1 – 0.1 µF (cerâmico)
- C2 – 10 µF (electrolítico), não usei
- C3 – 1 µF tantalo (or 25 µF alumínio electrolítico), usei 33µF
- D1 – Protecção de curto de entrada
- D2 – Protecção de curto de saída (descarga dos condensadores)
Como a alimentação do motor e electrónica é independente, o circuito é composto por duas versões simplificadas do circuito acima.
Um para a electrónica sem o C2 e D2, e o R2 como resistência fixa, e outro para o motor sem o C2.
Estou a pensar alterar o circuito e fazer um interruptor para o motor do lidar com um transistor ou mosfet.
Dimensões do neato xv11
Abaixo seguem os desenhos com as dimensões do lidar neato xv11, com vista de lado e por cima.


Mensagens do neato xv11
Uma mensagem completa consiste em 1446 bytes com o seguinte formato:
- header: 4 bytes
- speed: 2 bytes
- points: 1440 (4 bytes x 360 pontos)
Header
Os seguintes 4 bytes pela respectiva ordem, marcam o inicio de um varrimento:
0x5A 0xA5 0x00 0xC0
Speed
Depois do header são os 2 bytes relativos a velocidade de rotação, por exemplo:
0xAA 0xD1
Aparenta ser o tempo aproximado entre cada ping a multiplicar por um factor (1e8), e forma um inteiro de 16 bits. O valor ideal será na calculado pela seguinte formula:
1 seg / (360 * 5) * 10^8
Este valor deve ser usado para controlar a velocidade do motor. Segundo a fonte (ref:1) a aplicação do controlo PID para o valor de 5 rotações por segundo não trouxe vantagens e portanto consideram que basta uma fonte estável de tensão, na ordem dos 3V.
Points
As leituras são 1440 bytes que correspondem a um conjunto bytes com inicio
Referências
- http://library.isr.ist.utl.pt/docs/roswiki/xv_11_laser_driver(2f)Tutorials(2f)Connecting(20)the(20)XV(2d)11(20)Laser(20)to(20)USB.html
- http://wiki.ros.org/xv_11_laser_driver/Tutorials/Running%20the%20XV-11%20Node
- http://xv11hacking.rohbotics.com/
- https://bitbangingbytes.com/wiki_cats/robotics/