Skip to content

Instantly share code, notes, and snippets.

@Andrew-rw
Created December 26, 2019 14:25
Show Gist options
  • Save Andrew-rw/2cb50e967c49289b822dc50a59e22b40 to your computer and use it in GitHub Desktop.
Save Andrew-rw/2cb50e967c49289b822dc50a59e22b40 to your computer and use it in GitHub Desktop.
VL53L0X Arduino ROS node
#include <ros.h>
#include <ros/time.h>
#include <sensor_msgs/Range.h>
#include "Adafruit_VL53L0X.h"
ros::NodeHandle nh;
sensor_msgs::Range range_msg;
ros::Publisher pub_range( "range_data", &range_msg);
Adafruit_VL53L0X sensor = Adafruit_VL53L0X();
VL53L0X_RangingMeasurementData_t measure;
unsigned long range_timer;
void setup() {
nh.initNode();
nh.getHardware()->setBaud(57600);
nh.advertise(pub_range);
// wait controller to be connected
while (!nh.connected()){
nh.spinOnce();
}
// if initialization failed - write message and freeze
if (!sensor.begin()) {
nh.logwarn("Failed to setup VL53L0X sensor");
while(1);
}
nh.loginfo("VL53L0X API serial node started");
// fill static range message fields
range_msg.radiation_type = sensor_msgs::Range::INFRARED;
range_msg.header.frame_id = "ir_ranger";
range_msg.field_of_view = 0.44; //25 degrees
range_msg.min_range = 0.03;
range_msg.max_range = 1.2;
}
void loop() {
if ((millis()-range_timer) > 50){
sensor.rangingTest(&measure, false);
if (measure.RangeStatus != 4) { // phase failures have incorrect data
range_msg.range = (float)measure.RangeMilliMeter/1000.0f; // convert mm to m
range_msg.header.stamp = nh.now();
pub_range.publish(&range_msg);
} else {
nh.logwarn("Out of range"); // if out of range, don't send message
}
range_timer = millis();
}
nh.spinOnce();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment