Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
cloud_sim.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 Gautier Hattenberger <gautier.hattenberger@enac.fr>
3 *
4 * This file is part of paparazzi
5 *
6 * paparazzi is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * paparazzi is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with paparazzi; see the file COPYING. If not, see
18 * <http://www.gnu.org/licenses/>.
19 */
20
28#include "generated/flight_plan.h"
29#include "generated/airframe.h"
30#include "modules/core/abi.h"
31#include "state.h"
32
33// default radius in WP mode
34#ifndef CLOUD_SIM_RADIUS
35#define CLOUD_SIM_RADIUS 150.f
36#endif
37
38// default mode
39#ifndef CLOUD_SIM_MODE
40#define CLOUD_SIM_MODE CLOUD_SIM_WP
41#endif
42
43// use CLOUD waypoint if any by default, 0 (none) otherwise
44#if (defined WP_CLOUD) && !(defined CLOUD_SIM_WP_ID)
45#define CLOUD_SIM_WP_ID WP_CLOUD
46#elif !(defined CLOUD_SIM_WP_ID)
47#define CLOUD_SIM_WP_ID 0
48#endif
50
51#if (defined CLOUD_SIM_WP_POLYGON)
53#ifndef CLOUD_SIM_WPS_NB
54#pragma error "CLOUD_SIM: please define CLOUD_SIM_WPS_NB for custom polygon"
55#endif
56#elif (defined SECTOR_CLOUD)
58#define CLOUD_SIM_WPS_NB SECTOR_CLOUD_NB
59#else
60#define CLOUD_SIM_WPS_NB 1
62#endif
63
64#ifndef CLOUD_SIM_SPEED_X
65#define CLOUD_SIM_SPEED_X 0.f
66#endif
67
68#ifndef CLOUD_SIM_SPEED_Y
69#define CLOUD_SIM_SPEED_Y 0.f
70#endif
71
73
74/*********************
75 * Utility functions *
76 *********************/
77
78static float distance_to_wp(struct EnuCoor_f * pos, uint8_t id)
79{
80 if (id > 0 && id < nb_waypoint) {
81 struct FloatVect2 diff = { pos->x - waypoints[id].x, pos->y - waypoints[id].y };
82 return float_vect2_norm(&diff);
83 } else {
84 return -1.f; // invalid WP id
85 }
86}
87
88/**********************
89 * External functions *
90 **********************/
91
100
103{
105 struct EnuCoor_f * pos = stateGetPositionEnu_f();
106 uint8_t inside = 0; // 1: inside, 0: outside
107
108 switch (cloud_sim.mode) {
109 case CLOUD_SIM_WP:
110 // Test the distance to the reference waypoint
112 inside = 0;
113 } else {
114 inside = 1;
115 }
116 AbiSendMsgPAYLOAD_DATA(CLOUD_SENSOR_ID, stamp, 1 /* CLOUD_BORDER */, 1, &inside);
117 break;
118#ifdef SECTOR_CLOUD
120 inside = (uint8_t) InsideCloud(pos->x, pos->y);
121 AbiSendMsgPAYLOAD_DATA(CLOUD_SENSOR_ID, stamp, 1 /* CLOUD_BORDER */, 1, &inside);
122 break;
123#endif
124 default:
125 break;
126 }
127}
128
131{
132 if (cloud_sim.mode == CLOUD_SIM_WP) {
135 wp.x += cloud_sim.speed.x; // assuming dt = 1.
136 wp.y += cloud_sim.speed.y; // assuming dt = 1.
139 }
140 } else if (cloud_sim.mode == CLOUD_SIM_POLYGON) {
141 for (int i = 0; i < CLOUD_SIM_WPS_NB; i++) {
143 struct point wp = waypoints[cloud_sim_polygon[i]];
144 wp.x += cloud_sim.speed.x; // assuming dt = 1.
145 wp.y += cloud_sim.speed.y; // assuming dt = 1.
148 }
149 }
150 }
151}
152
172
Main include for ABI (AirBorneInterface).
#define CLOUD_SENSOR_ID
static uint8_t reset[3]
uint32_t get_sys_time_usec(void)
Get the time in microseconds since startup.
struct CloudSim cloud_sim
Definition cloud_sim.c:72
void cloud_sim_detect(void)
periodic call for border detection
Definition cloud_sim.c:102
#define CLOUD_SIM_SPEED_Y
Definition cloud_sim.c:69
static uint8_t cloud_sim_circle_id
Definition cloud_sim.c:49
#define CLOUD_SIM_MODE
Definition cloud_sim.c:40
#define CLOUD_SIM_WPS_NB
Definition cloud_sim.c:60
void cloud_sim_move(void)
periodic call for moving waypoints
Definition cloud_sim.c:130
void cloud_sim_reset(bool reset)
reset handler
Definition cloud_sim.c:154
void cloud_sim_init(void)
Definition cloud_sim.c:92
#define CLOUD_SIM_WP_ID
Definition cloud_sim.c:47
static uint8_t cloud_sim_polygon[CLOUD_SIM_WPS_NB]
Definition cloud_sim.c:61
#define CLOUD_SIM_RADIUS
Definition cloud_sim.c:35
static float distance_to_wp(struct EnuCoor_f *pos, uint8_t id)
Definition cloud_sim.c:78
#define CLOUD_SIM_SPEED_X
Definition cloud_sim.c:65
struct FloatVect2 speed
Definition cloud_sim.h:38
#define CLOUD_SIM_WP
Definition cloud_sim.h:32
#define CLOUD_SIM_POLYGON
Definition cloud_sim.h:33
uint8_t mode
Definition cloud_sim.h:37
float radius
radius in WP mode
Definition cloud_sim.h:39
bool reset
Definition cloud_sim.h:36
void nav_send_waypoint(uint8_t wp_id)
Send a waypoint throught default telemetry channel.
Definition common_nav.c:226
void nav_move_waypoint_point(uint8_t wp_id, struct point *p)
Move a waypoint from point structure (local frame).
Definition common_nav.c:218
struct point waypoints[NB_WAYPOINT]
size == nb_waypoint, waypoint 0 is a dummy waypoint
Definition common_nav.c:44
const uint8_t nb_waypoint
Definition common_nav.c:43
float y
Definition common_nav.h:41
float x
Definition common_nav.h:40
static float float_vect2_norm(struct FloatVect2 *v)
static struct EnuCoor_f * stateGetPositionEnu_f(void)
Get position in local ENU coordinates (float).
Definition state.h:848
uint16_t foo
Definition main_demo5.c:58
float y
in meters
float x
in meters
vector in East North Up coordinates Units: meters
API to get/set the generic vehicle states.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.