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