调试 - debugEngine¶
在之前的章节中,你可能已经注意到了Client界面上,存在很多用于调试的信息。包括了各色的文字/线条/圆弧等。这一节我们将详细介绍调试系统以及如何使用它快速的调试代码。
调试系统的通讯以及接口定义¶
调试系统可以简单分为Core的发送以及Client的绘制两部分组成,我们直接从Core的发送协议来研究调试系统的接口定义:
1message Debug_Msg {
2 enum Debug_Type {
3 ...
4 }
5 enum Color {
6 ...
7 }
8 Debug_Type type = 1;
9 Color color = 2; // 颜色的enum值
10 Debug_Robot robot = 3; // 机器人
11 Debug_Line line = 4; // 线段
12 Debug_Arc arc = 5; // 圆弧
13 Debug_Polygon polygon = 6; // 多边形
14 Debug_Text text = 7; // 文字
15 Debug_CubicBezier bezier = 8; // 贝塞尔曲线
16 Debug_Points points = 9; // 多个点
17 int32 RGB_value = 10; // custom颜色时的RGB值
18}
19message Debug_Msgs{
20 repeated Debug_Msg msgs = 1;
21}
上述代码来自于zss_debug.proto,这是Core与Client之间的通讯协议,我们可以看到Debug_Msg中包含了很多绘制的信息,包括了线段/圆弧/多边形/文字/贝塞尔曲线/点集等。这些信息会打包成一个Debug_Msgs发送给Client解析并绘制到界面上。
在c++中使用debugEngine¶
在rocos-Core中,调试系统的调用均需要通过全局单例来调用,例如在已有的Skill中,添加如下代码:
1#include "GDebugEngine.h"
2
3// in skill plan function
4void Skill_XXX::plan(...){
5 ...
6 GDebugEngine::Instance()->gui_debug_x(CGeoPoint(0,0));
7 GDebugEngine::Instance()->gui_debug_msg(CGeoPoint(0,0), "Hello World");
8 ...
9}
编译运行代码,你将在Client上看到如下效果:
c++中的调试系统接口在GDebugEngine.h中定义,简化过后的接口如下:
1 // 在指定点绘制叉
2 void gui_debug_x(
3 const CGeoPoint& p, // x符号的位置
4 int debug_color = 1, // 颜色enum值(10为自定义颜色)
5 int RGB_value=0, // 自定义颜色的RGB值
6 const int size = 60 /*mm*/ // x符号的大小
7 );
8
9 // 在指定的多个点绘制叉
10 void gui_debug_points(
11 const std::vector<CGeoPoint> points, // 点集
12 int debug_color = 1, // 颜色enum值(10为自定义颜色)
13 int RGB_value=0 // 自定义颜色的RGB值
14 );
15
16 // 绘制一个线段
17 void gui_debug_line(
18 const CGeoPoint& p1, // 线段的起点
19 const CGeoPoint& p2, // 线段的终点
20 int debug_color = 1, // 颜色enum值(10为自定义颜色)
21 int RGB_value=0 // 自定义颜色的RGB值
22 );
23
24 // 绘制一个圆弧
25 void gui_debug_arc(
26 const CGeoPoint& p, // 圆弧的圆心
27 double r, // 圆弧的半径
28 double start_angle, // 圆弧的起始角度
29 double span_angle, // 圆弧的角度范围
30 int debug_color = 1, // 颜色enum值(10为自定义颜色)
31 int RGB_value=0 // 自定义颜色的RGB值
32 );
33
34 // 绘制一个机器人形状
35 void gui_debug_robot(
36 const CGeoPoint& p, // 机器人的位置
37 double robot_dir, // 机器人的朝向
38 int debug_color = 1, // 颜色enum值(10为自定义颜色)
39 int RGB_value=0 // 自定义颜色的RGB值
40 );
41
42 // 绘制一段text
43 void gui_debug_msg(
44 const CGeoPoint& p, // text的位置
45 const char* msgstr, // text的内容
46 int debug_color = 1, // 颜色enum值(10为自定义颜色)
47 int RGB_value=0, // 自定义颜色的RGB值
48 const double size=120 /*mm*/, // text的大小
49 const int weight=50/*0-100*/ // text的粗细
50 );
在lua中使用debugEngine¶
在lua中使用debugEngine时,接口定义与c++完全一致,定义文件在gdebugengine.pkg中。由于lua的Play中,不存在像skill的plan函数一样的,我们可以封装成函数放进switch函数中,例如:
local drawDebug = function()
debugEngine:gui_debug_msg(CGeoPoint(0,0),"Hello from lua",param.BLUE)
debugEngine:gui_debug_x(CGeoPoint(0,0),param.GREEN)
debugEngine:gui_debug_arc(ball.pos(), 100, 0, 360, param.ORANGE)
debugEngine:gui_debug_msg(ball.pos(), "ball is here!", param.GREEN)
end
return {
firstState = "ready",
["ready"] = {
switch = function()
drawDebug()
end,
match = ""
},
name = "TestScript",
}
在任意脚本中添加上述代码(需要注意name部分配置正确),运行后你将在Client上看到如下效果:
一些框架中已有的调试信息¶
或许你已经注意到了,运行代码时,即使你没有书写任何与调试系统有关的代码,在Client界面中也会有一些调试信息。这些信息是由框架中的调试系统自动生成的,例如:
当前运行的脚本信息/状态信息
是否为Test模式
当前收到的裁判盒指令
这些信息都作为框架的一部分,会在运行时自动显示在Client界面上,方便你快速的了解当前的运行状态。除了这些,你还可以通过更改参数系统的一些选项,来增加调试休息。你甚至可以结合参数系统和调试系统,自己配置自己的调试信息,并在平时训练/比赛中用到他们。
已有的部分调试参数¶
参数 | 用途 | 输出 |
|---|---|---|
| 当 | 具体报错信息 |
| 显示 | 速度/吸球/平挑射/踢球力度 |
| 显示由机器人的反馈信息 | 红外信息/踢球信息 |
| 显示障碍物信息 | 所有机器人用于规划的障碍物的位置/形状 |
| 显示角色匹配信息 | N个机器人匹配M个任务的代价矩阵 |
| 显示路径规划的下一个中间目标点 | 以 |
| 显示最终目标点 | 以 |
| 与 | 截球点/计算中间值 |
配合参数系统的调试流程¶
你可以像当前Rocos系统自带的一些调试参数一样,在书写一个新的脚本或者技能时,通过增加参数来控制调试信息的输出。流程如下:
在你要调试的地方,增加一个参数,例如
Debug/MyDebug,默认为false在你的代码中,增加一个判断,当
Debug/MyDebug为true时,输出调试信息在运行时,通过参数系统,将
Debug/MyDebug设置为true,即可看到调试信息
这样的调试,可以用在lua/c++的任意地方,方便你在调试时快速的开启/关闭调试信息。