ros VL53L0X

O sensor de distância laser VL53L0X é baseado na medição do tempo de  viagem da luz.  Com um alcance máximo de 2 metros e 1 mm de resolução, este sensor faz parte de uma família desenvolvida pela ST, cuja diferença fundamental entre eles é a distância máxima. O VL53L1X tem um máximo de4 metros.

Tem vários modos de funcionamento, e permite a configuração do tempo de resposta em função da maior ou menor precisão das leituras.

A comunicação com o sensor de distância VL53L0X é efectuada através de i2c como slave no endereço 29. É possível usar mais que um sensor no mesmo bus i2c recorrendo a um sinal extra (xshut) e a uma configuração inicial que processa a atribuição de novos endereços.

O VL53L0X pode ser acedido directamente pelo raspberry pi, ou banana pi, assim como através de um micro controlador (arduino, esp, stm32, etc).

VL53L0X no STM32F

Biblioteca para o VL53L0X da pololu funciona com:

  • stm32_core_arduino(ST);
  • stm32_arduino (roger) depois de aplicar alterações à biblioteca;

O problema na compilação da biblioteca era reportado com o erro (entre outros):

error: call of overloaded 'write(long unsigned int)' is ambiguous

Alterações à biblioteca VL53L0X da pololu, para compilar com o stm32_arduino. Substituir :

void VL53L0X::writeReg32Bit(uint8_t reg, uint32_t value)
{
Wire.beginTransmission(address);
Wire.write(reg);
Wire.write((value >> 24) & 0xFF); // value highest byte
Wire.write((value >> 16) & 0xFF);
Wire.write((value >> 8) & 0xFF);
Wire.write(value & 0xFF); // value lowest byte
last_status = Wire.endTransmission();
}

Com:

void VL53L0X::writeReg32Bit(uint8_t reg, uint32_t value)
{
Wire.beginTransmission(address);
Wire.write(reg);
Wire.write((byte)((value >> 24) & 0xFF)); // value highest byte
Wire.write((byte)((value >> 16) & 0xFF));
Wire.write((byte)((value >> 8) & 0xFF));
Wire.write( (byte)(value & 0xFF)); // value lowest byte
last_status = Wire.endTransmission();
}

Nodes ROS VL53L0X disponíveis

Uma pesquisa na net por ros VL53L0X deu-me a conhecer três pacotes disponíveis para este sensor de distância.

ROS VL53L0X ranged finder

https://github.com/AlysonQ/ranged_finder

Este pacote vem mencionado no ROS wiki e está disponível no endereço acima. Apesar de não se destinar ao raspberry pi 3, parece que funciona.

O pacote ranged_finder vem com 3 possibilidades diferentes de exploração do sensor que correspondem ao número de sensores usados. Nesta avaliação apenas testei um sensor.

Pela minha experiência o pacote tal como está não compila no ROS. A compilação aborta devido a não encontrar o ficheiro .h relativo ao tipo de mensagem definida pelo utilizador.

Para corrigir o problema é necessário acrescentar a linha:

add_dependence(src, pkgdep)

Após o problema ser corrigido a compilação termina com uns avisos mas o node executa e a informação na consola exibe a distância correcta.

rosrun ranged_finder measure1sensor_node

[ INFO] [1564448706.697902598]: Sensor One distance = 112

[ INFO] [1564448706.739033404]: Sensor One distance = 179

[ INFO] [1564448706.780623530]: Sensor One distance = 8191

[ INFO] [1564448706.821920324]: Sensor One distance = 8191

No entanto as mensagens publicadas no respectivo tópico tópico não apresentam a distância lida pelo sensor.

rostopic echo ranged_finder_data

Left: 0
Middle: 0
Right: 0
---
Left: 0
Middle: 0
Right: 0
---
Left: 0
Middle: 0
Right: 0
---

 

ROS VL53L0X ROS-node-to-use-VL53L0X

https://github.com/morikentiger/ROS-node-to-use-VL53L0X

Não consegui por a funcionar.

 

ROS VL53L0X BBB_ROS_robot

https://github.com/chengtaow/BBB_ROS_robot

Pela minha experiência o pacote tal como está não compila no ROS pela mesma razão que o pacote ranged finder também falhava. A compilação aborta devido a não encontrar o ficheiro .h relativo ao tipo de mensagem definida pelo utilizador. A solução para o problema é igual.

Após o problema ser corrigido a compilação termina com sucesso, e quando executado o node a informação na consola exibe a distância correcta.

rosrun laser laser_vl53l0x

[ INFO] [1564448881.054095370]: Status: Range Valid, Distance 111
[ INFO] [1564448881.097228977]: Status: Range Valid, Distance 113
[ INFO] [1564448881.134194702]: Status: Range Valid, Distance 139
[ INFO] [1564448881.176078420]: Status: Signal Fail, Distance 8191
[ INFO] [1564448881.214187837]: Status: Signal Fail, Distance 8191
[ INFO] [1564448881.254157347]: Status: Signal Fail, Distance 8191

O tópico também exibe a distância certa.

rostopic echo /l_data

dist: 387
status: "Range Valid"
---
dist: 400
status: "Range Valid"
---
dist: 8191
status: "Signal Fail"
---
dist: 8191
status: "Signal Fail"

 

Outros exemplos para o VL53L0X no raspberry pi

https://github.com/johnbryanmoore/VL53L0X_rasp_python

https://github.com/Play-Zone/GY-VL53L0X

 

Fonte da solução  para o problema da compilação

https://answers.ros.org/question/306884/custom-message-fails-to-build-no-such-file-or-directory/

 

Fonte para a formação da mensagem laserScan

https://forum.arduino.cc/index.php?topic=571051.0

 

https://forum.arduino.cc/index.php?topic=571051.0

https://sites.google.com/site/excibot/in-the-news/usevl53l0xtime-of-flightsensorinrosonbeagleboneblack

https://github.com/johnbryanmoore/VL53L0X_rasp_python/issues/8

time sources
https://www.raspberrypi.org/forums/viewtopic.php?t=171563

 

STM32 Arduino_Core VL53L0X library

https://www.arduinolibraries.info/libraries/stm32duino-vl53-l0-x