【无人机】PX4,源码简要分析

看看源码目的很单纯,就是想有没有控制方面的代码可以移植到其它地方。

【无人机】PX4,ubuntu18仿真运行

从官网可能下载代码不全,这是编译完成的源码,有点大!!!!

下载:

链接: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);
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要修改 PX4 码以使遥控器可以断电无人机,需要进行以下步骤: 1. 打开 PX4 码目录,找到文件夹 "Firmware/src/modules/commander"。 2. 在该文件夹中找到文件 "commander.cpp"。 3. 打开该文件,在 "Commander::handle_command" 函数中找到 "set_vehicle_cmd_long" 函数。 4. 在 "set_vehicle_cmd_long" 函数中添加代码来实现断电操作。例如: ```if (vehicle_cmd.command == VEHICLE_CMD_DO_SET_SERVO && vehicle_cmd.param1 == 10) { //新增加的条件,遥控器发送指令10,航空器断电 system("shutdown now"); }``` 5. 保存并编译代码。 6. 将编译后的固件下载到无人机上并启动。 7. 使用遥控器发送断电指令(例如发送“10”),确认无人机断电。 注意:断电操作可能会导致无人机数据丢失或无人机硬件损坏,请谨慎使用。 ### 回答2: 要修改PX4码使遥控器可以让无人机断电,首先需要了解PX4的软件架构。PX4采用模块化的设计,主要分为飞控固件(Flight Stack Firmware)和上层应用程序(High-Level Application)。在飞控固件中,关键的代码位于驱动层和控制层,其中包括与遥控器通信的代码。 要实现遥控器断电功能,我们可以在遥控器通信的代码中进行修改。具体来说,我们可以为遥控信号增加一种特殊的指令,该指令用于通知飞控系统断电。在PX4中,遥控器信号的解码和处理主要在`realsense`、`vehicle_control_mode`和`mc_att_control`三个模块中进行。我们可以在这些模块中找到相应的代码进行修改。 首先,我们需要在遥控器信号解码的代码中添加对特殊指令的检测。可以通过修改`realsense`模块中的代码,增加一个检测函数,用于检测特殊指令的存在。当检测到特殊指令后,可以设置一个标志位,表示接收到了断电指令。 然后,在控制层代码中,我们可以根据标志位的状态来控制断电功能。可以通过修改`mc_att_control`模块中的代码,在控制循环中添加条件判断,当接收到断电指令时,执行相应的断电操作。 需要注意的是,断电操作可能会对飞行安全产生不利影响。因此,在实际应用中,我们需要谨慎考虑断电的使用场景和条件。可以增加安全措施,如增加断电操作的确认流程,避免误操作导致飞行事故。 总之,要修改PX4码使遥控器可以实现断电功能,需要深入了解PX4的软件架构和代码结构,并在遥控器通信和控制层中进行相应的修改,同时需要谨慎考虑安全因素。 ### 回答3: 要修改PX4码使遥控器可以让无人机断电,需要进行以下几个步骤: 首先,我们需要找到遥控器的代码模块。遥控器的代码通常可以在PX4码的中心位置找到。在代码的根文件夹中,我们可以找到一个名为"src/lib/rc"的文件夹,里面包含与遥控器相关的代码。 其次,我们需要在遥控器代码中添加一个新的功能来控制无人机的断电。这可以通过在遥控器控制信号发送时发送一个特殊的指令来实现。我们可以在接收遥控器信号的函数中添加一些代码,以检测特定的开关状态或遥控器输入,并发送指令将无人机断电。 然后,我们需要修改无人机的电控制模块,使其能够接收到遥控器发送的断电指令,并执行相应的动作。这可能涉及到修改与电控制相关的代码模块,以便能够识别和执行断电指令。 最后,我们需要重新编译和烧录修改后的PX4固件。我们可以使用PX4工具链来进行编译和烧录,以确保修改后的代码能够在无人机上正确运行。 需要注意的是,修改PX4码需要一定的编程和电子知识,并且对无人机和遥控器的硬件了解也是必要的。在进行修改之前,建议先仔细阅读PX4的官方文档和码注释,以确保正确地理解和修改代码。另外,由于代码的修改可能会影响无人机的安全性和稳定性,建议在安全环境下进行测试和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值