fw_pos_control模块
class landingslope
为固定翼着陆的角度变化模块
基本上示例都是这么一个结构
class lib/extern_lgpl/tecs
这个类负责控制俯仰和油门来控制速度和高度,在后面会用到,不做深入讲究,只是为了简绍这个类的作用
/*
* Written by Paul Riseborough 2013 to provide:
* - Combined control of speed and height using throttle to control
* total energy and pitch angle to control exchange of energy between
* potential and kinetic.
* 通过控制油门来控制能量,控制俯仰控制势能,使得速度高度结合控制,在势能和运动结合
* Selectable speed or height priority modes when calculating pitch angle
* 当计算俯仰角度时优先选择速度/高度模式
* - Fallback mode when no airspeed measurement is available that
* sets throttle based on height rate demand and switches pitch angle control to
* height priority
* 当空速测量不管用时,切换俯仰角度优先控制到高度优先控制,并设置油门基于高度速率需求
* - Underspeed protection that demands maximum throttle switches pitch angle control
* to speed priority mode
* 需求最大油门的低速保护下,切换俯仰控制优先到速度优先模式
* - Relative ease of tuning through use of intuitive time constant, trim rate and damping parameters and the use
* of easy to measure aircraft performance data
* 通过使用直观的时间常数,微调速率和阻尼参数以及使用易于测量飞机性能数据的相对易于调谐
*
*/
class FixedwingPositionControl
FixedwingPositionControl:
使用param_find()函数定位所有的参数,赋初值
start() int static public
开始控制
task_running() bool
任务的状态
更新控制函数:
get_demanded_airspeed() float
返回需求的空速
实现:
根据油门输入(_manual.z)大于0.5与否,决定速度应该变大还是变小(按照比例)
// 如果油门输入<0.5,输出空速应该是 最小速度+(可缩减速度)*(2×输入值)
// 可缩减速度为当前速度到最小速度的差,以0.5*2为1,中值,不会变化
calculate_target_airspeed(airspeed_demand) float
返回目标速度,输出需求速度
实现:
一般只对需求速度限制在最大和最小的范围内
在目的空速加上最小下冲速度(_groundspeed_undershoot),只有在有强风时候这个最小下冲速度不为0
calculate_gnd_speed_undershoot(¤t_position,&ground_speed_2d,&pos_sp_triplet)
计算对地下冲速度,输出到_groundspeed_undershoot属性中
说明:
对地下冲速度(固定翼速度不够,升力<重力 产生的飞行高度下降速度) 是飞机没有到达一定地速的结果。因此,当空速大于最小地速时候,对地下冲速度为0,否则为正当小于最小地速时候。
get_waypoint_heading_distance(heading, distance, &wp_prev, &wp_next) void
基于方向和当前的距离获取下一个waypoint,输出到wp_prev,wp_next
实现:
如果是flag_init,根据角度和距离获取前后航点
否则,根据前一帧的前后航点说确定的直线,根据预先定义的距离,获取新的前后航点。
get_terrain_altitude_landing(land_setpoint_alt, &global_pos) float
返回降落点的地形高度
实现:
如果地形评估无效,直接使用设定点的高度
如果使用地形评估,并切换到地形评估,一直使用到降落为止
get_terrain_altitude_takeoff(takeoff_alt, &global_pos) float
返回起飞时候的地形高度
实现:
如果global_pos中地形高度有效返回,否则返回起飞高度takeoff_alt
in_takeoff_situation() bool
检查是否正在起飞中
实现:
判断是否刚进入空中,油门输入是否到门限,高度是否符合最小的起飞的条件
do_takeoff_help(*hold_altitude,*pitch_limit_min)
定高模式下的起飞参数信息的获取函数,获得起飞的高度和最小俯仰,传入参数指针,直接对地址修改
实现:
如果正在起飞,更新定高高度为起飞最小高度和最小俯仰;否则,根据参数pitch_limit_min更新最小俯仰
update_desired_altitude(dt) bool
根据俯仰输入更新期望高度,输出到属性_alt_hold,参数为Time step,单位时间,返回的bool类型是是否是爬升模式。
实现:
0.06 ~ -0.06 视为0, 其余1 ~ 0.06 | -0.06 ~ -1 部分按比例,更新高度 = 原高度 + 最大变化速率*dt * pitch (俯仰指数)
如果是垂直起降飞机,在旋翼状态/转化状态,高度是当前高度。
control_position(global_pos, ground_speed, pos_sp_triplet) bool
控制位置,根据输入的位置,速度,和航点,(存在全局变量的飞行器状态),输出对应的控制姿态_att_sp(全局变量)
get_tecs_pitch() float
如果mTecs可行,返回getPitchSetpoint()否则返回_tecs.get_pitch_demand()
get_tecs_thrust() float
同上
get_demanded_airspeed() float
获取需要的空速大小
实现算法如下:
判断输入油门的大小,设定可变化速度为当前速度距最大/最小速度的差,airspeed_trim字面上是修剪的空速速度(即当前速度)
如果油门输入小于0.5,输出速度=最小速度+可变化速度×油门输入值×2;(如果油门输入值0.5,则速度不变化,在输入值小于0.5的情况下,油门输入×2 < 1)
如果油门大于0.5,输出速度 = 当前速度 + 可变化速度 × (油门输入值-0.5)*2(减去0.5的基础油门)
calculate_target_airspeed(airspeed_demand) float
计算目标空速,没看懂想干嘛
实现:
当前空速根据全局变量_airspeed_valid是否合法,合法取当前控制状态的空速,否则取中值。
目标空速= airspeed_demand+_groundsped_undershoot(期望速度+地速),再对目标空速进行限制,使其在最大最小之间。
_airspeed_error这个全局变量是目标速度和当前空速之差,应该是用来调整速度的。
返回目标速度
calualte_gndspeed_undershoot(current_pos, ground_speed_2d, pos_sp_triplet) void
计算对地下降速度_groundspeed_undershoot,对地下冲速度(固定翼速度不够,升力<重力 产生的飞行高度下降速度) 是飞机没有到达一定地速的结果。因此,当空速大于最小地速时候,对地下冲速度为0,否则为正当小于最小地速时候。
根据distance和delta_altitude计算期望的速度,与当前速度之差就是应该对地下降的速度,
task_main_trampoline()
构建FixedwingPositionControl类,赋给l1_control命名空间的g_control指针,开始运行task_main()函数,然后释放。
task_main() void
先订阅需要的信息,设置更新速率等。
fds[2],fds[0]负责检查参数更新,fds[1]负责位置更新
while
px4_poll检查是否有更新,更新control_mode,status
如果参数更新,获取更新参数
如果位置更新,control_statue,setpoint,sensor_combined,manual_control_setpoint更新,运行control_position()函数,如果控制成功,通过uorb机制输出控制结果信息,最后如果导航信息很久没有更新,输出导航信息没看懂
reset_takeoff_state() void
reset_landing_state() void
tecs_update_pitch_trottle() void
一个调用实现TECS的包装器函数(mTECS是只通过参数启用)
类的实现流程:
从fw_pos_control_l1_main函数开始执行,这个main方法有命令行参数,根据参数,输出是否fw_pos_control_l1这个模块的运行状态,实际运行调用l1_control::g_control指针所创建的对象,调用FixedwingPositionControl::start方法的px4_task_spawn_cmd来初始化创建对象。再通过task_main_trampoline真正创建类的对象。
FixedwingPositionControl::task_main()正式开始:
订阅全局位置,三个一组的航点位置,控制状态,传感器状态,控制模式,飞行器状态,参数,手动输入等通过uORB订阅。设置更新速率
注:_global_pos是当前飞行器的位置
_paramters是全局参数
pos_sp_triplet是航点三兄弟的结构体
_att_sp设定的姿态控制
_vehicle_status 飞行器的状态
_manual 手动控制输入的结构体
control_position()的函数运行流程:
bool control_position(
const math::Vector<2> ¤t_position, //当前位置,经纬坐标
const math::Vector<3> &ground_speed, //三轴加速度
const struct position_setpoint_triplet_s &pos_sp_triple) //航点集合
根据飞行模式控制(每一个模式下的控制都分为水平控制和垂直控制,水平控制交给l1_control类,更新yaw和roll,垂直控制交给tecs_update更新油门俯仰)
自动模式下当前航点有效 flag_control_auto_enabled & pos_sp_triplet.current.valid
根据当前航点的状态控制
降落航点(SETPOINT_TYPE_LAND)(这个航点的内容 比较多,水平控制垂直控制分别注释)
起飞航点(SETPOINT_TYPE_TAKEOFF)
如果runway_takoff可用
是:runway_takeoff的起飞模块的具体控制,猜的
tecs_update_pitch_throttle()函数的运行流程:
void tecs_update_pitch_throttle(
float alt_sp, //目标高度
float v_sp, //目标速度
float eas2tas, //注释给出的基于当前的测量来计算实际值,给的默认值为1.0
float throttle_min, float throttle_max, //油门范围
float throttle_cruise, //巡航油门
bool climboot_mode, //是否是爬升模式
float climbout_pitch_min_rad, //爬升最小仰角
float altitude, //当前高度
const math::Vector<3> &ground_speed, //当前速度
unsigned mode = tecs_status_s::TECS_MODE_NORMAL,
bool pitch_max_special=false
);