47 float leg_length2 =
Max((wp_diff.
x * wp_diff.
x + wp_diff.
y * wp_diff.
y), 0.1f);
70 if (approaching_time > 0.f) {
74 VECT2_SMUL(estimated_progress, *speed, approaching_time);
75 VECT2_SUM(estimated_pos, *pos, estimated_progress);
97 return (diff.
x * from_diff.
x + diff.
y * from_diff.
y < 0.f);
113 NormRadAngle(trigo_diff);
117 float sign_radius = radius > 0.f ? 1.f : -1.f;
119 float abs_radius = fabsf(radius);
120 if (abs_radius > 0.1f) {
123 carrot_angle =
Min(carrot_angle, M_PI / 4);
124 carrot_angle =
Max(carrot_angle, M_PI / 16);
127 VECT2_ASSIGN(pos_diff, abs_radius * cosf(carrot_angle), abs_radius * sinf(carrot_angle));
146 #ifndef LINE_START_FUNCTION
147 #define LINE_START_FUNCTION {}
149 #ifndef LINE_STOP_FUNCTION
150 #define LINE_STOP_FUNCTION {}
171 float d = sqrtf(p2_p1_x * p2_p1_x + p2_p1_y * p2_p1_y);
248 #if PERIODIC_TELEMETRY
253 pprz_msg_send_SEGMENT(trans, dev, AC_ID,
262 pprz_msg_send_CIRCLE(trans, dev, AC_ID,
272 pprz_msg_send_ROTORCRAFT_NAV_STATUS(trans, dev, AC_ID,
274 &dist_home, &dist_wp,
298 #if PERIODIC_TELEMETRY
struct RoverNavigation nav
struct RoverNavBase nav_rover_base
static bool nav_approaching(struct EnuCoor_f *wp, struct EnuCoor_f *from, float approaching_time)
float leg_progress
progress over leg
struct RoverNavGoto goto_wp
void nav_rover_init(void)
Init and register nav functions.
#define INT32_DEG_OF_RAD(_rad)
float dist2_to_home
squared distance to home waypoint
static void nav_circle(struct EnuCoor_f *wp_center, float radius)
Periodic telemetry system header (includes downlink utility and generated code).
uint8_t count
number of laps
static void _nav_oval_init(void)
#define VECT2_SUM(_c, _a, _b)
vector in East North Up coordinates Units: meters
#define POS_BFP_OF_REAL(_af)
uint8_t nav_oval_count
Navigation along a figure O.
#define LINE_START_FUNCTION
Navigation along a figure O.
struct EnuCoor_f to
end WP position
struct EnuCoor_f target
final target
#define VECT2_COPY(_a, _b)
#define VECT2_DIFF(_c, _a, _b)
float leg_length
leg length
#define DEFAULT_CIRCLE_RADIUS
default nav_circle_radius in meters
#define VECT2_ASSIGN(_a, _x, _y)
static void nav_route(struct EnuCoor_f *wp_start, struct EnuCoor_f *wp_end)
float radius
radius in meters
void nav_register_goto_wp(nav_rover_goto nav_goto, nav_rover_route nav_route, nav_rover_approaching nav_approaching)
Register functions.
static void send_segment(struct transport_tx *trans, struct link_device *dev)
static struct EnuCoor_f * stateGetPositionEnu_f(void)
Get position in local ENU coordinates (float).
#define NavQdrCloseTo(x)
True if x (in degrees) is close to the current QDR (less than 10 degrees)
enum oval_status status
oval status
static float float_vect2_norm(struct FloatVect2 *v)
struct EnuCoor_f from
start WP position
static void nav_goto(struct EnuCoor_f *wp)
Implement basic nav function.
#define NAV_MODE_WAYPOINT
Nav modes.
float get_dist2_to_point(struct EnuCoor_i *p)
Returns squared horizontal distance to given point.
#define DefaultPeriodic
Set default periodic telemetry.
void nav_register_oval(nav_rover_oval_init nav_oval_init, nav_rover_oval nav_oval)
void nav_register_circle(nav_rover_circle nav_circle)
#define VECT2_SMUL(_vo, _vi, _s)
#define ANGLE_BFP_OF_REAL(_af)
static const struct usb_device_descriptor dev
struct EnuCoor_f center
center WP position
#define ARRIVED_AT_WAYPOINT
minimum horizontal distance to waypoint to mark as arrived
struct RoverNavCircle circle
static void send_circle(struct transport_tx *trans, struct link_device *dev)
vector in East North Up coordinates
int32_t int32_atan2_2(int32_t y, int32_t x)
static struct EnuCoor_f * stateGetSpeedEnu_f(void)
Get ground speed in local ENU coordinates (float).
struct point waypoints[NB_WAYPOINT]
size == nb_waypoint, waypoint 0 is a dummy waypoint
float dist2_to_wp
squared distance to next waypoint
#define LINE_STOP_FUNCTION
float radians
incremental angular distance
static void send_nav_status(struct transport_tx *trans, struct link_device *dev)
static void nav_oval(struct EnuCoor_f *wp1, struct EnuCoor_f *wp2, float radius)
bool nav_approaching_from(struct EnuCoor_i *wp, struct EnuCoor_i *from, int16_t approaching_time)
Proximity tests on approaching a wp.
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
#define CARROT
default approaching_time for a wp