From 066e8f7fea27391e3e839efd1a49262bd46ab85a Mon Sep 17 00:00:00 2001 From: Aaron1356 Date: Mon, 16 Feb 2026 15:34:48 -0600 Subject: [PATCH] Adding Light Ware GRF Serial Driver (#26404) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Creating a base for grf lidar * Serial Drive is working, need to work out distance publish * WIP Getting Range Data in cm * Working Rand Distance Values for GRF 250 and GRF500 * Review Changes * Compiler fixes * Update to date * small update * Fix typo and remover unused libs * removing unused enum * Update to the Documentation * Fiving scaling issue * update to the logic * [Feature] Adding I2C driver for the GRF250 and GRF500 models (#26425) * Adding the GRF I2C driver * I2C Driver Working * Removing a lot of unnecessary code * fixing names * Changing the i2c Driver to be in the lightware laser * remove the old driver * formatting fix * Adding Ligthware GRF to documentation * Update to the Documentation * Ensuring sample_perf ends * Updating Docs * uavcannode: implement hardpoint commands (#26334) * implement cannode hardpoint commands Signed-off-by: dirksavage88 * Update src/drivers/uavcannode/Subscribers/HardpointCommand.hpp Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com> * Update src/drivers/uavcannode/Subscribers/HardpointCommand.hpp Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com> * add hardpoint sub to ark cannode, simplify handling of hardpoint broadcast Signed-off-by: dirksavage88 --------- Signed-off-by: dirksavage88 Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com> * voxl_esc: Limit frequency of UART passthru writes to 20Hz * voxl2_io: Added UART passthru * docs: update link for px4 ros2 interface lib python api docs * estimator_interface: remove unused getter * gnss_checks: always run strict checks on ground With the goal to never take off if the GNSS solution is not fullfilling the configured requirements still not stopping to use it in case it degrades mid air. * ekf2 unit-tests: adapt to strict GNSS checks on ground * escCheck: rework online check to properly report offline ESCs previous to this 09d79b221f274523349a029e63ab4462e41d0c1c set `esc_online_flags` e.g. for UAVCAN ESCs which specific one is online and that then got compared to a mask where the first `esc_count` bits were set. So if only ESC 5 is mapped and online you get the message "ESC 156 offline" because `esc_online_flags = 0b1000` gets compared to `online_bitmask = 0b1` based on `esc_count = 1` and the motor index is `esc[0].actuator_function = 0` wrapped using `0 - actuator_motors_s::ACTUATOR_FUNCTION_MOTOR1 + 1 = 156`. * FailureDetector: consistent timestamp naming * FailureDetector: rework motor status check * FailureDetector: implement upper and lower current limit with offset * Update src/modules/commander/failure_detector/FailureDetector.cpp Prevent Buffer overflow * Update Format * Subedit * Shrink and rename image * Apply suggestion from @hamishwillee Sounds good Co-authored-by: Hamish Willee * Apply suggestion from @hamishwillee More universal approach Co-authored-by: Hamish Willee * Update to the Documentation * FailureDetector: rework motor status check * FailureDetector: implement upper and lower current limit with offset * Subedit * docs: update parameter reference metadata * Remove pregenerated files - that should all be tidied up next time this runs * remover GRF parameters * Documentation updates * Fixing Merge Conflicts * remove @ * Undo Changes to parameter_reference * remove the code that will be autogen-ed * Update the Camake File --------- Signed-off-by: dirksavage88 Co-authored-by: Andrew Brahim <35986980+dirksavage88@users.noreply.github.com> Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com> Co-authored-by: Eric Katzfey Co-authored-by: Beat Küng Co-authored-by: Matthias Grob Co-authored-by: Marco Hauswirth Co-authored-by: Nick <145654544+ttechnick@users.noreply.github.com> Co-authored-by: Hamish Willee Co-authored-by: Ramon Roche --- boards/px4/fmu-v6xrt/default.px4board | 1 + .../sensors/lidar_lightware/grf_500.png | Bin 0 -> 110575 bytes docs/en/SUMMARY.md | 1 + docs/en/sensor/grf_lidar.md | 68 ++ docs/en/sensor/sfxx_lidar.md | 7 +- .../lightware_grf_serial/CMakeLists.txt | 46 ++ .../lightware_grf_serial/Kconfig | 5 + .../lightware_grf_serial/grf_commands.h | 91 +++ .../lightware_grf_serial.cpp | 633 ++++++++++++++++++ .../lightware_grf_serial.hpp | 134 ++++ .../lightware_grf_serial_main.cpp | 167 +++++ .../lightware_grf_serial/module.yaml | 44 ++ 12 files changed, 1195 insertions(+), 2 deletions(-) create mode 100644 docs/assets/hardware/sensors/lidar_lightware/grf_500.png create mode 100644 docs/en/sensor/grf_lidar.md create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/CMakeLists.txt create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/Kconfig create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/grf_commands.h create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.cpp create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.hpp create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial_main.cpp create mode 100755 src/drivers/distance_sensor/lightware_grf_serial/module.yaml diff --git a/boards/px4/fmu-v6xrt/default.px4board b/boards/px4/fmu-v6xrt/default.px4board index 395151b8cc..2f9d8479b3 100644 --- a/boards/px4/fmu-v6xrt/default.px4board +++ b/boards/px4/fmu-v6xrt/default.px4board @@ -19,6 +19,7 @@ CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y CONFIG_DRIVERS_DIFFERENTIAL_PRESSURE_AUAV=y CONFIG_COMMON_DISTANCE_SENSOR=y CONFIG_DRIVERS_DISTANCE_SENSOR_LIGHTWARE_SF45_SERIAL=y +CONFIG_DRIVERS_DISTANCE_SENSOR_LIGHTWARE_GRF_SERIAL=y CONFIG_DRIVERS_DSHOT=y CONFIG_DRIVERS_GNSS_SEPTENTRIO=y CONFIG_DRIVERS_GPS=y diff --git a/docs/assets/hardware/sensors/lidar_lightware/grf_500.png b/docs/assets/hardware/sensors/lidar_lightware/grf_500.png new file mode 100644 index 0000000000000000000000000000000000000000..baccec33a3ed5b7c4442334cbeb8389e420ecb0b GIT binary patch literal 110575 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 Distance sensors** + 3. Select/Enable `lightware_grf_serial` + 4. Save the configuration + + - Manually update `default.px4` to include the configuration key: + 1. Open the `default.px4board` config file that corresponds to the board you want to build for. + For example, to add the driver to `fmu-v6x` boards you would update [/boards/px4/fmu-v6x/default.px4board ](https://github.com/PX4/PX4-Autopilot/blob/main/boards/px4/fmu-v6x/default.px4board) + 2. Add the following line and save the file: + + ```txt + CONFIG_DRIVERS_DISTANCE_SENSOR_LIGHTWARE_GRF_SERIAL=y + ``` + +2. [Build PX4](../dev_setup/building_px4.md) for your flight controller target and upload the new firmware. + +### Parameter Configuration + +You will need to configure PX4 to indicate the serial port to which the sensor is connected (as per [Serial Port Configuration](../peripherals/serial_configuration.md)) and also the orientation and other properties of the sensor. + +The [parameters to change](../advanced_config/parameters.md) are listed in the table. + +| Parameter | Description | +| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | +| [SENS_EN_GRF_CFG](../advanced_config/parameter_reference.md#SENS_EN_GRF_CFG) | Set to the serial port the sensor is connected to. | +| [GRF_UPDATE_CFG](../advanced_config/parameter_reference.md#GRF_UPDATE_CFG) | Set the update rate. | +| [GRF_SENS_MODEL](../advanced_config/parameter_reference.md#GRF_SENS_MODEL) | Set the update rate. | + +## Testing + +You can confirm that the sensor is correctly configured by connecting QGroundControl, and observing that [DISTANCE_SENSOR](https://mavlink.io/en/messages/common.html#DISTANCE_SENSOR) is present in the [MAVLink Inspector](https://docs.qgroundcontrol.com/master/en/qgc-user-guide/analyze_view/mavlink_inspector.html). + +Moving the sensor around at various distances from a surface will have the `current_distance` value change. + +## Troubleshooting +If you are having problems with connecting to the sensor you may need to unassign a the default serial port. [Unassign Default Serial Port](../peripherals/serial_configuration.md) diff --git a/docs/en/sensor/sfxx_lidar.md b/docs/en/sensor/sfxx_lidar.md index e225422805..2ca57d9972 100644 --- a/docs/en/sensor/sfxx_lidar.md +++ b/docs/en/sensor/sfxx_lidar.md @@ -15,8 +15,8 @@ The following models are supported by PX4, and can be connected to either the I2 | [LW20/C](https://lightware.co.za/products/lw20-c-100-m) | 100 | I2C bus | Waterproofed (IP67) with servo for sense-and-avoid applications | | [SF30/D](https://lightwarelidar.com/shop/sf30-d-200-m/) | 200 | I2C bus | Waterproofed (IP67) | | [SF45/B](../sensor/sf45_rotating_lidar.md) | 50 | Serial | Rotary Lidar (Used for [Collision Prevention](../computer_vision/collision_prevention.md)) | -| [GRF250](https://lightwarelidar.com/shop/grf-250/) | 250 | I2C | Gimbal Range Finder | -| [GRF500](https://lightwarelidar.com/shop/grf-500/) | 500 | I2C | Gimbal Range Finder | +| [GRF250](../sensor/grf_lidar.md) | 250 | Serial or I2C | Gimbal Range Finder | +| [GRF500](../sensor/grf_lidar.md) | 500 | Serial or I2C | Gimbal Range Finder | ::: details Discontinued @@ -69,6 +69,9 @@ VTOL vehicles may choose to also set [SF1XX_MODE](../advanced_config/parameter_r ::: tip [SF45/B](../sensor/sf45_rotating_lidar.md) setup is covered in the linked document. ::: +::: tip +[GRF250/GRF500](../sensor/grf_lidar.md) setup is covered in the linked document. +::: ### Hardware diff --git a/src/drivers/distance_sensor/lightware_grf_serial/CMakeLists.txt b/src/drivers/distance_sensor/lightware_grf_serial/CMakeLists.txt new file mode 100755 index 0000000000..9a3c045be7 --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/CMakeLists.txt @@ -0,0 +1,46 @@ +############################################################################ +# +# Copyright (c) 2026 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ +px4_add_module( + MODULE drivers__distance_sensor__lightware_grf_serial + MAIN lightware_grf_serial + COMPILE_FLAGS + SRCS + lightware_grf_serial.cpp + lightware_grf_serial.hpp + lightware_grf_serial_main.cpp + DEPENDS + drivers_rangefinder + px4_work_queue + MODULE_CONFIG + module.yaml + ) diff --git a/src/drivers/distance_sensor/lightware_grf_serial/Kconfig b/src/drivers/distance_sensor/lightware_grf_serial/Kconfig new file mode 100755 index 0000000000..3c89bf0974 --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/Kconfig @@ -0,0 +1,5 @@ +menuconfig DRIVERS_DISTANCE_SENSOR_LIGHTWARE_GRF_SERIAL + bool "lightware_grf_serial" + default n + ---help--- + Enable support for lightware_grf_serial diff --git a/src/drivers/distance_sensor/lightware_grf_serial/grf_commands.h b/src/drivers/distance_sensor/lightware_grf_serial/grf_commands.h new file mode 100755 index 0000000000..c278a166c6 --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/grf_commands.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * Copyright (c) 2026 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file grf_commands.h + * @author Aaron Porter + * + * Declarations of grf serial commands for the Lightware grf series + */ + +#pragma once +#define GRF_MAX_PAYLOAD 256 +#define GRF_CRC_FIELDS 2 + +enum GRF_SERIAL_CMD { + GRF_PRODUCT_NAME = 0, + GRF_HARDWARE_VERSION = 1, + GRF_FIRMWARE_VERSION = 2, + GRF_SERIAL_NUMBER = 3, + GRF_TEXT_MESSAGE = 7, + GRF_USER_DATA = 9, + GRF_TOKEN = 10, + GRF_SAVE_PARAMETERS = 12, + GRF_RESET = 14, + GRF_STAGE_FIRMWARE = 16, + GRF_COMMIT_FIRMWARE = 17, + GRF_DISTANCE_OUTPUT = 27, + GRF_STREAM = 30, + GRF_DISTANCE_DATA_CM = 44, + GRF_DISTANCE_DATA_MM = 45, + GRF_LASER_FIRING = 50, + GRF_TEMPERATURE = 55, + GRF_AUTO_EXPOSURE = 70, + GRF_UPDATE_RATE = 74, + GRF_LOST_SIGNAL_COUNT = 78, + GRF_GPIO_MODE = 83, + GRF_GPIO_ALARM = 84, + GRF_MEDIAN_FILTER_EN = 86, + GRF_MEDIAN_FILETER_S = 87, + GRF_SMOOTH_FILTER_EN = 88, + GRF_SMOOTH_FACTOR = 89, + GRF_BAUD_RATE = 91, + GRF_I2C_ADDRESS = 92, + GRF_ROLL_AVG_EN = 93, + GRF_ROLL_AVG_SIZE = 94, + GRF_SLEEP_COMMAND = 98, + GRF_ZERO_OFFSET = 114 +}; + +// Store contents of rx'd frame +struct { + const uint8_t data_fields = 2; // useful for breaking crc's into byte separated fields + uint16_t data_len{0}; // last message payload length (1+ bytes in payload) + uint8_t data[GRF_MAX_PAYLOAD]; // payload size limited by posix serial + uint8_t msg_id{0}; // latest message's message id + uint8_t flags_lo{0}; // flags low byte + uint8_t flags_hi{0}; // flags high byte + uint16_t crc[GRF_CRC_FIELDS] = {0, 0}; + uint8_t crc_lo{0}; // crc low byte + uint8_t crc_hi{0}; // crc high byte +} rx_field; diff --git a/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.cpp b/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.cpp new file mode 100755 index 0000000000..403c61f562 --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.cpp @@ -0,0 +1,633 @@ +/************************************************************************** + * + * Copyright (c) 2026 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include "lightware_grf_serial.hpp" + +#include +#include +#include +#include + +#include + +using namespace time_literals; + +GRFLaserSerial::GRFLaserSerial(const char *port, uint8_t rotation) : + ScheduledWorkItem(MODULE_NAME, px4::serial_port_to_wq(port)), + _px4_rangefinder(0, rotation), + _sample_perf(perf_alloc(PC_ELAPSED, MODULE_NAME": read")), + _comms_errors(perf_alloc(PC_COUNT, MODULE_NAME": com_err")) +{ + /* store port name */ + strncpy(_port, port, sizeof(_port) - 1); + + /* enforce null termination */ + _port[sizeof(_port) - 1] = '\0'; + + device::Device::DeviceId device_id; + device_id.devid_s.bus_type = device::Device::DeviceBusType_SERIAL; + + uint8_t bus_num = atoi(&_port[strlen(_port) - 1]); // Assuming '/dev/ttySx' + + if (bus_num < 10) { + device_id.devid_s.bus = bus_num; + } + + _px4_rangefinder.set_device_id(device_id.devid); + _px4_rangefinder.set_device_type(DRV_DIST_DEVTYPE_LIGHTWARE_LASER); + +} + +GRFLaserSerial::~GRFLaserSerial() +{ + stop(); + + perf_free(_sample_perf); + perf_free(_comms_errors); +} + +int GRFLaserSerial::init() +{ + param_get(param_find("GRF_RATE_CFG"), &_update_rate); + param_get(param_find("GRF_SENS_MODEL"), &_model_type); + + start(); + return PX4_OK; +} + +int GRFLaserSerial::measure() +{ + int32_t rate = (int32_t)_update_rate; + _data_output = 0x01; // raw distance (last return) + _stream_data = 5; // enable constant streaming + + // send packets to the sensor depending on the state + switch (_sensor_state) { + + case STATE_UNINIT: + // Used to probe if the sensor is alive + grf_send(GRF_PRODUCT_NAME, false, &_product_name[0], 0); + break; + + case STATE_ACK_PRODUCT_NAME: + // Update rate default to 5 readings/s + grf_send(GRF_UPDATE_RATE, true, &rate, sizeof(uint8_t)); + ScheduleDelayed(100_ms); + break; + + case STATE_ACK_UPDATE_RATE: + // Configure the data that the sensor shall output + grf_send(GRF_DISTANCE_OUTPUT, true, &_data_output, sizeof(_data_output)); + break; + + case STATE_ACK_DISTANCE_OUTPUT: + // Configure the sensor to automatically output data at the configured update rate + grf_send(GRF_STREAM, true, &_stream_data, sizeof(_stream_data)); + _sensor_state = STATE_SEND_STREAM; + break; + + default: + break; + } + + return PX4_OK; +} + +int GRFLaserSerial::collect() +{ + if (_sensor_state == STATE_UNINIT) { + + perf_begin(_sample_perf); + const int payload_length = 22; + + _crc_valid = false; + grf_get_and_handle_request(payload_length, GRF_PRODUCT_NAME); + + if (_crc_valid) { + _sensor_state = STATE_ACK_PRODUCT_NAME; + perf_end(_sample_perf); + return PX4_OK; + } + + perf_end(_sample_perf); + return -EAGAIN; + + } else if (_sensor_state == STATE_ACK_PRODUCT_NAME) { + + perf_begin(_sample_perf); + const int payload_length = 7; + + _crc_valid = false; + grf_get_and_handle_request(payload_length, GRF_UPDATE_RATE); + + if (_crc_valid) { + _sensor_state = STATE_ACK_UPDATE_RATE; + perf_end(_sample_perf); + return PX4_OK; + } + + perf_end(_sample_perf); + return -EAGAIN; + + } else if (_sensor_state == STATE_ACK_UPDATE_RATE) { + + perf_begin(_sample_perf); + const int payload_length = 10; + + _crc_valid = false; + grf_get_and_handle_request(payload_length, GRF_DISTANCE_OUTPUT); + + if (_crc_valid) { + _sensor_state = STATE_ACK_DISTANCE_OUTPUT; + perf_end(_sample_perf); + return PX4_OK; + } + + perf_end(_sample_perf); + return -EAGAIN; + + } else { + + // Stream data from sensor + perf_begin(_sample_perf); + const int payload_length = 10; + + _crc_valid = false; + grf_get_and_handle_request(payload_length, GRF_DISTANCE_DATA_CM); + + if (_crc_valid) { + grf_process_replies(); + perf_end(_sample_perf); + return PX4_OK; + } + + perf_end(_sample_perf); + return -EAGAIN; + } +} + +void GRFLaserSerial::start() +{ + /* reset the sensor state */ + _sensor_state = STATE_UNINIT; + + /* reset the report ring */ + _collect_phase = false; + + /* reset the UART receive buffer size */ + _linebuf_size = 0; + + /* reset the fail counter */ + _last_received_time = hrt_absolute_time(); + + /*Set Lidar Min/Max based on model*/ + switch (_model_type) { + case GRF250: { + _px4_rangefinder.set_min_distance(0.1f); + _px4_rangefinder.set_max_distance(250.0f); + break; + } + + case GRF500: { + _px4_rangefinder.set_min_distance(0.1f); + _px4_rangefinder.set_max_distance(500.0f); + break; + } + } + + /* schedule a cycle to start things */ + ScheduleNow(); +} + +void GRFLaserSerial::stop() +{ + ScheduleClear(); +} + +void GRFLaserSerial::Run() +{ + /* fds initialized? */ + if (_fd < 0) { + /* open fd: non-blocking read mode*/ + _fd = ::open(_port, O_RDWR | O_NOCTTY | O_NONBLOCK); + + if (_fd < 0) { + PX4_ERR("serial open failed (%i)", errno); + return; + } + + struct termios uart_config; + + int termios_state; + + /* fill the struct for the new configuration */ + tcgetattr(_fd, &uart_config); + + /* clear ONLCR flag (which appends a CR for every LF) */ + uart_config.c_oflag &= ~ONLCR; + + /* no parity, one stop bit */ + uart_config.c_cflag &= ~(CSTOPB | PARENB); + + unsigned speed = B115200; + + /* set baud rate */ + if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) { + PX4_ERR("CFG: %d ISPD", termios_state); + } + + if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) { + PX4_ERR("CFG: %d OSPD", termios_state); + } + + if ((termios_state = tcsetattr(_fd, TCSANOW, &uart_config)) < 0) { + PX4_ERR("baud %d ATTR", termios_state); + } + } + + if (_collect_phase) { + if (hrt_absolute_time() - _last_received_time >= 1_s) { + start(); + return; + } + + /* perform collection */ + if (collect() != PX4_OK && errno != EAGAIN) { + PX4_DEBUG("collect error"); + } + + if (_sensor_state != STATE_SEND_STREAM) { + /* next phase is measurement */ + _collect_phase = false; + } + + } else { + /* measurement phase */ + + if (measure() != PX4_OK) { + PX4_DEBUG("measure error"); + } + + /* next phase is collection */ + _collect_phase = true; + } + + /* schedule a fresh cycle call when the measurement is done */ + ScheduleDelayed(_interval); +} + +void GRFLaserSerial::print_info() +{ + perf_print_counter(_sample_perf); + perf_print_counter(_comms_errors); +} + +void GRFLaserSerial::grf_get_and_handle_request(const int payload_length, const GRF_SERIAL_CMD msg_id) +{ + // GRF protocol + // Start byte is 0xAA and is the start of packet + // Payload length sanity check (0-1023) bytes + // and represented by 16-bit integer (payload + + // read/write status) + // ID byte precedes the data in the payload + // CRC comprised of 16-bit checksum (not included in checksum calc.) + + int ret; + size_t max_read = sizeof(_linebuf) - _linebuf_size; + ret = ::read(_fd, &_linebuf[_linebuf_size], max_read); + + if (ret < 0 && errno != EAGAIN) { + PX4_ERR("ERROR (ack from streaming distance data): %d", ret); + _linebuf_size = 0; + perf_count(_comms_errors); + perf_end(_sample_perf); + return; + } + + if (ret > 0) { + _last_received_time = hrt_absolute_time(); + _linebuf_size += ret; + } + + // Not enough data to parse a complete packet. Gather more data in the next cycle. + if (_linebuf_size < payload_length) { + return; + } + + int index = 0; + + while (index <= _linebuf_size - payload_length && _crc_valid == false) { + bool restart_flag = false; + + while (restart_flag != true) { + switch (_parsed_state) { + case GRF_PARSED_STATE::START: { + if (_linebuf[index] == 0xAA) { + // start of frame is valid, continue + _calc_crc = grf_format_crc(_calc_crc, _start_of_frame); + _parsed_state = GRF_PARSED_STATE::FLG_LOW; + break; + + } else { + _crc_valid = false; + _parsed_state = GRF_PARSED_STATE::START; + restart_flag = true; + _calc_crc = 0; + PX4_DEBUG("Start of packet not valid: %d", _sensor_state); + break; + } + } + + case GRF_PARSED_STATE::FLG_LOW: { + rx_field.flags_lo = _linebuf[index + 1]; + _calc_crc = grf_format_crc(_calc_crc, rx_field.flags_lo); + _parsed_state = GRF_PARSED_STATE::FLG_HIGH; + break; + } + + case GRF_PARSED_STATE::FLG_HIGH: { + rx_field.flags_hi = _linebuf[index + 2]; + rx_field.data_len = (rx_field.flags_hi << 2) | (rx_field.flags_lo >> 6); + _calc_crc = grf_format_crc(_calc_crc, rx_field.flags_hi); + + // Check payload length against known max value + if (rx_field.data_len > 17) { + _parsed_state = GRF_PARSED_STATE::START; + restart_flag = true; + _calc_crc = 0; + PX4_DEBUG("Payload length error: %d", _sensor_state); + break; + + } else { + _parsed_state = GRF_PARSED_STATE::ID; + break; + } + } + + case GRF_PARSED_STATE::ID: { + rx_field.msg_id = _linebuf[index + 3]; + + if (rx_field.msg_id == msg_id) { + _calc_crc = grf_format_crc(_calc_crc, rx_field.msg_id); + _parsed_state = GRF_PARSED_STATE::DATA; + break; + } + + // Ignore message ID's that aren't searched + else { + _parsed_state = GRF_PARSED_STATE::START; + _calc_crc = 0; + restart_flag = true; + PX4_DEBUG("Non needed message ID: %d", _sensor_state); + break; + } + } + + case GRF_PARSED_STATE::DATA: { + // Process commands with & w/out data bytes + if (rx_field.data_len > 1) { + for (uint8_t i = 4; i < 3 + rx_field.data_len; ++i) { + + rx_field.data[_data_bytes_recv] = _linebuf[index + i]; + _calc_crc = grf_format_crc(_calc_crc, rx_field.data[_data_bytes_recv]); + _data_bytes_recv = _data_bytes_recv + 1; + + } + } + + else { + + _parsed_state = GRF_PARSED_STATE::CRC_LOW; + _data_bytes_recv = 0; + _calc_crc = grf_format_crc(_calc_crc, _data_bytes_recv); + } + + _parsed_state = GRF_PARSED_STATE::CRC_LOW; + _data_bytes_recv = 0; + break; + } + + case GRF_PARSED_STATE::CRC_LOW: { + rx_field.crc[0] = _linebuf[index + 3 + rx_field.data_len]; + _parsed_state = GRF_PARSED_STATE::CRC_HIGH; + break; + } + + case GRF_PARSED_STATE::CRC_HIGH: { + rx_field.crc[1] = _linebuf[index + 4 + rx_field.data_len]; + uint16_t recv_crc = (rx_field.crc[1] << 8) | rx_field.crc[0]; + + // Check the received crc bytes from the grf against our own CRC calcuation + // If it matches, we can check if sensor ready + // Only if crc match is valid and sensor ready (transmitting distance data) do we flag _init_complete + if (recv_crc == _calc_crc) { + _crc_valid = true; + _parsed_state = GRF_PARSED_STATE::START; + _calc_crc = 0; + restart_flag = true; + break; + + } else { + + _crc_valid = false; + _parsed_state = GRF_PARSED_STATE::START; + _calc_crc = 0; + restart_flag = true; + perf_count(_comms_errors); + PX4_DEBUG("CRC mismatch: %d", _sensor_state); + break; + } + } + } + } + + index++; + } + + // If we parsed successfully, remove the parsed part from the buffer if it is still large enough + if (_crc_valid && index + payload_length < _linebuf_size) { + unsigned next_after_index = index + payload_length; + memmove(&_linebuf[0], &_linebuf[next_after_index], _linebuf_size - next_after_index); + _linebuf_size -= next_after_index; + } + + // The buffer is filled. Either we can't keep up with the stream and/or it contains only invalid data. Reset to try again. + if ((unsigned)_linebuf_size >= sizeof(_linebuf)) { + _linebuf_size = 0; + perf_count(_comms_errors); + } +} + +void GRFLaserSerial::grf_send(uint8_t msg_id, bool write, int32_t *data, uint8_t data_len) +{ + uint16_t crc_val = 0; + uint8_t packet_buff[GRF_MAX_PAYLOAD]; + uint8_t data_inc = 4; + int ret = 0; + uint8_t packet_len = 0; + // Include payload ID byte in payload len + uint16_t flags = (data_len + 1) << 6; + + // If writing to the device, lsb is 1 + if (write) { + flags |= 0x01; + } + + else { + flags |= 0x0; + } + + uint8_t flags_lo = flags & 0xFF; + uint8_t flags_hi = (flags >> 8) & 0xFF; + + // Add packet bytes to format into crc based on CRC-16-CCITT 0x1021/XMODEM + crc_val = grf_format_crc(crc_val, _start_of_frame); + crc_val = grf_format_crc(crc_val, flags_lo); + crc_val = grf_format_crc(crc_val, flags_hi); + crc_val = grf_format_crc(crc_val, msg_id); + + // Write the packet header contents + payload msg ID to the output buffer + packet_buff[0] = _start_of_frame; + packet_buff[1] = flags_lo; + packet_buff[2] = flags_hi; + packet_buff[3] = msg_id; + + if (msg_id == GRF_DISTANCE_OUTPUT) { + uint8_t data_convert = data[0] & 0x00FF; + // write data bytes to the output buffer + packet_buff[data_inc] = data_convert; + // Add data bytes to crc add function + crc_val = grf_format_crc(crc_val, data_convert); + data_inc = data_inc + 1; + data_convert = data[0] >> 8; + packet_buff[data_inc] = data_convert; + crc_val = grf_format_crc(crc_val, data_convert); + data_inc = data_inc + 1; + packet_buff[data_inc] = 0; + crc_val = grf_format_crc(crc_val, packet_buff[data_inc]); + data_inc = data_inc + 1; + packet_buff[data_inc] = 0; + crc_val = grf_format_crc(crc_val, packet_buff[data_inc]); + data_inc = data_inc + 1; + } + + else if (msg_id == GRF_STREAM) { + packet_buff[data_inc] = data[0]; + //pad zeroes + crc_val = grf_format_crc(crc_val, data[0]); + data_inc = data_inc + 1; + packet_buff[data_inc] = 0; + crc_val = grf_format_crc(crc_val, packet_buff[data_inc]); + data_inc = data_inc + 1; + packet_buff[data_inc] = 0; + crc_val = grf_format_crc(crc_val, packet_buff[data_inc]); + data_inc = data_inc + 1; + packet_buff[data_inc] = 0; + crc_val = grf_format_crc(crc_val, packet_buff[data_inc]); + data_inc = data_inc + 1; + } + + else if (msg_id == GRF_UPDATE_RATE) { + // Update Rate + packet_buff[data_inc] = (uint8_t)data[0]; + // Add data bytes to crc add function + crc_val = grf_format_crc(crc_val, data[0]); + data_inc = data_inc + 1; + } + + else { + // Product Name + PX4_DEBUG("DEBUG: Product name"); + } + + uint8_t crc_lo = crc_val & 0xFF; + uint8_t crc_hi = (crc_val >> 8) & 0xFF; + + packet_buff[data_inc] = crc_lo; + data_inc = data_inc + 1; + packet_buff[data_inc] = crc_hi; + + size_t len = sizeof(packet_buff[0]) * (data_inc + 1); + packet_len = (uint8_t)len; + + // DEBUG + for (uint8_t i = 0; i < packet_len; ++i) { + PX4_DEBUG("DEBUG: Send byte: %d", packet_buff[i]); + } + + ret = ::write(_fd, packet_buff, packet_len); + + if (ret != packet_len) { + perf_count(_comms_errors); + PX4_ERR("serial write fail %d", ret); + // Flush data written, not transmitted + tcflush(_fd, TCOFLUSH); + } +} + +void GRFLaserSerial::grf_process_replies() +{ + float distance_m = -1.0f; + hrt_abstime now = hrt_absolute_time(); + + switch (rx_field.msg_id) { + case GRF_DISTANCE_DATA_CM: { + const float raw_distance = (rx_field.data[0] << 0) | (rx_field.data[1] << 8) | (rx_field.data[2] << 16); + distance_m = raw_distance * GRF_SCALE_FACTOR; + _px4_rangefinder.update(now, distance_m); + break; + } + + default: + // add case for future use + break; + } +} + +uint16_t GRFLaserSerial::grf_format_crc(uint16_t crc, uint8_t data_val) +{ + uint32_t i; + const uint16_t poly = 0x1021u; + crc ^= (uint16_t)((uint16_t) data_val << 8u); + + for (i = 0; i < 8; i++) { + if (crc & (1u << 15u)) { + crc = (uint16_t)((crc << 1u) ^ poly); + + } else { + crc = (uint16_t)(crc << 1u); + } + } + + return crc; +} diff --git a/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.hpp b/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.hpp new file mode 100755 index 0000000000..17c73c4d54 --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial.hpp @@ -0,0 +1,134 @@ +/**************************************************************************** + * + * Copyright (c) 2026 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file lightware_grf_serial.hpp + * @author Aaron Porter + * + * Serial Protocol driver for the Lightware GRF rangefinder series + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "grf_commands.h" + +enum GRF_SERIAL_STATE { + STATE_UNINIT = 0, + STATE_ACK_PRODUCT_NAME = 1, + STATE_ACK_UPDATE_RATE = 2, + STATE_ACK_DISTANCE_OUTPUT = 3, + STATE_SEND_STREAM = 4, +}; + +enum GRF_PARSED_STATE { + START = 0, + FLG_LOW, + FLG_HIGH, + ID, + DATA, + CRC_LOW, + CRC_HIGH +}; + +enum MODEL { + Disable = 0, + GRF250 = 1, + GRF500 = 2 +}; + +using namespace time_literals; +class GRFLaserSerial : public px4::ScheduledWorkItem +{ +public: + GRFLaserSerial(const char *port, uint8_t rotation = distance_sensor_s::ROTATION_DOWNWARD_FACING); + ~GRFLaserSerial() override; + + int init(); + void print_info(); + void grf_get_and_handle_request(const int payload_length, const GRF_SERIAL_CMD msg_id); + void grf_send(uint8_t msg_id, bool r_w, int32_t *data, uint8_t data_len); + uint16_t grf_format_crc(uint16_t crc, uint8_t data_value); + void grf_process_replies(); + +private: + + distance_sensor_s _distance{}; + static constexpr uint64_t GRF_MEAS_TIMEOUT{100_ms}; + static constexpr float GRF_SCALE_FACTOR = 0.1f; + + void start(); + void stop(); + void Run() override; + int measure(); + int collect(); + bool _crc_valid{false}; + + PX4Rangefinder _px4_rangefinder; + char _port[20] {}; + int _interval{200000}; + bool _collect_phase{false}; + int _fd{-1}; + uint8_t _linebuf[GRF_MAX_PAYLOAD] {}; + int _linebuf_size{0}; + + // GRF uses a binary protocol to include header,flags + // message ID, payload, and checksum + GRF_SERIAL_STATE _sensor_state{STATE_UNINIT}; + int _baud_rate{0}; + int32_t _product_name[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int32_t _stream_data{0}; + int32_t _update_rate{0}; + int32_t _model_type{0}; + int32_t _data_output{0}; + const uint8_t _start_of_frame{0xAA}; + uint16_t _data_bytes_recv{0}; + uint8_t _parsed_state{0}; + uint16_t _calc_crc{0}; + + // end of GRF data members + + hrt_abstime _last_received_time{0}; + perf_counter_t _sample_perf; + perf_counter_t _comms_errors; +}; diff --git a/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial_main.cpp b/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial_main.cpp new file mode 100755 index 0000000000..08e912e2c8 --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/lightware_grf_serial_main.cpp @@ -0,0 +1,167 @@ +/**************************************************************************** + * + * Copyright (c) 2026 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include "lightware_grf_serial.hpp" + +#include +#include + +namespace lightware_grf +{ + +GRFLaserSerial *g_dev{nullptr}; + +static int start(const char *port) +{ + if (g_dev != nullptr) { + PX4_WARN("already started"); + return -1; + } + + if (port == nullptr) { + PX4_ERR("no device specified"); + return -1; + } + + /* create the driver */ + g_dev = new GRFLaserSerial(port); + + if (g_dev == nullptr) { + return -1; + } + + if (g_dev->init() != PX4_OK) { + delete g_dev; + g_dev = nullptr; + return -1; + } + + return 0; +} + +static int stop() +{ + if (g_dev != nullptr) { + delete g_dev; + g_dev = nullptr; + + } else { + return -1; + } + + return 0; +} + +static int status() +{ + if (g_dev == nullptr) { + PX4_ERR("driver not running"); + return -1; + } + + g_dev->print_info(); + + return 0; +} + +static int usage() +{ + PRINT_MODULE_DESCRIPTION( + R"DESCR_STR( +### Description + +Serial bus driver for the Lightware GRF Laser rangefinder. + +### Configuration +https://docs.px4.io/main/en/sensor/grf_lidar + +### Parameters +https://docs.px4.io/main/en/advanced_config/parameter_reference#GRF_SENS_MODEL +https://docs.px4.io/main/en/advanced_config/parameter_reference#GRF_RATE_CFG +https://docs.px4.io/main/en/advanced_config/parameter_reference#SENS_EN_GRF_CFG + +### Examples + +Attempt to start driver on a specified serial device. +$ lightware_grf_serial start -d /dev/ttyS1 +Stop driver +$ lightware_grf_serial stop +)DESCR_STR"); + + PRINT_MODULE_USAGE_NAME("lightware_grf_serial", "driver"); + PRINT_MODULE_USAGE_SUBCATEGORY("distance_sensor"); + PRINT_MODULE_USAGE_COMMAND_DESCR("start", "Start driver"); + PRINT_MODULE_USAGE_PARAM_STRING('d', nullptr, nullptr, "Serial device", false); + PRINT_MODULE_USAGE_COMMAND_DESCR("stop", "Stop driver"); + return PX4_OK; +} + +} // namespace + +extern "C" __EXPORT int lightware_grf_serial_main(int argc, char *argv[]) +{ + const char *device_path = nullptr; + int ch; + int myoptind = 1; + const char *myoptarg = nullptr; + + while ((ch = px4_getopt(argc, argv, "d:", &myoptind, &myoptarg)) != EOF) { + switch (ch) { + case 'd': + device_path = myoptarg; + break; + + default: + lightware_grf::usage(); + return -1; + } + } + + if (myoptind >= argc) { + lightware_grf::usage(); + return -1; + } + + if (!strcmp(argv[myoptind], "start")) { + return lightware_grf::start(device_path); + + } else if (!strcmp(argv[myoptind], "stop")) { + return lightware_grf::stop(); + + } else if (!strcmp(argv[myoptind], "status")) { + return lightware_grf::status(); + } + + lightware_grf::usage(); + return -1; +} diff --git a/src/drivers/distance_sensor/lightware_grf_serial/module.yaml b/src/drivers/distance_sensor/lightware_grf_serial/module.yaml new file mode 100755 index 0000000000..7765f9802c --- /dev/null +++ b/src/drivers/distance_sensor/lightware_grf_serial/module.yaml @@ -0,0 +1,44 @@ +module_name: Lightware GRF Rangefinder (serial) +serial_config: + - command: lightware_grf_serial start -d ${SERIAL_DEV} + port_config_param: + name: SENS_EN_GRF_CFG + group: Sensors + num_instances: 1 + supports_networking: false + +parameters: + - group: Sensors + definitions: + GRF_RATE_CFG: + description: + short: Lightware GRF lidar update rate. + long: | + The Lightware GRF distance sensor can increase the update rate to enable greater resolution. + type: enum + values: + 1: 1 Hz + 2: 2 Hz + 3: 4 Hz + 4: 5 Hz + 5: 10 Hz + 6: 20 Hz + 7: 30 Hz + 8: 40 Hz + 9: 50 Hz + reboot_required: true + num_instances: 1 + default: 4 + GRF_SENS_MODEL: + description: + short: GRF Sensor model + long: | + GRF Sensor Model used to distinush between the GRF250 and GRF500 since both have different max distance range. + type: enum + values: + 0: disable + 1: GRF250 + 2: GRF500 + reboot_required: true + num_instances: 1 + default: 0