From 81ba98137bcc766ba04689d2776f98191e9e89c6 Mon Sep 17 00:00:00 2001 From: Claudio Chies <61051109+Claudio-Chies@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:41:20 +0200 Subject: [PATCH 01/11] adapted the collision prevention documentation to reflect the move to Acceleration based cp --- en/computer_vision/collision_prevention.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/en/computer_vision/collision_prevention.md b/en/computer_vision/collision_prevention.md index b4fd048a1aad..9a24cb9402a5 100644 --- a/en/computer_vision/collision_prevention.md +++ b/en/computer_vision/collision_prevention.md @@ -26,7 +26,7 @@ Multiple sensors can be used to get information about, and prevent collisions wi If multiple sources supply data for the _same_ orientation, the system uses the data that reports the smallest distance to an object. ::: -The vehicle restricts the maximum velocity in order to slow down as it gets closer to obstacles, and will stop movement when it reaches the minimum allowed separation. +The vehicle restricts the current velocity in order to slow down as it gets closer to obstacles and adapts the acceleration setpoint as to disallow collision trajectories. In order to move away from (or parallel to) an obstacle, the user must command the vehicle to move toward a setpoint that does not bring the vehicle closer to the obstacle. The algorithm will make minor adjustments to the setpoint direction if it is determined that a "better" setpoint exists within a fixed margin on either side of the requested setpoint. @@ -46,7 +46,7 @@ Configure collision prevention by [setting the following parameters](../advanced | [CP_DELAY](../advanced_config/parameter_reference.md#CP_DELAY) | Set the sensor and velocity setpoint tracking delay. See [Delay Tuning](#delay_tuning) below. | | [CP_GUIDE_ANG](../advanced_config/parameter_reference.md#CP_GUIDE_ANG) | Set the angle (to both sides of the commanded direction) within which the vehicle may deviate if it finds fewer obstacles in that direction. See [Guidance Tuning](#angle_change_tuning) below. | | [CP_GO_NO_DATA](../advanced_config/parameter_reference.md#CP_GO_NO_DATA) | Set to 1 to allow the vehicle to move in directions where there is no sensor coverage (default is 0/`False`). | -| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Set to `Direct velocity` or `Smoothed velocity` to enable Collision Prevention in Position Mode (default is `Acceleration based`). | +| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Set to `Acceleration based` (default), Implementation in `Direct velocity` or `Smoothed velocity` has been removed. | ## Algorithm Description @@ -57,13 +57,14 @@ If so, the vehicle velocity is restricted. This velocity restriction takes into account both the inner velocity loop tuned by [MPC_XY_P](../advanced_config/parameter_reference.md#MPC_XY_P), as well as the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). The velocity is restricted such that the vehicle will stop in time to maintain the distance specified in [CP_DIST](#CP_DIST). The range of the sensors for each sector is also taken into account, limiting the velocity via the same mechanism. +the restricted velocity is then transformed into an acceleration with [MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC) ::: info If there is no sensor data in a particular direction, velocity in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). If you wish to move freely into directions without sensor coverage, this can be enabled by setting [CP_GO_NO_DATA](#CP_GO_NO_DATA) to 1. ::: -Delay, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. +The delay assoctiated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. This should be [tuned](#delay_tuning) to the specific vehicle. If the sectors adjacent to the commanded sectors are 'better' by a significant margin, the direction of the requested input can be modified by up to the angle specified in [CP_GUIDE_ANG](#CP_GUIDE_ANG). @@ -177,7 +178,7 @@ Initial testing of the system used a vehicle moving at 4 m/s with `OBSTACLE_DIST The system may work well at significantly higher speeds and lower frequency distance updates. ::: -The tested companion software is the _local_planner_ from the [PX4/PX4-Avoidance](https://github.com/PX4/PX4-Avoidance) repo. +The tested companion software is the _local_planner_ from the [PX4/PX4-Avoidance](https://github.com/PX4/PX4-Avoidance) repo, which is not actively maintained anymore. For more information on hardware and software setup see: [PX4/PX4-Avoidance > Run on Hardware](https://github.com/PX4/PX4-Avoidance#run-on-hardware). From b00528760b74fcbcd887c4e4fa1238b25c5bfcd8 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Wed, 28 Aug 2024 08:28:57 +1000 Subject: [PATCH 02/11] Typos --- en/computer_vision/collision_prevention.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/en/computer_vision/collision_prevention.md b/en/computer_vision/collision_prevention.md index 9a24cb9402a5..6047ded3ea10 100644 --- a/en/computer_vision/collision_prevention.md +++ b/en/computer_vision/collision_prevention.md @@ -26,7 +26,7 @@ Multiple sensors can be used to get information about, and prevent collisions wi If multiple sources supply data for the _same_ orientation, the system uses the data that reports the smallest distance to an object. ::: -The vehicle restricts the current velocity in order to slow down as it gets closer to obstacles and adapts the acceleration setpoint as to disallow collision trajectories. +The vehicle restricts the current velocity in order to slow down as it gets closer to obstacles and adapts the acceleration setpoint in order to disallow collision trajectories. In order to move away from (or parallel to) an obstacle, the user must command the vehicle to move toward a setpoint that does not bring the vehicle closer to the obstacle. The algorithm will make minor adjustments to the setpoint direction if it is determined that a "better" setpoint exists within a fixed margin on either side of the requested setpoint. @@ -57,14 +57,14 @@ If so, the vehicle velocity is restricted. This velocity restriction takes into account both the inner velocity loop tuned by [MPC_XY_P](../advanced_config/parameter_reference.md#MPC_XY_P), as well as the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). The velocity is restricted such that the vehicle will stop in time to maintain the distance specified in [CP_DIST](#CP_DIST). The range of the sensors for each sector is also taken into account, limiting the velocity via the same mechanism. -the restricted velocity is then transformed into an acceleration with [MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC) +the restricted velocity is then transformed into an acceleration with [MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC). ::: info If there is no sensor data in a particular direction, velocity in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). If you wish to move freely into directions without sensor coverage, this can be enabled by setting [CP_GO_NO_DATA](#CP_GO_NO_DATA) to 1. ::: -The delay assoctiated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. +The delay associated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. This should be [tuned](#delay_tuning) to the specific vehicle. If the sectors adjacent to the commanded sectors are 'better' by a significant margin, the direction of the requested input can be modified by up to the angle specified in [CP_GUIDE_ANG](#CP_GUIDE_ANG). @@ -178,7 +178,8 @@ Initial testing of the system used a vehicle moving at 4 m/s with `OBSTACLE_DIST The system may work well at significantly higher speeds and lower frequency distance updates. ::: -The tested companion software is the _local_planner_ from the [PX4/PX4-Avoidance](https://github.com/PX4/PX4-Avoidance) repo, which is not actively maintained anymore. +The tested companion software is the _local_planner_ from the [PX4/PX4-Avoidance](https://github.com/PX4/PX4-Avoidance) repo. +This repository is archived/no longer maintained. For more information on hardware and software setup see: [PX4/PX4-Avoidance > Run on Hardware](https://github.com/PX4/PX4-Avoidance#run-on-hardware). From c00cf72988cca6cba9e0f715b6ba3b4340a7b4b5 Mon Sep 17 00:00:00 2001 From: Claudio Chies Date: Fri, 6 Sep 2024 10:54:58 +0200 Subject: [PATCH 03/11] added releases --- en/releases/main.md | 1 + 1 file changed, 1 insertion(+) diff --git a/en/releases/main.md b/en/releases/main.md index 071146cc04ac..e430bd63cde5 100644 --- a/en/releases/main.md +++ b/en/releases/main.md @@ -75,6 +75,7 @@ Please continue reading for [upgrade instructions](#upgrade-guide). ### Multi-Rotor - Allow system-default [multicopter orbit mode](../flight_modes_mc/orbit.md) yaw behaviour to be configured, using the parameter [MC_ORBIT_YAW_MOD](../advanced_config/parameter_reference.md#MC_ORBIT_YAW_MOD) ([PX4-Autopilot#23358](https://github.com/PX4/PX4-Autopilot/pull/23358)) +- Adapted the [Collision Prevention](../computer_vision/collision_prevention.md) Implementation to work in the default manual flight mode (Acceleration Based) [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) ### VTOL From 050d7b7c4099fed8c74d387e30329c7db15631bc Mon Sep 17 00:00:00 2001 From: Claudio Chies <61051109+Claudio-Chies@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:23:28 +0100 Subject: [PATCH 04/11] CollisionPrevention: updated docs to reflect the change --- .../collision_prevention/scalefactor.png | Bin 0 -> 31258 bytes de/releases/main.md | 1 + en/computer_vision/collision_prevention.md | 58 ++++++++++++++---- 3 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 assets/computer_vision/collision_prevention/scalefactor.png diff --git a/assets/computer_vision/collision_prevention/scalefactor.png b/assets/computer_vision/collision_prevention/scalefactor.png new file mode 100644 index 0000000000000000000000000000000000000000..7e704acafdd53b394f909c2b18cc0564aa116d9d GIT binary patch literal 31258 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

)oqWI24PrUxwXH0RC{w+}wPaLU920XoH+@S$+W$ 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 literal 0 HcmV?d00001 diff --git a/de/releases/main.md b/de/releases/main.md index 2a17e2b07754..f934401a522f 100644 --- a/de/releases/main.md +++ b/de/releases/main.md @@ -70,6 +70,7 @@ Please continue reading for [upgrade instructions](#upgrade-guide). ### Multi-Rotor - Allow system-default [multicopter orbit mode](../flight_modes_mc/orbit.md) yaw behaviour to be configured, using the parameter [MC_ORBIT_YAW_MOD](../advanced_config/parameter_reference.md#MC_ORBIT_YAW_MOD) ([PX4-Autopilot#23358](https://github.com/PX4/PX4-Autopilot/pull/23358)) +- [Colision Prevention](../computer_vision/collision_prevention.md) rewrite for Manual Flight Modes. [PX4-Autopilot#23507](https://github.com/PX4/PX4-Autopilot/pull/23507) ### VTOL diff --git a/en/computer_vision/collision_prevention.md b/en/computer_vision/collision_prevention.md index 6047ded3ea10..9cf72bf79b44 100644 --- a/en/computer_vision/collision_prevention.md +++ b/en/computer_vision/collision_prevention.md @@ -30,7 +30,6 @@ The vehicle restricts the current velocity in order to slow down as it gets clos In order to move away from (or parallel to) an obstacle, the user must command the vehicle to move toward a setpoint that does not bring the vehicle closer to the obstacle. The algorithm will make minor adjustments to the setpoint direction if it is determined that a "better" setpoint exists within a fixed margin on either side of the requested setpoint. -Users are notified through _QGroundControl_ while _Collision Prevention_ is actively controlling velocity setpoints. PX4 software setup is covered in the next section. If you are using a distance sensor attached to your flight controller for collision prevention, it will need to be attached and configured as described in [PX4 Distance Sensor](#rangefinder). @@ -46,23 +45,29 @@ Configure collision prevention by [setting the following parameters](../advanced | [CP_DELAY](../advanced_config/parameter_reference.md#CP_DELAY) | Set the sensor and velocity setpoint tracking delay. See [Delay Tuning](#delay_tuning) below. | | [CP_GUIDE_ANG](../advanced_config/parameter_reference.md#CP_GUIDE_ANG) | Set the angle (to both sides of the commanded direction) within which the vehicle may deviate if it finds fewer obstacles in that direction. See [Guidance Tuning](#angle_change_tuning) below. | | [CP_GO_NO_DATA](../advanced_config/parameter_reference.md#CP_GO_NO_DATA) | Set to 1 to allow the vehicle to move in directions where there is no sensor coverage (default is 0/`False`). | -| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Set to `Acceleration based` (default), Implementation in `Direct velocity` or `Smoothed velocity` has been removed. | +| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Make sure the default `Acceleration based` is used, Implementation in `Direct velocity` or `Smoothed velocity` has been removed. | ## Algorithm Description -The data from all sensors are fused into an internal representation of 36 sectors around the vehicle, each containing either the sensor data and information about when it was last observed, or an indication that no data for the sector was available. -When the vehicle is commanded to move in a particular direction, all sectors in the hemisphere of that direction are checked to see if the movement will bring the vehicle closer to any obstacles. -If so, the vehicle velocity is restricted. +The data from all sensors are fused into an internal representation of 72 sectors around the vehicle, each containing either the sensor data and information about when it was last observed, or an indication that no data for the sector was available. +When the vehicle is commanded to move in a particular direction, all sectors in the hemisphere of that direction are checked to see if the movement will bring the vehicle closer than allowed to any obstacles. If so, the vehicle velocity is restricted. -This velocity restriction takes into account both the inner velocity loop tuned by [MPC_XY_P](../advanced_config/parameter_reference.md#MPC_XY_P), as well as the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). -The velocity is restricted such that the vehicle will stop in time to maintain the distance specified in [CP_DIST](#CP_DIST). -The range of the sensors for each sector is also taken into account, limiting the velocity via the same mechanism. -the restricted velocity is then transformed into an acceleration with [MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC). +The Algorithm then can be split intwo two parts, the constraining of the acceleration setpoint coming from the operator, and the compensation of the current velocity of the vehicle. ::: info -If there is no sensor data in a particular direction, velocity in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). +If there is no sensor data in a particular direction, movement in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). If you wish to move freely into directions without sensor coverage, this can be enabled by setting [CP_GO_NO_DATA](#CP_GO_NO_DATA) to 1. ::: +### Acceleration Constraining +For this we split out Acceleration Setpoint into two components, one parallel to the closest distance to the obstacle and one normal to it. Then we scale each of these components according the the figure below. + ![Scalefactor](../../assets/computer_vision/collision_prevention/scalefactor.png) + + +### Velocity compensation + + This velocity restriction takes into account the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). Whereby + The current velocity is compared with the maximum allowed velocity so that we are still able to break based on the maximal allowed jerk, acceleration and delay. from this we are able to use the proportional gain of the acceleration controller([MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC)) to transform it into an acceleration. + ### Delay The delay associated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. This should be [tuned](#delay_tuning) to the specific vehicle. @@ -202,6 +207,33 @@ The diagram below shows how the simulation looks when viewed in Gazebo. ![RViz image of collision detection using the x500_lidar_2d model in Gazebo](../../assets/simulation/gazebo/vehicles/x500_lidar_2d_viz.png) - - - + + \ No newline at end of file From a75a18f04adfe461a368c54eb1c00a0a460e53b7 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 14 Nov 2024 09:08:04 +1100 Subject: [PATCH 05/11] Remove avoidance project info and prettier --- en/computer_vision/collision_prevention.md | 34 +++++++++------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/en/computer_vision/collision_prevention.md b/en/computer_vision/collision_prevention.md index 9cf72bf79b44..c700f69d23a8 100644 --- a/en/computer_vision/collision_prevention.md +++ b/en/computer_vision/collision_prevention.md @@ -30,7 +30,6 @@ The vehicle restricts the current velocity in order to slow down as it gets clos In order to move away from (or parallel to) an obstacle, the user must command the vehicle to move toward a setpoint that does not bring the vehicle closer to the obstacle. The algorithm will make minor adjustments to the setpoint direction if it is determined that a "better" setpoint exists within a fixed margin on either side of the requested setpoint. - PX4 software setup is covered in the next section. If you are using a distance sensor attached to your flight controller for collision prevention, it will need to be attached and configured as described in [PX4 Distance Sensor](#rangefinder). If you are using a companion computer to provide obstacle information see [companion setup](#companion). @@ -45,7 +44,7 @@ Configure collision prevention by [setting the following parameters](../advanced | [CP_DELAY](../advanced_config/parameter_reference.md#CP_DELAY) | Set the sensor and velocity setpoint tracking delay. See [Delay Tuning](#delay_tuning) below. | | [CP_GUIDE_ANG](../advanced_config/parameter_reference.md#CP_GUIDE_ANG) | Set the angle (to both sides of the commanded direction) within which the vehicle may deviate if it finds fewer obstacles in that direction. See [Guidance Tuning](#angle_change_tuning) below. | | [CP_GO_NO_DATA](../advanced_config/parameter_reference.md#CP_GO_NO_DATA) | Set to 1 to allow the vehicle to move in directions where there is no sensor coverage (default is 0/`False`). | -| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Make sure the default `Acceleration based` is used, Implementation in `Direct velocity` or `Smoothed velocity` has been removed. | +| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Make sure the default `Acceleration based` is used, Implementation in `Direct velocity` or `Smoothed velocity` has been removed. | ## Algorithm Description @@ -58,16 +57,20 @@ The Algorithm then can be split intwo two parts, the constraining of the acceler If there is no sensor data in a particular direction, movement in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). If you wish to move freely into directions without sensor coverage, this can be enabled by setting [CP_GO_NO_DATA](#CP_GO_NO_DATA) to 1. ::: + ### Acceleration Constraining + For this we split out Acceleration Setpoint into two components, one parallel to the closest distance to the obstacle and one normal to it. Then we scale each of these components according the the figure below. - ![Scalefactor](../../assets/computer_vision/collision_prevention/scalefactor.png) +![Scalefactor](../../assets/computer_vision/collision_prevention/scalefactor.png) + ### Velocity compensation - This velocity restriction takes into account the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). Whereby - The current velocity is compared with the maximum allowed velocity so that we are still able to break based on the maximal allowed jerk, acceleration and delay. from this we are able to use the proportional gain of the acceleration controller([MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC)) to transform it into an acceleration. - ### Delay +This velocity restriction takes into account the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). Whereby +The current velocity is compared with the maximum allowed velocity so that we are still able to break based on the maximal allowed jerk, acceleration and delay. from this we are able to use the proportional gain of the acceleration controller([MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC)) to transform it into an acceleration. + +### Delay The delay associated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. This should be [tuned](#delay_tuning) to the specific vehicle. @@ -174,23 +177,15 @@ Please contribute back your changes! ## Companion Setup {#companion} +::: warning +The companion implementation/setup is currently untested (the original companion project was unmaintained and has been archived). +::: + If using a companion computer or external sensor, it needs to supply a stream of [OBSTACLE_DISTANCE](https://mavlink.io/en/messages/common.html#OBSTACLE_DISTANCE) messages, which should reflect when and where obstacle were detected. The minimum rate at which messages _must_ be sent depends on vehicle speed - at higher rates the vehicle will have a longer time to respond to detected obstacles. - -::: info Initial testing of the system used a vehicle moving at 4 m/s with `OBSTACLE_DISTANCE` messages being emitted at 10Hz (the maximum rate supported by the vision system). The system may work well at significantly higher speeds and lower frequency distance updates. -::: - -The tested companion software is the _local_planner_ from the [PX4/PX4-Avoidance](https://github.com/PX4/PX4-Avoidance) repo. -This repository is archived/no longer maintained. -For more information on hardware and software setup see: [PX4/PX4-Avoidance > Run on Hardware](https://github.com/PX4/PX4-Avoidance#run-on-hardware). - - - -The hardware and software should be set up as described in the [PX4/PX4-Avoidance](https://github.com/PX4/PX4-Avoidance) repo. -In order to emit `OBSTACLE_DISTANCE` messages you must use the _rqt_reconfigure_ tool and set the parameter `send_obstacles_fcu` to true. ## Gazebo Simulation @@ -207,7 +202,6 @@ The diagram below shows how the simulation looks when viewed in Gazebo. ![RViz image of collision detection using the x500_lidar_2d model in Gazebo](../../assets/simulation/gazebo/vehicles/x500_lidar_2d_viz.png) - \ No newline at end of file +plt.show() --> From 9427167dd225a78ec5469a468fc434d8c0976639 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 14 Nov 2024 10:07:09 +1100 Subject: [PATCH 06/11] Rewrite to be attached-rangefinder centric --- en/computer_vision/collision_prevention.md | 195 +++++++++++---------- 1 file changed, 103 insertions(+), 92 deletions(-) diff --git a/en/computer_vision/collision_prevention.md b/en/computer_vision/collision_prevention.md index c700f69d23a8..fd73a68fa36f 100644 --- a/en/computer_vision/collision_prevention.md +++ b/en/computer_vision/collision_prevention.md @@ -1,98 +1,101 @@ # Collision Prevention _Collision Prevention_ may be used to automatically slow and stop a vehicle before it can crash into an obstacle. +It can be enabled for multicopter vehicles when using acceleration-based [Position mode](../flight_modes_mc/position.md). -It can be enabled for multicopter vehicles in [Position mode](../flight_modes_mc/position.md), and can use sensor data from an offboard companion computer, offboard rangefinders over MAVLink, a rangefinder attached to the flight controller, or any combination of the above. +## Overview -Collision prevention may restrict vehicle maximum speed if the sensor range isn't large enough! -It also prevents motion in directions where no sensor data is available (i.e. if you have no rear-sensor data, you will not be able to fly backwards). +The vehicle restricts the current velocity in order to slow down as it gets closer to obstacles and adapts the acceleration setpoint in order to disallow collision trajectories. +In order to move away from (or parallel to) an obstacle, the user must command the vehicle to move toward a setpoint that does not bring the vehicle closer to the obstacle. +The algorithm will make minor adjustments to the setpoint direction if it is determined that a "better" setpoint exists within a fixed margin on either side of the requested setpoint. -:::tip -If high flight speeds are critical, consider disabling collision prevention when not needed. -::: +Collision prevention prevents motion in directions where no sensor data is available (i.e. if you have no rear-sensor data, you will not be able to fly backwards). +It may also restrict vehicle maximum speed if the sensor range isn't large enough! -:::tip -Ensure that you have sensors/sensor data in all directions that you want to fly (when collision prevention is enabled). -::: +Multiple sensors can be used to get information about, and prevent collisions with, objects _around_ the vehicle. +If multiple sources supply data for the _same_ orientation, the system uses the data that reports the smallest distance to an object. -## Overview +The feature requires obstacle information from a [distance sensor](../sensor/rangefinders.md). +The sensor may be connected to the flight controller (recommended). +It can also be used with distance information provided by an external system via MAVLink, but this is currently untested (see [companion setup](#companion) below). -_Collision Prevention_ is enabled on PX4 by setting the parameter for minimum allowed approach distance ([CP_DIST](#CP_DIST)). +The [rangefinders](#rangefinder) that have been tested when directly connected to PX4 are listed below, along with setup instructions. +The [PX4 Configuration](#px4-configuration) specific to collision-prevention is the same for all sensors and independent of whether data is provided by a connected sensor or MAVLink. -The feature requires obstacle information from an external system (sent using the MAVLink [OBSTACLE_DISTANCE](https://mavlink.io/en/messages/common.html#OBSTACLE_DISTANCE) message) and/or a [distance sensor](../sensor/rangefinders.md) connected to the flight controller. +:::tip + +- If high flight speeds are critical, consider disabling collision prevention when not needed. +- Ensure that you have sensors/sensor data in all directions that you want to fly, including backwards (when collision prevention is enabled). -::: info -Multiple sensors can be used to get information about, and prevent collisions with, objects _around_ the vehicle. -If multiple sources supply data for the _same_ orientation, the system uses the data that reports the smallest distance to an object. ::: -The vehicle restricts the current velocity in order to slow down as it gets closer to obstacles and adapts the acceleration setpoint in order to disallow collision trajectories. -In order to move away from (or parallel to) an obstacle, the user must command the vehicle to move toward a setpoint that does not bring the vehicle closer to the obstacle. -The algorithm will make minor adjustments to the setpoint direction if it is determined that a "better" setpoint exists within a fixed margin on either side of the requested setpoint. +## Supported Rangefinders {#rangefinder} -PX4 software setup is covered in the next section. -If you are using a distance sensor attached to your flight controller for collision prevention, it will need to be attached and configured as described in [PX4 Distance Sensor](#rangefinder). -If you are using a companion computer to provide obstacle information see [companion setup](#companion). +Collision Prevention has been tested with the following rangefinders attached to PX4 (not for providing data [supplied over MAVLink](#companion)). -## PX4 (Software) Setup +### Lanbao PSK-CM8JL65-CC5 -Configure collision prevention by [setting the following parameters](../advanced_config/parameters.md) in _QGroundControl_: +At time of writing PX4 allows you to use the [Lanbao PSK-CM8JL65-CC5](../sensor/cm8jl65_ir_distance_sensor.md) IR distance sensor for collision prevention "out of the box", with minimal additional configuration: -| Parameter | Description | -| -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [CP_DIST](../advanced_config/parameter_reference.md#CP_DIST) | Set the minimum allowed distance (the closest distance that the vehicle can approach the obstacle). Set negative to disable _collision prevention_.
> **Warning** This value is the distance to the sensors, not the outside of your vehicle or propellers. Be sure to leave a safe margin! | -| [CP_DELAY](../advanced_config/parameter_reference.md#CP_DELAY) | Set the sensor and velocity setpoint tracking delay. See [Delay Tuning](#delay_tuning) below. | -| [CP_GUIDE_ANG](../advanced_config/parameter_reference.md#CP_GUIDE_ANG) | Set the angle (to both sides of the commanded direction) within which the vehicle may deviate if it finds fewer obstacles in that direction. See [Guidance Tuning](#angle_change_tuning) below. | -| [CP_GO_NO_DATA](../advanced_config/parameter_reference.md#CP_GO_NO_DATA) | Set to 1 to allow the vehicle to move in directions where there is no sensor coverage (default is 0/`False`). | -| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Make sure the default `Acceleration based` is used, Implementation in `Direct velocity` or `Smoothed velocity` has been removed. | +1. [Attach and configure the sensor](../sensor/cm8jl65_ir_distance_sensor.md). +1. Set the sensor orientation using [SENS_CM8JL65_R_0](../advanced_config/parameter_reference.md#SENS_CM8JL65_R_0). +1. [Configure and enable collision prevention](#px4-configuration) -## Algorithm Description +### LightWare LiDAR SF45 Rotating Lidar -The data from all sensors are fused into an internal representation of 72 sectors around the vehicle, each containing either the sensor data and information about when it was last observed, or an indication that no data for the sector was available. -When the vehicle is commanded to move in a particular direction, all sectors in the hemisphere of that direction are checked to see if the movement will bring the vehicle closer than allowed to any obstacles. If so, the vehicle velocity is restricted. +PX4 v1.14 (and later) supports the [LightWare LiDAR SF45](https://www.lightwarelidar.com/shop/sf45-b-50-m/) rotating lidar which provides 320 degree sensing. -The Algorithm then can be split intwo two parts, the constraining of the acceleration setpoint coming from the operator, and the compensation of the current velocity of the vehicle. +The SF45 must be connected via a UART/serial port and configured as described below: -::: info -If there is no sensor data in a particular direction, movement in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). -If you wish to move freely into directions without sensor coverage, this can be enabled by setting [CP_GO_NO_DATA](#CP_GO_NO_DATA) to 1. -::: +1. [LightWare Studio](https://www.lightwarelidar.com/resources-software) configuration: -### Acceleration Constraining + - In the LightWare Studio app enable scanning, set the scan angle, and change the baud rate to `921600`. -For this we split out Acceleration Setpoint into two components, one parallel to the closest distance to the obstacle and one normal to it. Then we scale each of these components according the the figure below. -![Scalefactor](../../assets/computer_vision/collision_prevention/scalefactor.png) +1. Add [lightware_sf45_serial](../modules/modules_driver_distance_sensor.md#lightware-sf45-serial) driver to PX4 firmware: - + 1. Open [menuconfig](../hardware/porting_guide_config.md#px4-menuconfig-setup) + 1. Under **drivers > Distance sensors** select `lightware_sf45_serial`. + 1. Recompile and upload to the flight controller. -### Velocity compensation +1. [Set the following parameters](../advanced_config/parameters.md) via QGC to configure the driver: -This velocity restriction takes into account the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). Whereby -The current velocity is compared with the maximum allowed velocity so that we are still able to break based on the maximal allowed jerk, acceleration and delay. from this we are able to use the proportional gain of the acceleration controller([MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC)) to transform it into an acceleration. + - [SENS_EN_SF45_CFG](../advanced_config/parameter_reference.md#SENS_EN_SF45_CFG): Set to the serial port you have the sensor connected to. + Make sure GPS or Telemetry are not enabled on this port. + - [SF45_ORIENT_CFG](../advanced_config/parameter_reference.md#SF45_ORIENT_CFG): Set the orientation of the sensor (facing up or down) + - [SF45_UPDATE_CFG](../advanced_config/parameter_reference.md#SF45_UPDATE_CFG): Set the update rate + - [SF45_YAW_CFG](../advanced_config/parameter_reference.md#SF45_YAW_CFG): Set the yaw orientation -### Delay +1. [Configure and enable collision prevention](#px4-configuration) -The delay associated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. -This should be [tuned](#delay_tuning) to the specific vehicle. +PX4 will emit the [OBSTACLE_DISTANCE](https://mavlink.io/en/messages/common.html#OBSTACLE_DISTANCE) message when collision prevention is enabled. +In QGroundControl you should this in the [MAVLink console](../debug/mavlink_shell.md#qgroundcontrol-mavlink-console) if collision prevention is configured correctly and active. -If the sectors adjacent to the commanded sectors are 'better' by a significant margin, the direction of the requested input can be modified by up to the angle specified in [CP_GUIDE_ANG](#CP_GUIDE_ANG). -This helps to fine-tune user input to 'guide' the vehicle around obstacles rather than getting stuck against them. +The obstacle overlay in QGC will look like this: -### Range Data Loss +![sf45](../../assets/sf45/sf45_obstacle_map.png) -If the autopilot does not receive range data from any sensor for longer than 0.5s, it will output a warning _No range data received, no movement allowed_. -This will force the velocity setpoints in xy to zero. -After 5 seconds of not receiving any data, the vehicle will switch into [HOLD mode](../flight_modes_mc/hold.md). -If you want the vehicle to be able to move again, you will need to disable Collision Prevention by either setting the parameter [CP_DIST](#CP_DIST) to a negative value, or switching to a mode other than [Position mode](../flight_modes_mc/position.md) (e.g. to _Altitude mode_ or _Stabilized mode_). +### Other Rangefinders -If you have multiple sensors connected and you lose connection to one of them, you will still be able to fly inside the field of view (FOV) of the reporting sensors. -The data of the faulty sensor will expire and the region covered by this sensor will be treated as uncovered, meaning you will not be able to move there. +Other sensors may be enabled, but this requires modification of driver code to set the sensor orientation and field of view. -:::warning -Be careful when enabling [CP_GO_NO_DATA=1](#CP_GO_NO_DATA), which allows the vehicle to fly outside the area with sensor coverage. -If you lose connection to one of multiple sensors, the area covered by the faulty sensor is also treated as uncovered and you will be able to move there without constraint. +- Attach and configure the distance sensor on a particular port (see [sensor-specific docs](../sensor/rangefinders.md)) and enable collision prevention using [CP_DIST](#CP_DIST). +- Modify the driver to set the orientation. + This should be done by mimicking the `SENS_CM8JL65_R_0` parameter (though you might also hard-code the orientation in the sensor _module.yaml_ file to something like `sf0x start -d ${SERIAL_DEV} -R 25` - where 25 is equivalent to `ROTATION_DOWNWARD_FACING`). +- Modify the driver to set the _field of view_ in the distance sensor UORB topic (`distance_sensor_s.h_fov`). + +:::tip +You can see the required modifications from the [feature PR](https://github.com/PX4/PX4-Autopilot/pull/12179). +Please contribute back your changes! ::: +## PX4 Configuration + +_Collision Prevention_ is enabled on PX4 by [setting the parameter](../advanced_config/parameters.md) for minimum allowed approach distance in QGroundControl to a positive value ([CP_DIST](#CP_DIST)). +Note that this value is the distance to the sensors, not the outside of your vehicle or propellers (set a safe margin!). + +In addition you will need to tune the [sendor delay](#delay_tuning) and [angle change tuning](#angle_change_tuning). +You may choose to enable [CP_GO_NO_DATA](#CP_GO_NO_DATA) in order to allow unprotected movement in directions where there is no rangefinder data/sensor. + ### CP_DELAY Delay Tuning {#delay_tuning} There are two main sources of delay which should be accounted for: _sensor delay_, and vehicle _velocity setpoint tracking delay_. @@ -124,55 +127,63 @@ The guidance feature will never direct the vehicle in a direction without sensor If the vehicle feels 'stuck' with only a single distance sensor pointing forwards, this is probably because the guidance cannot safely adapt the direction due to lack of information. ::: -## PX4 Distance Sensor {#rangefinder} +### Parameters -### Lanbao PSK-CM8JL65-CC5 +All relevant parameters are listed below: -At time of writing PX4 allows you to use the [Lanbao PSK-CM8JL65-CC5](../sensor/cm8jl65_ir_distance_sensor.md) IR distance sensor for collision prevention "out of the box", with minimal additional configuration: +| Parameter | Description | +| -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [CP_DIST](../advanced_config/parameter_reference.md#CP_DIST) | Minimum allowed distance from the sensor (the closest distance that the vehicle can approach the obstacle). Set negative to _disable_ collision prevention. | +| [CP_DELAY](../advanced_config/parameter_reference.md#CP_DELAY) | Sensor and velocity setpoint tracking delay. See [Delay Tuning](#delay_tuning) below. | +| [CP_GUIDE_ANG](../advanced_config/parameter_reference.md#CP_GUIDE_ANG) | Angle (to both sides of the commanded direction) within which the vehicle may deviate if it finds fewer obstacles in that direction. See [Guidance Tuning](#angle_change_tuning) below. | +| [CP_GO_NO_DATA](../advanced_config/parameter_reference.md#CP_GO_NO_DATA) | Set to `1` to allow the vehicle to move in directions where there is no sensor coverage (default is 0/`False`). | +| [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) | Set to `Acceleration based` (default). Collision prevention is disabled for `Direct velocity` and `Smoothed velocity`. | + +## Algorithm Description -- First [attach and configure the sensor](../sensor/cm8jl65_ir_distance_sensor.md), and enable collision prevention (as described above, using [CP_DIST](#CP_DIST)). -- Set the sensor orientation using [SENS_CM8JL65_R_0](../advanced_config/parameter_reference.md#SENS_CM8JL65_R_0). +The data from all sensors are fused into an internal representation of 72 sectors around the vehicle, each containing either the sensor data and information about when it was last observed, or an indication that no data for the sector was available. +When the vehicle is commanded to move in a particular direction, all sectors in the hemisphere of that direction are checked to see if the movement will bring the vehicle closer than allowed to any obstacles. If so, the vehicle velocity is restricted. -### LightWare LiDAR SF45 Rotating Lidar +The Algorithm then can be split intwo two parts, the constraining of the acceleration setpoint coming from the operator, and the compensation of the current velocity of the vehicle. -PX4 v1.14 (and later) supports the [LightWare LiDAR SF45](https://www.lightwarelidar.com/shop/sf45-b-50-m/) rotating lidar which provides 320 degree sensing. +::: info +If there is no sensor data in a particular direction, movement in that direction is restricted to 0 (preventing the vehicle from crashing into unseen objects). +If you wish to move freely into directions without sensor coverage, this can be enabled by setting [CP_GO_NO_DATA](#CP_GO_NO_DATA) to 1. +::: -The SF45 must be connected via a UART/serial port and configured as described below (In addition to the [collision prevention setup](#px4-software-setup)). +### Acceleration Constraining -[LightWare Studio](https://www.lightwarelidar.com/resources-software) configuration: +For this we split out Acceleration Setpoint into two components, one parallel to the closest distance to the obstacle and one normal to it. Then we scale each of these components according the the figure below. +![Scalefactor](../../assets/computer_vision/collision_prevention/scalefactor.png) -- In the LightWare Studio app enable scanning, set the scan angle, and change the baud rate to `921600`. + -PX4 Configuration: +### Velocity compensation -- Add the [lightware_sf45_serial](../modules/modules_driver_distance_sensor.md#lightware-sf45-serial) driver in [menuconfig](../hardware/porting_guide_config.md#px4-menuconfig-setup): - - Under **drivers > Distance sensors** select `lightware_sf45_serial`. - - Recompile and upload to the flight controller. -- [Set the following parameters](../advanced_config/parameters.md) via QGC: - - [SENS_EN_SF45_CFG](../advanced_config/parameter_reference.md#SENS_EN_SF45_CFG): Set to the serial port you have the sensor connected to. - Make sure GPS or Telemetry are not enabled on this port. - - [SF45_ORIENT_CFG](../advanced_config/parameter_reference.md#SF45_ORIENT_CFG): Set the orientation of the sensor (facing up or down) - - [SF45_UPDATE_CFG](../advanced_config/parameter_reference.md#SF45_UPDATE_CFG): Set the update rate - - [SF45_YAW_CFG](../advanced_config/parameter_reference.md#SF45_YAW_CFG): Set the yaw orientation +This velocity restriction takes into account the [jerk-optimal velocity controller](../config_mc/mc_jerk_limited_type_trajectory.md) via [MPC_JERK_MAX](../advanced_config/parameter_reference.md#MPC_JERK_MAX) and [MPC_ACC_HOR](../advanced_config/parameter_reference.md#MPC_ACC_HOR). Whereby +The current velocity is compared with the maximum allowed velocity so that we are still able to break based on the maximal allowed jerk, acceleration and delay. from this we are able to use the proportional gain of the acceleration controller([MPC_XY_VEL_P_ACC](../advanced_config/parameter_reference.md#MPC_XY_VEL_P_ACC)) to transform it into an acceleration. -In QGroundControl you should see an [OBSTACLE_DISTANCE](https://mavlink.io/en/messages/common.html#OBSTACLE_DISTANCE) message in the [MAVLink console](../debug/mavlink_shell.md#qgroundcontrol-mavlink-console) if collision prevention is configured correctly and active. +### Delay -The obstacle overlay in QGC will look like this: +The delay associated with collision prevention, both in the vehicle tracking velocity setpoints and in receiving sensor data from external sources, is conservatively estimated via the [CP_DELAY](#CP_DELAY) parameter. +This should be [tuned](#delay_tuning) to the specific vehicle. -![sf45](../../assets/sf45/sf45_obstacle_map.png) +If the sectors adjacent to the commanded sectors are 'better' by a significant margin, the direction of the requested input can be modified by up to the angle specified in [CP_GUIDE_ANG](#CP_GUIDE_ANG). +This helps to fine-tune user input to 'guide' the vehicle around obstacles rather than getting stuck against them. -### Rangefinder Support +### Range Data Loss -Other sensors may be enabled, but this requires modification of driver code to set the sensor orientation and field of view. +If the autopilot does not receive range data from any sensor for longer than 0.5s, it will output a warning _No range data received, no movement allowed_. +This will force the velocity setpoints in xy to zero. +After 5 seconds of not receiving any data, the vehicle will switch into [HOLD mode](../flight_modes_mc/hold.md). +If you want the vehicle to be able to move again, you will need to disable Collision Prevention by either setting the parameter [CP_DIST](#CP_DIST) to a negative value, or switching to a mode other than [Position mode](../flight_modes_mc/position.md) (e.g. to _Altitude mode_ or _Stabilized mode_). -- Attach and configure the distance sensor on a particular port (see [sensor-specific docs](../sensor/rangefinders.md)) and enable collision prevention using [CP_DIST](#CP_DIST). -- Modify the driver to set the orientation. - This should be done by mimicking the `SENS_CM8JL65_R_0` parameter (though you might also hard-code the orientation in the sensor _module.yaml_ file to something like `sf0x start -d ${SERIAL_DEV} -R 25` - where 25 is equivalent to `ROTATION_DOWNWARD_FACING`). -- Modify the driver to set the _field of view_ in the distance sensor UORB topic (`distance_sensor_s.h_fov`). +If you have multiple sensors connected and you lose connection to one of them, you will still be able to fly inside the field of view (FOV) of the reporting sensors. +The data of the faulty sensor will expire and the region covered by this sensor will be treated as uncovered, meaning you will not be able to move there. -:::tip -You can see the required modifications from the [feature PR](https://github.com/PX4/PX4-Autopilot/pull/12179). -Please contribute back your changes! +:::warning +Be careful when enabling [CP_GO_NO_DATA=1](#CP_GO_NO_DATA), which allows the vehicle to fly outside the area with sensor coverage. +If you lose connection to one of multiple sensors, the area covered by the faulty sensor is also treated as uncovered and you will be able to move there without constraint. ::: ## Companion Setup {#companion} From e084ef8f74b522c31171304e936717ad089a1ac8 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 14 Nov 2024 10:10:47 +1100 Subject: [PATCH 07/11] Update en/releases/main.md --- en/releases/main.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/releases/main.md b/en/releases/main.md index e430bd63cde5..f0c466b942bd 100644 --- a/en/releases/main.md +++ b/en/releases/main.md @@ -75,7 +75,7 @@ Please continue reading for [upgrade instructions](#upgrade-guide). ### Multi-Rotor - Allow system-default [multicopter orbit mode](../flight_modes_mc/orbit.md) yaw behaviour to be configured, using the parameter [MC_ORBIT_YAW_MOD](../advanced_config/parameter_reference.md#MC_ORBIT_YAW_MOD) ([PX4-Autopilot#23358](https://github.com/PX4/PX4-Autopilot/pull/23358)) -- Adapted the [Collision Prevention](../computer_vision/collision_prevention.md) Implementation to work in the default manual flight mode (Acceleration Based) [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE) +- Adapted the [Collision Prevention](../computer_vision/collision_prevention.md) implementation to work in the default manual flight mode (Acceleration Based) [MPC_POS_MODE](../advanced_config/parameter_reference.md#MPC_POS_MODE). ### VTOL From 6488c5296d457fabfe105f0aba8e399a1893c63f Mon Sep 17 00:00:00 2001 From: Claudio Chies <61051109+Claudio-Chies@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:22:44 +0100 Subject: [PATCH 08/11] improved map documentation --- .../obstacle_distance_def.svg | 1523 +++++++++++++++++ en/computer_vision/collision_prevention.md | 23 + 2 files changed, 1546 insertions(+) create mode 100644 assets/computer_vision/collision_prevention/obstacle_distance_def.svg diff --git a/assets/computer_vision/collision_prevention/obstacle_distance_def.svg b/assets/computer_vision/collision_prevention/obstacle_distance_def.svg new file mode 100644 index 000000000000..3538a31ce96b --- /dev/null +++ b/assets/computer_vision/collision_prevention/obstacle_distance_def.svg @@ -0,0 +1,1523 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/en/computer_vision/collision_prevention.md b/en/computer_vision/collision_prevention.md index fd73a68fa36f..0a0a4129c85b 100644 --- a/en/computer_vision/collision_prevention.md +++ b/en/computer_vision/collision_prevention.md @@ -213,6 +213,29 @@ The diagram below shows how the simulation looks when viewed in Gazebo. ![RViz image of collision detection using the x500_lidar_2d model in Gazebo](../../assets/simulation/gazebo/vehicles/x500_lidar_2d_viz.png) +## Technical Documentation regarding Sensor Data + +The Collision Prevention has an internal [`obstacle_distance`](../msg_docs/ObstacleDistance.md) map, dividing the plane around the drone into 72 Sectors. +When adding new sensor data to the map, it will compare the existing map with the new data, and add it to the map. +There we have to differentiate between rangefinders and `obstacle_distance` messages. +### Rangefinders +Rangefinders add their data via the [`distance_sensor`](../msg_docs/DistanceSensor.md) message. +all sectors which have any overlap with the orientation (`orientation` and `q`)of the rangefinder, and the horizontal field of view (`h_fov`) are assigned that measurement value. + +::: info +the quaternion `q` is only used if the `orientation` is set to `ROTATION_CUSTOM` +::: + +E.g a distance sensor measuring from 9.99° to 10.01° the measurements will get added to the bin's corresponding to 5° and 10° covering the arc from 2.5° and 12.5° + +### Rotary Lidars or onboard Computers +Rotary Lidars or onboard Computers add their data via the [`obstacle_distance`](../msg_docs/ObstacleDistance.md) message. +Collision Prevention then checks if there are any overlaps between the sectors containing distance data and the internal obstacle map, and adds the data if there is overlap. + +The angles in the obstacle_distance message are defined as follows: + +![Obstacle_Distance Angles](../../assets/computer_vision/collision_prevention/obstacle_distance_def.svg) +