自定义任务
- 头文件冒号引用的是当前目录的子文件夹
- 终端输入
make px4_sitl_default boardconfig,调用gui界面将任务加入到px4代码中。
- 在路径“ROMFS/cannode/px4fmu_common/init.d/rc.mc_apps”,输入
test_demo start,使得程序一启动就运行。
自定义参数
- 定义整型参数,在test_demo_params.c文件中输入:
/**
* TestDemo Enable
*
* Display the test demo hello.
*
* @boolean
* @group Demo
*/
PARAM_DEFINE_INT32(T_DEMO_EN, 1);
- 注释内容不可随意写,在qgc中会依据注释内容调整
- 第一行为描述
- 第三行为在qgc中显示的描述
- 第五行表示这是一个二进制数
- 第六行表示该参数的分组
- 最后一行表示该参数名称为T_DEMO_EN,参数名称长度不能大于16,默认值为1
- 定义浮点数参数,在test_demo_params.c文件中输入:
/**
* TestDemo length
*
* TestDemo UAV length
*
* @unit m
* @min 0.0
* @max 1.0
* @increment 0.01
* @group Demo
*/
PARAM_DEFINE_FLOAT(T_DEMO_LEN, 0.225f);
- 单位米,最小值与最大值为0和1,步进0.01,分组为demo,参数名称为T_DEMO_LEN,默认值为0.225f。
- 在文件TestDemo.hpp中输入:
DEFINE_PARAMETERS(
// Position Control
(ParamFloat<px4::params::T_DEMO_LEN>) _param_t_demo_len,
(ParamInt<px4::params::T_DEMO_EN>) _param_t_demo_en
);
- 在TestDemo.hpp中定义局部变量:
bool t_demo_en;
float t_demo_len;
- 在TestDemo.cpp文件中的void TestDemo::parameters_update(bool force)输入:
void TestDemo::parameters_update(bool force)
{
// check for parameter updates
if (_parameter_update_sub.updated() || force) {
// clear update
parameter_update_s pupdate;
_parameter_update_sub.copy(&pupdate);
// update parameters from storage
ModuleParams::updateParams();
SuperBlock::updateParams();
t_demo_en = _param_t_demo_en.get();
t_demo_len = _param_t_demo_len.get();
}
}
- 此步意在给自定义的局部变量赋值
同时,在TestDemo.hpp文件中订阅_parameter_update_sub消息:
uORB::SubscriptionInterval _parameter_update_sub {ORB_ID(parameter_update), 1_s};
- 在构造函数中,为程序启动时设置强制参数更新:
parameters_update(true);
- 在run函数中,取消参数强制更新,以此提高运行效率:
parameters_update(false);
- 在run函数中调用参数:
if(t_demo_en){
printf("Hello sky! %f\r\n",(double)dt);
} else {
printf("Hello land! %f\r\n",(double)t_demo_len);
}
- 不在parameters_update中更新参数,而是在run中直接使用if(_param_t_demo_en.get()),似乎不会执行else后面的语句
- 在qgc中可以修改自定义的参数T_DEMO_EN和T_DEMO_LEN,并看到相关注释,参数选择范围依据test_demo_params.c中的注释内容进行限制。