Merge branch 'master' of github.com:PX4/Firmware

This commit is contained in:
Lorenz Meier 2012-08-08 18:48:09 +02:00
commit 04d280564c
4 changed files with 137 additions and 121 deletions

View File

@ -38,7 +38,8 @@
****************************************************************************/
/**
* @file multirotor_control.c
* @file multirotor_attitude_control.c
*
* Implementation of multirotor attitude controller.
*/
@ -54,7 +55,7 @@
#include "pid.h"
#include <arch/board/up_hrt.h>
extern int ardrone_write;
extern int multirotor_write;
extern int gpios;
#define CONTROL_PID_ATTITUDE_INTERVAL 5e-3
@ -84,7 +85,10 @@ void navi2body_xy_plane(const float_vect3 *vector, const float yaw,
// result->z = vector->z; //leave direction normal to xy-plane untouched
}
void control_attitude(const struct rc_channels_s *rc, const struct vehicle_attitude_s *att, const struct vehicle_status_s *status, int ardrone_pub, struct ardrone_control_s *ar_control)
void multirotor_control_attitude(const struct rc_channels_s *rc,
const struct vehicle_attitude_s *att,
const struct vehicle_status_s *status,
struct actuator_controls_s *actuators)
{
static int motor_skip_counter = 0;
@ -352,7 +356,7 @@ void control_attitude(const struct rc_channels_s *rc, const struct vehicle_attit
// ar_control->attitude_control_output[1] = nick;
// ar_control->attitude_control_output[2] = yaw;
// ar_control->zcompensation = zcompensation;
// orb_publish(ORB_ID(ardrone_control), ardrone_pub, ar_control);
// orb_publish(ORB_ID(multirotor_control), multirotor_pub, ar_control);
static float output_band = 0.f;
static float band_factor = 0.75f;

View File

@ -34,7 +34,11 @@
*
****************************************************************************/
/* @file attitude control for quadrotors */
/**
* @file multirotor_attitude_control.h
*
* attitude control for multirotors
*/
#ifndef ATTITUDE_CONTROL_H_
#define ATTITUDE_CONTROL_H_
@ -42,11 +46,10 @@
#include <uORB/uORB.h>
#include <uORB/topics/rc_channels.h>
#include <uORB/topics/vehicle_attitude.h>
#include <uORB/topics/ardrone_control.h>
#include <uORB/topics/vehicle_status.h>
#include <uORB/topics/actuator_controls.h>
void control_attitude(const struct rc_channels_s *rc, const struct vehicle_attitude_s *att,
const struct vehicle_status_s *status, int ardrone_pub,
struct ardrone_control_s *ar_control);
void multirotor_control_attitude(const struct rc_channels_s *rc, const struct vehicle_attitude_s *att,
const struct vehicle_status_s *status, struct actuator_controls_s *actuators);
#endif /* ATTITUDE_CONTROL_H_ */

View File

@ -34,6 +34,7 @@
/*
* @file multirotor_control.c
*
* Implementation of multirotor controllers
*/
@ -46,8 +47,9 @@
#include <fcntl.h>
#include <errno.h>
#include <debug.h>
#include <termios.h>
#include <getopt.h>
#include <time.h>
#include <poll.h>
#include <sys/prctl.h>
#include <arch/board/up_hrt.h>
#include "multirotor_control.h"
@ -55,144 +57,151 @@
#include <uORB/uORB.h>
#include <uORB/topics/vehicle_status.h>
#include <uORB/topics/vehicle_attitude.h>
#include <uORB/topics/ardrone_control.h>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/rc_channels.h>
#include <uORB/topics/sensor_combined.h>
__EXPORT int ardrone_control_main(int argc, char *argv[]);
#include <systemlib/perf_counter.h>
/****************************************************************************
* Internal Definitions
****************************************************************************/
__EXPORT int multirotor_control_main(int argc, char *argv[]);
enum {
static enum {
CONTROL_MODE_RATES = 0,
CONTROL_MODE_ATTITUDE = 1,
} control_mode;
/****************************************************************************
* Private Data
****************************************************************************/
/*File descriptors */
int ardrone_write;
int gpios;
static bool thread_should_exit;
static int mc_task;
bool position_control_thread_started;
/****************************************************************************
* pthread loops
****************************************************************************/
// static void *position_control_loop(void *arg)
// {
// struct vehicle_status_s *state = (struct vehicle_status_s *)arg;
// // Set thread name
// prctl(PR_SET_NAME, "ardrone pos ctrl", getpid());
// while (1) {
// if (state->state_machine == SYSTEM_STATE_AUTO) {
// // control_position(); //FIXME TODO XXX
// /* temporary 50 Hz execution */
// usleep(20000);
// } else {
// position_control_thread_started = false;
// break;
// }
// }
// return NULL;
// }
/****************************************************************************
* main
****************************************************************************/
int ardrone_control_main(int argc, char *argv[])
static int
mc_thread_main(int argc, char *argv[])
{
/* welcome user */
printf("[ardrone_control] Control started, taking over motors\n");
/* default values for arguments */
char *ardrone_uart_name = "/dev/ttyS1";
control_mode = CONTROL_MODE_RATES;
char *commandline_usage = "\tusage: ardrone_control -d ardrone-devicename -m mode\n\tmodes are:\n\t\trates\n\t\tattitude\n";
/* read commandline arguments */
int i;
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-d") == 0 || strcmp(argv[i], "--device") == 0) { //ardrone set
if (argc > i + 1) {
ardrone_uart_name = argv[i + 1];
} else {
printf(commandline_usage);
return 0;
}
} else if (strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--mode") == 0) {
if (argc > i + 1) {
if (strcmp(argv[i + 1], "rates") == 0) {
control_mode = CONTROL_MODE_RATES;
} else if (strcmp(argv[i + 1], "attitude") == 0) {
control_mode = CONTROL_MODE_ATTITUDE;
} else {
printf(commandline_usage);
return 0;
}
} else {
printf(commandline_usage);
return 0;
}
}
}
/* initialize motors */
int counter = 0;
/* pthread for position control */
// pthread_t position_control_thread;
// position_control_thread_started = false;
/* structures */
struct vehicle_status_s state;
struct vehicle_attitude_s att;
struct rc_channels_s rc;
struct sensor_combined_s raw;
struct actuator_controls_s actuators;
struct actuator_armed_s armed;
/* subscribe to attitude, motor setpoints and system state */
int att_sub = orb_subscribe(ORB_ID(vehicle_attitude));
int state_sub = orb_subscribe(ORB_ID(vehicle_status));
int rc_sub = orb_subscribe(ORB_ID(rc_channels));
int sensor_sub = orb_subscribe(ORB_ID(sensor_combined));
/* publish AR.Drone motor control state */
// int ardrone_pub = orb_advertise(ORB_ID(ardrone_control), &ar_control);
/* rate-limit the attitude subscription to 200Hz to pace our loop */
orb_set_interval(att_sub, 5);
struct pollfd fds = { .fd = att_sub, .events = POLLIN };
/* publish actuator controls */
for (unsigned i = 0; i < NUM_ACTUATOR_CONTROLS; i++)
actuators.control[i] = 0.0f;
int actuator_pub = orb_advertise(ORB_ID_VEHICLE_ATTITUDE_CONTROLS, &actuators);
armed.armed = true;
int armed_pub = orb_advertise(ORB_ID(actuator_armed), &armed);
/* register the perf counter */
perf_counter_t mc_loop_perf = perf_alloc(PC_ELAPSED, "multirotor_control");
/* welcome user */
printf("[multirotor_control] starting\n");
while (!thread_should_exit) {
/* wait for a sensor update */
poll(&fds, 1, -1);
perf_begin(mc_loop_perf);
while (1) {
/* get a local copy of the vehicle state */
orb_copy(ORB_ID(vehicle_status), state_sub, &state);
/* get a local copy of rc */
/* get a local copy of rc inputs */
orb_copy(ORB_ID(rc_channels), rc_sub, &rc);
/* get a local copy of attitude */
orb_copy(ORB_ID(vehicle_attitude), att_sub, &att);
multirotor_control_attitude(&rc, &att, &state);
/* run the attitude controller */
multirotor_control_attitude(&rc, &att, &state, &actuators);
/* run at approximately 200 Hz */
usleep(5000);
counter++;
/* publish the result */
orb_publish(ORB_ID_VEHICLE_ATTITUDE_CONTROLS, actuator_pub, &actuators);
perf_end(mc_loop_perf);
}
printf("[ardrone_control] ending now...\r\n");
printf("[multirotor_control] stopping\r\n");
/* kill all outputs */
armed.armed = false;
orb_publish(ORB_ID(actuator_armed), armed_pub, &armed);
for (unsigned i = 0; i < NUM_ACTUATOR_CONTROLS; i++)
actuators.control[i] = 0.0f;
orb_publish(ORB_ID_VEHICLE_ATTITUDE_CONTROLS, actuator_pub, &actuators);
close(att_sub);
close(state_sub);
close(rc_sub);
close(actuator_pub);
close(armed_pub);
perf_print_counter(mc_loop_perf);
perf_free(mc_loop_perf);
fflush(stdout);
return 0;
exit(0);
}
static void
usage(const char *reason)
{
if (reason)
fprintf(stderr, "%s\n", reason);
fprintf(stderr, "usage: multirotor_control [-m <mode>] {start|stop}\n");
fprintf(stderr, " <mode> is 'rates' or 'attitude'\n");
exit(1);
}
int multirotor_control_main(int argc, char *argv[])
{
int ch;
control_mode = CONTROL_MODE_RATES;
while ((ch = getopt(argc, argv, "m:")) != EOF) {
switch (ch) {
case 'm':
if (!strcmp(optarg, "rates")) {
control_mode = CONTROL_MODE_RATES;
} else if (!strcmp(optarg, "attitude")) {
control_mode = CONTROL_MODE_RATES;
} else {
usage("unrecognized -m value");
}
default:
usage("unrecognized option");
}
}
argc -= optind;
argv += optind;
if (argc < 1)
usage("missing command");
if (!strcmp(argv[1], "start")) {
thread_should_exit = false;
mc_task = task_create("multirotor_attitude", SCHED_PRIORITY_MAX - 15, 2048, mc_thread_main, NULL);
exit(0);
}
if (!strcmp(argv[1], "stop")) {
thread_should_exit = true;
exit(0);
}
usage("unrecognised command");
exit(1);
}

View File

@ -1,12 +1,12 @@
/*
* ardrone_control.h
/**
* @file multirotor_control.h
*
* Created on: Mar 23, 2012
* Author: thomasgubler
*/
#ifndef ARDRONE_CONTROL_H_
#define ARDRONE_CONTROL_H_
#ifndef multirotor_CONTROL_H_
#define multirotor_CONTROL_H_
#endif /* ARDRONE_CONTROL_H_ */
#endif /* multirotor_CONTROL_H_ */