【无人机】PX4,源码简要分析
程序员文章站
2024-01-06 16:43:28
PX4源码简要分析...
看看源码目的很单纯,就是想有没有控制方面的代码可以移植到其它地方。
从官网可能下载代码不全,这是编译完成的源码,有点大!!!!
下载:
链接:https://pan.baidu.com/s/1a4x0IE4S75YaVyoIpu4rOw
提取码:sbhr
打开源码。前两个暂时不用管。
更多看驱动源码下的 modules文件。
例如:箭头所指文件:姿态解算文件。下面有很多。唉,这源码写的刚接触还真。。。刚刚接触结构还没懂。
姿态解算,涉及很多,建议看看视频、书籍。不仅仅姿态解算,还有位置解算等。。。。里面可以借鉴很多。
点灯。
它这点灯并不是简单IO。是一个任务,有任务间通信。
int gpio_led_main(int argc, char *argv[])
{
if (argc < 2) {
print_usage(NULL);
exit(1);
} else {
if (!strcmp(argv[1], "start")) {
if (gpio_led_state != Stopped) {
PX4_WARN("already running");
exit(1);
}
/* by default GPIO_SERVO_1 on FMUv2 */
int pin = 1;
/* pin name to display */
char pin_name[sizeof(PIN_NAME) + 2] = PIN_NAME;
if (argc > 2) {
if (!strcmp(argv[2], "-p")) {
unsigned int n = strtoul(argv[3], NULL, 10);
if (n >= GPIO_MIN_SERVO_PIN && n <= GPIO_MAX_SERVO_PIN) {
pin = 1 << (n - 1);
snprintf(pin_name, sizeof(pin_name), "AUX OUT %d", n);
} else {
PX4_ERR("unsupported pin: %s (valid values are %d-%d)", argv[3], GPIO_MIN_SERVO_PIN, GPIO_MAX_SERVO_PIN);
exit(1);
}
}
}
gpio_led_data = malloc(sizeof(struct gpio_led_s));
if (gpio_led_data == NULL) {
PX4_ERR("failed to allocate memory!");
exit(1);
} else {
memset(gpio_led_data, 0, sizeof(struct gpio_led_s));
gpio_led_data->pin = pin;
int ret = work_queue(LPWORK, &(gpio_led_data->work), gpio_led_start, gpio_led_data, 0);
if (ret != 0) {
PX4_ERR("failed to queue work: %d", ret);
goto out;
} else {
usleep(1000000/CYCLE_RATE_HZ);
if (gpio_led_state != Running) {
gpio_led_state = Stopped;
goto out;
}
PX4_INFO("start, using pin: %s", pin_name);
exit(0);
}
}
} else if (!strcmp(argv[1], "stop")) {
if (gpio_led_state == Running) {
gpio_led_state = Stopping;
while(gpio_led_state != Stopped) {
usleep(1000000/CYCLE_RATE_HZ);
}
PX4_INFO("stopped");
free (gpio_led_data);
gpio_led_data = NULL;
exit(0);
} else {
PX4_WARN("not running");
exit(1);
}
} else {
print_usage("unrecognized command");
exit(1);
}
}
out:
free (gpio_led_data);
gpio_led_data = NULL;
exit(1);
}
本文地址:https://blog.csdn.net/weixin_41865104/article/details/107295090