Neato xv11

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

Lidar Neato xv11

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.

Ligações neato lidar xv11 (laranja TX)

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.

Ambiente físico de teste do LIDAR xv11

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).

Banana Pi M1 pinout (uart4 rxd)

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:

xv11 visualização das comunicações serie em ascii

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
Neato xv11 ROS topic message

 

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.

Configuração do rviz para o Neato xv11

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.

Ambiente de teste de leituras do lidar xv11

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

Leituras do lidar xv11 (a caixa ao centro, os meus pés a direita)

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

Alimentação e ligações do xv11
Visão de conjunto

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.

Neato XV11 vista superior

 

Neato XV11 vista lateral

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

  1. 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
  2. http://wiki.ros.org/xv_11_laser_driver/Tutorials/Running%20the%20XV-11%20Node
  3. http://xv11hacking.rohbotics.com/
  4. https://bitbangingbytes.com/wiki_cats/robotics/