调试 - 参数系统¶
在调试机器人系统时,经常会遇到需要频繁调整的参数。Rocos针对这样的场景提供了参数系统,参数系统存储在本地ini文件中,可以通过Client的界面进行修改。
想要修改参数,首先打开Client并切换到“Settings”选项卡(第四栏)。支持的参数类型有:Bool (布尔值)、Int (整数)、Float (浮点数)、String (字符串)。在界面中,可以看到当前所有的参数。想要修改参数,除Bool可以直接点击修改外,其他类型的参数在点击对应的值后会出现修改框,在修改完成后需要按回车键确认修改。
使用参数¶
我们以CircleRun中的代码为例,来讲解如何在c++中使用参数。
1// 1. 引入头文件
2#include "parammanager.h"
3
4// 2. 创建对应的参数
5namespace {
6 double MAX_ACC = 6000; // 最大加速度
7 double MAX_ROT_ACC = 50; // 最大旋转加速度
8 bool DEBUG = false; // 是否开启调试信息可视化
9}
10
11// 3. 在构造函数中读取并初始化参数
12CCircleRun::CCircleRun(){
13 ZSS::ZParamManager::instance()->loadParam(MAX_ACC,"CircleRun/MAX_ACC",6000);
14 ZSS::ZParamManager::instance()->loadParam(MAX_ROT_ACC,"CircleRun/MAX_ROT_ACC",50);
15 ZSS::ZParamManager::instance()->loadParam(DEBUG,"CircleRun/DEBUG",false);
16}
通过上述代码,我们可以在c++中使用参数。其中loadParam函数的参数依次为:参数变量、参数名、默认值。在构造函数中,我们通过loadParam函数读取参数的值,如果参数不存在,则使用默认值。
类似的接口也可以在lua中使用,我们以config.lua中的代码为例:
1IS_YELLOW = CGetSettings("ZAlert/IsYellow","Bool")
2local team = IS_YELLOW and "Yellow" or "Blue"
3IS_TEST_MODE = CGetSettings("ZAlert/"..team.."_IsTest","Bool")
config.lua是rocos的lua框架中最先解析的模块,所以存储了所有需要初始化的参数。在上述代码中,我们通过CGetSettings函数读取参数的值,第一个参数为参数名,第二个参数为参数类型。上述代码读取了ZAlert/IsYellow和ZAlert/xxx_IsTest两个参数的值以确定当前启动队伍的颜色,以及是否使用测试脚本。
参数文件¶
参数文件存储在rocos/ZBin/zss.ini中,如果想要重新初始化,可以直接删除文件。
参数文件被添加到了gitignore中,所以git不会追踪参数的修改。如果需要同步参数,可以手动添加到git中或直接同步文件。
其他接口¶
上述的loadParam完整接口如下:
1 bool loadParam(QChar&, const QString&, QChar d = 0);
2 bool loadParam(int&, const QString&, int d = 0);
3 bool loadParam(double&, const QString&, double d = 0);
4 bool loadParam(QString&, const QString&, QString d = "");
5 bool loadParam(bool&, const QString&, bool d = false);
除了上面使用的loadParam,parammanager还有其他接口可以使用:
1 // 使用参数名直接修改参数
2 bool changeParam(const QString&, const QVariant&);
3 bool changeParam(const QString&, const QString&, const QVariant&);
4
5 // 直接获取value作为返回值,如果参数不存在则返回默认值,一般会配合Qvariant的toXXX函数用作const变量的初始化
6 QVariant value(const QString&, const QVariant& defaultValue = QVariant());
7 QVariant value(const QString&, const QString&, const QVariant& defaultValue = QVariant());
在下一节中,我们会介绍调试系统,并讲解如何使用参数系统来简化调试过程。