From aab67c06f30c379c8dd24d61f092081a5dabaa4c Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 23 Mar 2017 15:22:03 +0100 Subject: [PATCH 01/11] in void calculate_edge_displacement, 1)corrected in/out comment 2)removed a pair of redundant {}'s --- sw/airborne/modules/computer_vision/lib/vision/edge_flow.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c index db5304603d..681e09c7c1 100644 --- a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c +++ b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c @@ -159,7 +159,7 @@ void calculate_edge_histogram(struct image_t *img, int32_t edge_histogram[], * Calculate_displacement calculates the displacement between two histograms * @param[in] *edge_histogram The edge histogram from the current frame_step * @param[in] *edge_histogram_prev The edge histogram from the previous frame_step - * @param[in] *displacement array with pixel displacement of the sequential edge histograms + * @param[out] *displacement array with pixel displacement of the sequential edge histograms * @param[in] size Indicating the size of the displacement array * @param[in] window Indicating the search window size * @param[in] disp_range Indicating the maximum disparity range for the block matching @@ -196,7 +196,6 @@ void calculate_edge_displacement(int32_t *edge_histogram, int32_t *edge_histogra if (border[0] >= border[1] || abs(der_shift) >= 10) { SHIFT_TOO_FAR = 1; } - { // TODO: replace with arm offset subtract for (x = border[0]; x < border[1]; x++) { displacement[x] = 0; @@ -211,8 +210,6 @@ void calculate_edge_displacement(int32_t *edge_histogram, int32_t *edge_histogra } else { } } - } - } /** From a75b2e82f0bfbdad078713f5bf0e26b14eee0319 Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 23 Mar 2017 15:28:38 +0100 Subject: [PATCH 02/11] in void calculate_edge_histogram, 1)IMPORTANT: corrected the index used for img_buf, the +1 caused a out of array memory address to be looked up. Also it caused wrong calculations to take place arround the borders of the image 2)removed comments that were from an old version --- .../modules/computer_vision/lib/vision/edge_flow.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c index 681e09c7c1..7921190cd3 100644 --- a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c +++ b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c @@ -122,9 +122,9 @@ void calculate_edge_histogram(struct image_t *img, int32_t edge_histogram[], sobel_sum = 0; for (c = -1; c <= 1; c++) { - idx = interlace * (image_width * y + (x + c)); // 2 for interlace + idx = interlace * (image_width * y + (x + c)); - sobel_sum += Sobel[c + 1] * (int32_t)img_buf[idx + 1]; + sobel_sum += Sobel[c + 1] * (int32_t)img_buf[idx]; } sobel_sum = abs(sobel_sum); if (sobel_sum > edge_threshold) { @@ -141,9 +141,9 @@ void calculate_edge_histogram(struct image_t *img, int32_t edge_histogram[], sobel_sum = 0; for (c = -1; c <= 1; c++) { - idx = interlace * (image_width * (y + c) + x); // 2 for interlace + idx = interlace * (image_width * (y + c) + x); - sobel_sum += Sobel[c + 1] * (int32_t)img_buf[idx + 1]; + sobel_sum += Sobel[c + 1] * (int32_t)img_buf[idx]; } sobel_sum = abs(sobel_sum); if (sobel_sum > edge_threshold) { From db6548ed675cdf248a60cdd06c8d08c1381f994f Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 23 Mar 2017 15:53:50 +0100 Subject: [PATCH 03/11] in void line_fit, fixed sumx2 by correctly removing 1*1 +2*2 etc until and including (border-1)*(border-1) --- sw/airborne/modules/computer_vision/lib/vision/edge_flow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c index 7921190cd3..351b27fbe5 100644 --- a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c +++ b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c @@ -268,7 +268,7 @@ void line_fit(int32_t *displacement, int32_t *divergence, int32_t *flow, uint32_ // compute fixed sums int32_t xend = size_int - border_int - 1; sumX = xend * (xend + 1) / 2 - border_int * (border_int + 1) / 2 + border_int; - sumX2 = xend * (xend + 1) * (2 * xend + 1) / 6; + sumX2 = xend * (xend + 1) * (2 * xend + 1) / 6 - border_int * (border_int + 1) * (2 * border_int + 1) / 6 + border_int*border_int; xMean = (size_int - 1) / 2; count = size_int - 2 * border_int; From 2195de3af822ade437be2f1527d9065a0e11418e Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 23 Mar 2017 15:58:27 +0100 Subject: [PATCH 04/11] In void calc_edgeflow_tot, prevent segfault due to memory leak in line 445-446 by freeing the malloc'd variables properly --- .../modules/computer_vision/opticflow/opticflow_calculator.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c index 67c3a6b788..0b79ffc989 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c @@ -584,6 +584,10 @@ void calc_edgeflow_tot(struct opticflow_t *opticflow, struct opticflow_state_t * #endif // Increment and wrap current time frame current_frame_nr = (current_frame_nr + 1) % MAX_HORIZON; + + // Free malloc'd variables + free(displacement.x); + free(displacement.y); } From 14d5bfe24b46c898cbc548b57bf706e95f92bfda Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 23 Mar 2017 16:04:01 +0100 Subject: [PATCH 05/11] In void calc_edgeflow_tot, change flow_x into div_x as it is the divergence being set. --- .../modules/computer_vision/opticflow/opticflow_calculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c index 0b79ffc989..565428e15b 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c @@ -541,7 +541,7 @@ void calc_edgeflow_tot(struct opticflow_t *opticflow, struct opticflow_state_t * result->flow_der_y = result->flow_y; result->corner_cnt = getAmountPeaks(edge_hist_x, 500 , img->w); result->tracked_cnt = getAmountPeaks(edge_hist_x, 500 , img->w); - result->divergence = (float)edgeflow.flow_x / RES; + result->divergence = (float)edgeflow.div_x / RES; result->div_size = 0.0f; result->noise_measurement = 0.0f; result->surface_roughness = 0.0f; From b7e0f2e9bf963579233c43ed7271951b31b0b9c4 Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 23 Mar 2017 16:07:09 +0100 Subject: [PATCH 06/11] corrected printing of config var --- .../modules/computer_vision/opticflow/opticflow_calculator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c index 565428e15b..17e624e9c0 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c @@ -95,7 +95,7 @@ PRINT_CONFIG_VAR(OPTICFLOW_WINDOW_SIZE) #ifndef OPTICFLOW_SEARCH_DISTANCE #define OPTICFLOW_SEARCH_DISTANCE 20 #endif -PRINT_CONFIG_VAR(OPTICFLOW_MAX_SEARCH_DISTANCE) +PRINT_CONFIG_VAR(OPTICFLOW_SEARCH_DISTANCE) #ifndef OPTICFLOW_SUBPIXEL_FACTOR #define OPTICFLOW_SUBPIXEL_FACTOR 10 From 6c8fb1fbf948b3c4a3f800f0ad28ef99bb91fb37 Mon Sep 17 00:00:00 2001 From: Titus Date: Mon, 27 Mar 2017 12:45:19 +0200 Subject: [PATCH 07/11] moved the opticflow_calc_init call to opticflow_module.c and moved the LK related parts to the LK function --- .../opticflow/opticflow_calculator.c | 29 ++++++++----------- .../opticflow/opticflow_calculator.h | 2 +- .../computer_vision/opticflow_module.c | 1 + 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c index 17e624e9c0..9acb92b9a1 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c @@ -194,23 +194,9 @@ static int cmp_flow(const void *a, const void *b); /** * Initialize the opticflow calculator * @param[out] *opticflow The new optical flow calculator - * @param[in] *w The image width - * @param[in] *h The image height */ -void opticflow_calc_init(struct opticflow_t *opticflow, uint16_t w, uint16_t h) +void opticflow_calc_init(struct opticflow_t *opticflow) { - - init_median_filter(&vel_x_filt); - init_median_filter(&vel_y_filt); - - /* Create the image buffers */ - image_create(&opticflow->img_gray, w, h, IMAGE_GRAYSCALE); - image_create(&opticflow->prev_img_gray, w, h, IMAGE_GRAYSCALE); - - /* Set the previous values */ - opticflow->got_first_img = false; - FLOAT_RATES_ZERO(opticflow->prev_rates); - /* Set the default values */ opticflow->method = OPTICFLOW_METHOD; //0 = LK_fast9, 1 = Edgeflow opticflow->window_size = OPTICFLOW_WINDOW_SIZE; @@ -234,7 +220,6 @@ void opticflow_calc_init(struct opticflow_t *opticflow, uint16_t w, uint16_t h) opticflow->fast9_padding = OPTICFLOW_FAST9_PADDING; opticflow->fast9_rsize = 512; opticflow->fast9_ret_corners = malloc(sizeof(struct point_t) * opticflow->fast9_rsize); - } /** * Run the optical flow with fast9 and lukaskanade on a new image frame @@ -247,7 +232,17 @@ void calc_fast9_lukas_kanade(struct opticflow_t *opticflow, struct opticflow_sta struct opticflow_result_t *result) { if (opticflow->just_switched_method) { - opticflow_calc_init(opticflow, img->w, img->h); + // Create the image buffers + image_create(&opticflow->img_gray, img->w, img->h, IMAGE_GRAYSCALE); + image_create(&opticflow->prev_img_gray, img->w, img->h, IMAGE_GRAYSCALE); + + // Set the previous values + opticflow->got_first_img = false; + FLOAT_RATES_ZERO(opticflow->prev_rates); + + // Init median filters with zeros + init_median_filter(&vel_x_filt); + init_median_filter(&vel_y_filt); } // variables for size_divergence: diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h index 10a6805670..fa46e364a0 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h @@ -72,7 +72,7 @@ struct opticflow_t { }; -void opticflow_calc_init(struct opticflow_t *opticflow, uint16_t w, uint16_t h); +void opticflow_calc_init(struct opticflow_t *opticflow); void opticflow_calc_frame(struct opticflow_t *opticflow, struct opticflow_state_t *state, struct image_t *img, struct opticflow_result_t *result); diff --git a/sw/airborne/modules/computer_vision/opticflow_module.c b/sw/airborne/modules/computer_vision/opticflow_module.c index dcfa16d6cd..4bb6b6c90b 100644 --- a/sw/airborne/modules/computer_vision/opticflow_module.c +++ b/sw/airborne/modules/computer_vision/opticflow_module.c @@ -124,6 +124,7 @@ void opticflow_module_init(void) // Initialize the opticflow calculation opticflow_got_result = false; + opticflow_calc_init(&opticflow); cv_add_to_device(&OPTICFLOW_CAMERA, opticflow_module_calc); From d3d805d00a11b8fd2fcc286ef6a7238971a3880a Mon Sep 17 00:00:00 2001 From: Titus Date: Tue, 28 Mar 2017 11:56:25 +0200 Subject: [PATCH 08/11] 1)in vision/image.c there was an incorrect bound that caused the code to read a value outside of the buffer. 2)in vision/lucas_kanade.c there was a rounding error that caused bordervalues to still be accepted. Also when the selection of new point could be messed up by an overflow where the unsigned point - the signed flow could overflow, the result wasnt caught by the ignore check. --- .../modules/computer_vision/lib/vision/image.c | 13 +++++++------ .../computer_vision/lib/vision/lucas_kanade.c | 5 +++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/sw/airborne/modules/computer_vision/lib/vision/image.c b/sw/airborne/modules/computer_vision/lib/vision/image.c index 4f91923975..1c8b01919e 100644 --- a/sw/airborne/modules/computer_vision/lib/vision/image.c +++ b/sw/airborne/modules/computer_vision/lib/vision/image.c @@ -353,6 +353,7 @@ void pyramid_build(struct image_t *input, struct image_t *output_array, uint8_t * This outputs a subpixel window image in grayscale * Currently only works with Grayscale images as input but could be upgraded to * also support YUV422 images. + * You can and should only ask a subpixel window of a center point that is w/2 pixels away from the edges * @param[in] *input Input image (grayscale only) * @param[out] *output Window output (width and height is used to calculate the window size) * @param[in] *center Center point in subpixel coordinates @@ -369,18 +370,18 @@ void image_subpixel_window(struct image_t *input, struct image_t *output, struct // Calculate the window size uint16_t half_window = output->w / 2; - uint32_t subpixel_w = input->w * subpixel_factor; - uint32_t subpixel_h = input->h * subpixel_factor; + uint32_t subpixel_w = (input->w -2) * subpixel_factor; + uint32_t subpixel_h = (input->h -2) * subpixel_factor; // Go through the whole window size in normal coordinates for (uint16_t i = 0; i < output->w; i++) { for (uint16_t j = 0; j < output->h; j++) { // Calculate the subpixel coordinate - uint32_t x = center->x + border_size * subpixel_factor + (i - half_window) * subpixel_factor ; - uint32_t y = center->y + border_size * subpixel_factor + (j - half_window) * subpixel_factor ; + uint32_t x = center->x + border_size * subpixel_factor + (i - half_window) * subpixel_factor; + uint32_t y = center->y + border_size * subpixel_factor + (j - half_window) * subpixel_factor; - BoundUpper(x, subpixel_w - 1); - BoundUpper(y, subpixel_h - 1); + BoundUpper(x, subpixel_w); + BoundUpper(y, subpixel_h); // Calculate the original pixel coordinate uint16_t orig_x = x / subpixel_factor; diff --git a/sw/airborne/modules/computer_vision/lib/vision/lucas_kanade.c b/sw/airborne/modules/computer_vision/lib/vision/lucas_kanade.c index 7c03cc7150..25659cb0a1 100644 --- a/sw/airborne/modules/computer_vision/lib/vision/lucas_kanade.c +++ b/sw/airborne/modules/computer_vision/lib/vision/lucas_kanade.c @@ -331,8 +331,9 @@ struct flow_t *opticFlowLK_flat(struct image_t *new_img, struct image_t *old_img vectors[new_p].pos.y + vectors[new_p].flow_y }; // If the pixel is outside ROI, do not track it - if (new_point.x / subpixel_factor < half_window_size || (old_img->w - new_point.x / subpixel_factor) < half_window_size - || new_point.y / subpixel_factor < half_window_size || (old_img->h - new_point.y / subpixel_factor) < half_window_size) { + if (new_point.x / subpixel_factor < half_window_size || (old_img->w - new_point.x / subpixel_factor) <= half_window_size + || new_point.y / subpixel_factor < half_window_size || (old_img->h - new_point.y / subpixel_factor) <= half_window_size + || new_point.x / subpixel_factor > old_img->w || new_point.y / subpixel_factor > old_img->h) { tracked = FALSE; break; } From ab8cf6f6076b261f1e0aaf3f7da538696df1beda Mon Sep 17 00:00:00 2001 From: Titus Date: Thu, 30 Mar 2017 23:52:49 +0200 Subject: [PATCH 09/11] added a proper resolution parameter in EF rather than using the subpixel factor from LK --- conf/modules/cv_opticflow.xml | 2 ++ .../opticflow/opticflow_calculator.c | 13 +++++++++++-- .../opticflow/opticflow_calculator.h | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/conf/modules/cv_opticflow.xml b/conf/modules/cv_opticflow.xml index d8273e1fbc..b3b7e07c22 100644 --- a/conf/modules/cv_opticflow.xml +++ b/conf/modules/cv_opticflow.xml @@ -31,6 +31,7 @@ + @@ -58,6 +59,7 @@ + diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c index 9acb92b9a1..34ef440c5d 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.c @@ -102,6 +102,11 @@ PRINT_CONFIG_VAR(OPTICFLOW_SEARCH_DISTANCE) #endif PRINT_CONFIG_VAR(OPTICFLOW_SUBPIXEL_FACTOR) +#ifndef OPTICFLOW_RESOLUTION_FACTOR +#define OPTICFLOW_RESOLUTION_FACTOR 100 +#endif +PRINT_CONFIG_VAR(OPTICFLOW_RESOLUTION_FACTOR) + #ifndef OPTICFLOW_MAX_ITERATIONS #define OPTICFLOW_MAX_ITERATIONS 10 #endif @@ -207,6 +212,7 @@ void opticflow_calc_init(struct opticflow_t *opticflow) opticflow->max_track_corners = OPTICFLOW_MAX_TRACK_CORNERS; opticflow->subpixel_factor = OPTICFLOW_SUBPIXEL_FACTOR; + opticflow->resolution_factor = OPTICFLOW_RESOLUTION_FACTOR; opticflow->max_iterations = OPTICFLOW_MAX_ITERATIONS; opticflow->threshold_vec = OPTICFLOW_THRESHOLD_VEC; opticflow->pyramid_level = OPTICFLOW_PYRAMID_LEVEL; @@ -466,7 +472,7 @@ void calc_edgeflow_tot(struct opticflow_t *opticflow, struct opticflow_state_t * window_size = MAX_WINDOW_SIZE; } - uint16_t RES = opticflow->subpixel_factor; + uint16_t RES = opticflow->resolution_factor; //......................Calculating EdgeFlow..................... // @@ -521,7 +527,7 @@ void calc_edgeflow_tot(struct opticflow_t *opticflow, struct opticflow_state_t * /* Save Resulting flow in results * Warning: The flow detected here is different in sign - * and size, therefore this will be multiplied with + * and size, therefore this will be divided with * the same subpixel factor and -1 to make it on par with * the LK algorithm of t opticalflow_calculator.c * */ @@ -531,6 +537,9 @@ void calc_edgeflow_tot(struct opticflow_t *opticflow, struct opticflow_state_t * result->flow_x = (int16_t)edgeflow.flow_x / previous_frame_offset[0]; result->flow_y = (int16_t)edgeflow.flow_y / previous_frame_offset[1]; + result->flow_x = (int16_t)edgeflow.flow_x / RES; + result->flow_y = (int16_t)edgeflow.flow_y / RES; + //Fill up the results optic flow to be on par with LK_fast9 result->flow_der_x = result->flow_x; result->flow_der_y = result->flow_y; diff --git a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h index fa46e364a0..1fa444c642 100644 --- a/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h +++ b/sw/airborne/modules/computer_vision/opticflow/opticflow_calculator.h @@ -57,6 +57,7 @@ struct opticflow_t { float derotation_correction_factor_y; ///< Correction factor for derotation in Y axis, determined from a fit from the gyros and flow rotation. (wrong FOV, camera not in center) uint16_t subpixel_factor; ///< The amount of subpixels per pixel + uint16_t resolution_factor; ///< The resolution in EdgeFlow to determine the Divergence uint8_t max_iterations; ///< The maximum amount of iterations the Lucas Kanade algorithm should do uint8_t threshold_vec; ///< The threshold in x, y subpixels which the algorithm should stop uint8_t pyramid_level; ///< Number of pyramid levels used in Lucas Kanade algorithm (0 == no pyramids used) From 2ac81ac85518501985456d60e10b44cad9dab86e Mon Sep 17 00:00:00 2001 From: Titus Date: Mon, 3 Apr 2017 11:47:11 +0200 Subject: [PATCH 10/11] Proposed speedup edits as described in pull request comments --- sw/airborne/modules/computer_vision/lib/vision/edge_flow.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c index 351b27fbe5..270b49be0e 100644 --- a/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c +++ b/sw/airborne/modules/computer_vision/lib/vision/edge_flow.c @@ -121,7 +121,7 @@ void calculate_edge_histogram(struct image_t *img, int32_t edge_histogram[], for (y = 0; y < image_height; y++) { sobel_sum = 0; - for (c = -1; c <= 1; c++) { + for (c = -1; c <= 1; c+=2) { idx = interlace * (image_width * y + (x + c)); sobel_sum += Sobel[c + 1] * (int32_t)img_buf[idx]; @@ -140,7 +140,7 @@ void calculate_edge_histogram(struct image_t *img, int32_t edge_histogram[], for (x = 0; x < image_width; x++) { sobel_sum = 0; - for (c = -1; c <= 1; c++) { + for (c = -1; c <= 1; c+=2) { idx = interlace * (image_width * (y + c) + x); sobel_sum += Sobel[c + 1] * (int32_t)img_buf[idx]; @@ -198,7 +198,6 @@ void calculate_edge_displacement(int32_t *edge_histogram, int32_t *edge_histogra } // TODO: replace with arm offset subtract for (x = border[0]; x < border[1]; x++) { - displacement[x] = 0; if (!SHIFT_TOO_FAR) { for (c = -D; c <= D; c++) { SAD_temp[c + D] = 0; From 2ccdc51f51a255b1ef3b23bbb51f4d4602f30801 Mon Sep 17 00:00:00 2001 From: Titus Date: Tue, 18 Apr 2017 17:37:47 +0200 Subject: [PATCH 11/11] Added an INDI conf to test the pullrequest --- .../tudelft_ardrone2_opticflow_indi.xml | 224 ++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 conf/airframes/TUDELFT/tudelft_ardrone2_opticflow_indi.xml diff --git a/conf/airframes/TUDELFT/tudelft_ardrone2_opticflow_indi.xml b/conf/airframes/TUDELFT/tudelft_ardrone2_opticflow_indi.xml new file mode 100644 index 0000000000..da98cf1f98 --- /dev/null +++ b/conf/airframes/TUDELFT/tudelft_ardrone2_opticflow_indi.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + + +
+ + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + + + +
+ +
+ + + +
+ +
+ + + + + +
+ +
+ + + + + +
+