建設網(wǎng)站考慮因素寧波seo網(wǎng)絡推廣定制多少錢
無人機 PX4 飛控 | PX4源碼添加自定義參數(shù)方法并用QGC顯示與調整
0 前言
之前文章添加了一個自定義的模塊,本篇文章在之前的自定義模塊中,添加兩個自定義參數(shù)
使用QGC顯示出來,并通過QGC調整參數(shù)值,代碼實現(xiàn)參數(shù)更新
新增的參數(shù)放在 jone_demo_params.c文件里面
之前定義的模塊中,一直在終端打印一個消息,本節(jié)中設置一個bool型參數(shù),為1 打印一個消息,為0 打印另一個消息
并且設置一個float型參數(shù),將該參數(shù)值打印出來
1 PX4 添加自定義參數(shù)方法
PX4定義參數(shù) 在具體模塊的 **_params.c文件中進行
通過函數(shù) PARAM_DEFINE**(),例如:
- PARAM_DEFINE_INT32 定義整型參數(shù)
- PARAM_DEFINE_FLOAT 定義浮點型參數(shù)
目前只有這兩種類型
PARAM_DEFINE**() 函數(shù)的上面有注釋
[!NOTE]
注意:注釋是有格式要求的,不能隨意寫,為了在QGC中進行顯示,與參數(shù)的自動化處理
注釋的格式如下:
/** 第一行
*短注釋
*長注釋
*標簽
PARAM_DEFINE**()
標簽以@為開頭,標簽的內根據(jù)參數(shù)的類型來定,具體有:
-
@unit 單位16
-
@min 最小值16
-
@max 最大值
-
@value 各值代表的不同含義
- @boolean 布爾型參數(shù)
- @decimal 指定參數(shù)值的小數(shù)位數(shù)
- @increment 參數(shù)的調整步長。
- @group 分組
PARAM_DEFINE**() 函數(shù)的 參數(shù),第一個為定義的參數(shù)名稱,第二個為默認值:
- 參數(shù)名稱
[!NOTE]
注意參數(shù)的名字不能超過16個字符
- 默認值
下面是原有PX4定義好的參數(shù)的例子:
浮點型參數(shù)
/*** VTOL Takeoff relative loiter altitude.** Altitude relative to home at which vehicle will loiter after front transition.** @unit m* @min 20* @max 300* @decimal 1* @increment 1* @group VTOL Takeoff*/
PARAM_DEFINE_FLOAT(VTO_LOITER_ALT, 80);
整型參數(shù)
/*** Maximum number of search attempts** Maximum number of times to search for the landing target if it is lost during the precision landing.** @min 0* @max 100* @group Precision Land*/
PARAM_DEFINE_INT32(PLD_MAX_SRCH, 3);
具體的參數(shù)自動處理代碼在Tools/module_config 下面的幾個python文件中,例如 generate_params.py 中的核心代碼:
# get the type and extract all tagstags = '@group {:}'.format(param_group)if param['type'] == 'enum':param_type = 'INT32'for key in param['values']:tags += '\n * @value {:} {:}'.format(key, param['values'][key])elif param['type'] == 'bitmask':param_type = 'INT32'for key in param['bit']:tags += '\n * @bit {:} {:}'.format(key, param['bit'][key])max_val = max(key for key in param['bit'])tags += '\n * @min 0'tags += '\n * @max {:}'.format((1<<(max_val+1)) - 1)elif param['type'] == 'boolean':param_type = 'INT32'tags += '\n * @boolean'elif param['type'] == 'int32':param_type = 'INT32'elif param['type'] == 'float':param_type = 'FLOAT'else:raise Exception("unknown param type {:}".format(param['type']))
2 代碼實踐
2.1 定義參數(shù)
定義一個bool型變量,來控制打印消息a還是b
分組為 demo
/*** print msg a or b** Control print msg a or b** @boolean* @group demo*/
PARAM_DEFINE_INT32(PRINT_MSG_A_EN, 1);
定義一個float型變量,在打印時,打印該值
單位 隨便定義為s
最小值為0.2 ,最大值為1.0
小數(shù)精度為2
增量步長為0.01
分組為demo
/*** print number** Print number value** @unit s* @min 0.2* @max 1.0* @decimal 2* @increment 0.01* @group demo*/
PARAM_DEFINE_FLOAT(PRINT_NUM_VALUE, 0.4f);
2.2 使用參數(shù)
下面是如何使用上面定義的兩個參數(shù)
在 JoneDemo.hpp 文件中的類聲明中的私有變量區(qū)加入如下內容
DEFINE_PARAMETERS((ParamFloat<px4::params::PRINT_NUM_VALUE>) _param_print_num_value,(ParamBool<px4::params::PRINT_MSG_A_EN>) _param_print_msg_a_enable,);
DEFINE_PARAMETERS 就是固定使用之前參數(shù)文件定義的參數(shù)的函數(shù)方法,按照這個格式寫
px4::params::+定義參數(shù)名稱 后面跟 代碼中對應的變量
[!NOTE]
注意:參數(shù)對應的變量不能直接使用,在使用該值的時候需要使用.get()函數(shù),更改值的時候使用.set()函數(shù).
否則編譯報錯
在 JoneDemo.cpp 的Run()函數(shù)中加入 使用該兩個變量的代碼
if(_param_print_msg_a_enable.get()){printf("MSG a print value : %f \r\n",(double)_param_print_num_value.get());}else{printf("hello jone\r\n");}
2.3 參數(shù)更新
參數(shù)更新
如果不進行下面的參數(shù)更新的操作,那么在使用的時候QGC里改了參數(shù),代碼里不會改
涉及到的函數(shù):parameters_update(bool force)
在里面加入內容:
// check for parameter updatesif (_parameter_update_sub.updated() || force) {// clear updateparameter_update_s pupdate;_parameter_update_sub.copy(&pupdate);// update parameters from storageModuleParams::updateParams();SuperBlock::updateParams();printMsgAEnable = _param_print_msg_a_enable.get();printNumValue = _param_print_num_value.get();}
前面四行是固定的,檢測的參數(shù)更新時進行更新
最后兩行則是新定義了兩個變量,對應更新到的參數(shù),這樣更新后就被賦值了,不用在后面執(zhí)行是一直執(zhí)行get()函數(shù)
_parameter_update_sub 變量需要在JoneDemo.hpp文件聲明
uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};
在構造函數(shù)中,加入強制執(zhí)行參數(shù)更新一次,這樣上電,變量就會獲得參數(shù)
parameters_update(true);
然后再后面的Run函數(shù)中,之前本身就有parameters_update(false); 也就是檢測到參數(shù)變化了才會更新一次
在JoneDemo.hpp文件中的私有區(qū),定義這兩個變量就行
float printNumValue;bool printMsgAEnable;
對應的JoneDemo.cpp 文件中的cpp函數(shù),則改為使用這兩個變量
if(printMsgAEnable){printf("MSG a print value : %f \r\n",(double)printNumValue);}else{printf("hello jone\r\n");}
3 測試
刪除掉原來的build文件夾下的px4_sitl_default
然后再編譯
make px4_sitl_default
再執(zhí)行
make px4_sitl_default gazebo
終端打印出了應該輸出的內容
打開QGC,打開參數(shù)列表,先點擊刷新
然后搜索定義的那兩個變量名
第1個bool變量PRINT_MSG_A_EN
可以看到再選擇值里面可以選擇 Enabled和Disabled,就是因為參數(shù)定義時,聲明了標簽:@boolean
同樣可以看到長注釋:Control print msg a or b
此時將 該變量改為Disabled
終端按照代碼邏輯輸出了:hello jone
第二個看那個float型參數(shù):PRINT_NUM_VALUE
數(shù)字后面有個s,就是單位的標簽
有最小值和最大值的標簽,小數(shù)點后面有兩位,就是@decimal 2的標簽
此時將 該變量改為0.26,則終端對應打印的數(shù)據(jù)也進行改變
這樣就完成了在PX4中,添加自定義bool型、float型的參數(shù)與測試。