PX4中vtol_att_control 源码解析

本文深入分析了PX4飞控系统中垂直起降(vtol)姿态控制的源码,涵盖`vtol_att_control_main`的参数更新、飞行模式控制,以及`standard`、`tailsitter`、`tiltrotor`三种机型的转换逻辑。在转换过程中,计算期望姿态和作动器控制,确保飞行模式间的平滑过渡。
摘要由CSDN通过智能技术生成

px4中vtol姿态控制源码分析

/src/modules/vtol_att_control/文件夹中包含vtol_att_control_main、vtol_type、standard/tailsitter/tiltrotor等文件。下面是主要控制逻辑:

事实上,PX4飞控系统支持所有的垂直起降机型配置:

  • 尾座式tailsitter (X/+型布局的双/四旋翼)
  • 倾转式tiltrotor (Firefly Y6)
  • 复合式standard (飞机+四旋翼)

垂直起降飞行器与其它种类的飞行器共享代码库,所不同的仅仅是增加了额外的控制逻辑,特别是转换阶段。

下面看源码:

vtol_att_control_main

1、订阅并更新参数

与所有控制器一样,由start函数开启进程,执行任务,指向task_main()

orb订阅各种参数:

        /* do subscriptions */
	_v_att_sp_sub          = orb_subscribe(ORB_ID(vehicle_attitude_setpoint));
	_mc_virtual_att_sp_sub = orb_subscribe(ORB_ID(mc_virtual_attitude_setpoint));
	_fw_virtual_att_sp_sub = orb_subscribe(ORB_ID(fw_virtual_attitude_setpoint));
	_mc_virtual_v_rates_sp_sub = orb_subscribe(ORB_ID(mc_virtual_rates_setpoint));
	_fw_virtual_v_rates_sp_sub = orb_subscribe(ORB_ID(fw_virtual_rates_setpoint));
	_v_att_sub             = orb_subscribe(ORB_ID(vehicle_attitude));
	_v_control_mode_sub    = orb_subscribe(ORB_ID(vehicle_control_mode));
	_params_sub            = orb_subscribe(ORB_ID(parameter_update));
	_manual_control_sp_sub = orb_subscribe(ORB_ID(manual_control_setpoint));
	_local_pos_sub         = orb_subscribe(ORB_ID(vehicle_local_position));
	_local_pos_sp_sub         = orb_subscribe(ORB_ID(vehicle_local_position_setpoint));
	_pos_sp_triplet_sub    = orb_subscribe(ORB_ID(position_setpoint_triplet));
	_airspeed_sub          = orb_subscribe(ORB_ID(airspeed));
	_vehicle_cmd_sub	   = orb_subscribe(ORB_ID(vehicle_command));
	_tecs_status_sub = orb_subscribe(ORB_ID(tecs_status));
	_land_detected_sub = orb_subscribe(ORB_ID(vehicle_land_detected));

	_actuator_inputs_mc    = orb_subscribe(ORB_ID(actuator_controls_virtual_mc));
	_actuator_inputs_fw    = orb_subscribe(ORB_ID(actuator_controls_virtual_fw));

	parameters_update();  // initialize parameter cache
parameters_update()更新通用参数和特定机型的参数。
2、_vtol_type->set_idle_mc()确保飞机以mc模式贴地起飞。
3、进入while循环首先检查参数更新
vehicle_control_mode_poll() //检查飞机控制模式的轮询

手动模式下重置转换命令;

更新不同机型的飞行模式①:_vtol_type->update_vtol_state();

检查飞机处于哪种模式并调用特定函数②:

    ROTARY_WING:主要函数为_vtol_type->update_mc_state(); 计算期望姿态

   mc_virtual_att_sp_poll();

			// vehicle is in rotary wing mode
			_vtol_vehicle_status.vtol_in_rw_mode = true;
			_vtol_vehicle_status.vtol_in_trans_mode = false;

			// got data from mc attitude controller
			_vtol_type->update_mc_state();
			fill_mc_att_rates_sp();


    FIXED_WING:主要函数为_vtol_type->update_fw_state(); 计算期望姿态

   fw_virtual_att_sp_poll();

			// vehicle is in fw mode
			_vtol_vehicle_status.vtol_in_rw_mode = false;
			_vtol_vehicle_status.vtol_in_trans_mode = false;

			_vtol_type->update_fw_state();
			fill_fw_att_rates_sp();

    TRANSITION:主要函数为_vtol_type->update_transition_state();计算转换时的姿态期望值

   mc_virtual_att_sp_poll();
			fw_virtual_att_sp_poll();

			// vehicle is doing a transition
			_vtol_vehicle_status.vtol_in_trans_mode = true;
			_vtol_vehicle_status.vtol_in_rw_mode = true; //making mc attitude controller work during transition
			_vtol_vehicle_status.in_transition_to_fw = (_vtol_type->get_mode() == TRANSITION_TO_FW);

			_vtol_type->update_transition_state();
			fill_mc_att_rates_sp();

4、填充actuator输出并发布姿态期望值
PX4是一款开源的自动驾驶系统,支持多种飞行器平台,包括多旋翼、固定翼、VTOL等。Mavlink是一种轻量级的通讯协议,用于在无人机和地面站之间传输数据。在PX4,Mavlink被广泛用于飞行控制和地面站之间的通讯。 下面是一个基本的PX4 Mavlink编程示范,演示了如何在PX4上使用Mavlink发送数据。 首先,需要包含Mavlink库的头文件。在PX4,可以使用以下命令安装Mavlink: ``` sudo apt-get install libmavlink-dev ``` 然后,在程序包含以下头文件: ``` #include <mavlink.h> ``` 接下来,需要定义一个Mavlink消息的缓冲区。这可以通过以下代码完成: ``` #define BUFFER_LENGTH 512 uint8_t buf[BUFFER_LENGTH]; ``` 然后,需要初始化Mavlink库。这可以通过以下代码完成: ``` mavlink_message_t msg; mavlink_status_t status; mavlink_system_t mavlink_system = {1,1,MQTT_SYSTEM_TYPE,0,0}; mavlink_system.sysid = 1; mavlink_system.compid = 1; mavlink_system.type = MAV_TYPE_QUADROTOR; mavlink_system.state = MAV_STATE_ACTIVE; mavlink_system.mode = MAV_MODE_PREFLIGHT; mavlink_system.nav_mode = MAV_NAV_GROUNDED; mavlink_system.is_initialized = true; ``` 这将初始化一个具有默认参数的Mavlink系统。 然后,可以使用以下代码创建一个Mavlink消息: ``` mavlink_msg_heartbeat_pack(mavlink_system.sysid, mavlink_system.compid, &msg, mavlink_system.type, MAV_AUTOPILOT_GENERIC, mavlink_system.mode, mavlink_system.state); ``` 这将创建一个心跳消息,其包含了系统ID、组件ID、类型、飞控类型、模式和状态。 最后,可以使用以下代码将Mavlink消息发送到PX4: ``` int len = mavlink_msg_to_send_buffer(buf, &msg); sendto(fd, buf, len, 0, (struct sockaddr *)&myaddr, sizeof(struct sockaddr_in)); ``` 这将把Mavlink消息发送到PX4。 这是一个简单的PX4 Mavlink编程示范,演示了如何在PX4上使用Mavlink发送数据。在实际应用,可以使用Mavlink发送各种类型的消息,例如姿态、速度、位置、传感器数据等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值