自瞄,底盘低通滤波

This commit is contained in:
zyxxj 2024-03-27 04:10:50 +08:00
parent a0b54b3cdd
commit 5a320042a0
22 changed files with 7080 additions and 7018 deletions

View File

@ -22,6 +22,7 @@
#include "bsp_dwt.h"
#include "referee_UI.h"
#include "arm_math.h"
#include "user_lib.h"
#include "vofa.h"
@ -43,9 +44,11 @@ attitude_t *Chassis_IMU_data;
static Publisher_t *chassis_pub; // 用于发布底盘的数据
static Subscriber_t *chassis_sub; // 用于订阅底盘的控制命令
#endif // !ONE_BOARD
static Chassis_Ctrl_Cmd_s chassis_cmd_recv ; // 底盘接收到的控制命令
static Chassis_Ctrl_Cmd_s chassis_cmd_recv; // 底盘接收到的控制命令
static Chassis_Upload_Data_s chassis_feedback_data; // 底盘回传的反馈数据
static Chassis_Ctrl_Cmd_s Chassis_Power_Mx;
const static float CHASSIS_ACCEL_X_NUM=0.1666666667f;
const static float CHASSIS_ACCEL_Y_NUM=0.3333333333f;
@ -58,6 +61,8 @@ static DJIMotorInstance *motor_lf, *motor_rf, *motor_lb, *motor_rb; // left righ
/* 私有函数计算的中介变量,设为静态避免参数传递的开销 */
static float chassis_vx, chassis_vy; // 将云台系的速度投影到底盘
static float vt_lf, vt_rf, vt_lb, vt_rb; // 底盘速度解算后的临时输出,待进行限幅
first_order_filter_type_t vx_filter;
first_order_filter_type_t vy_filter;
void ChassisInit() {
// 四个轮子的参数一样,改tx_id和反转标志位即可
@ -117,6 +122,9 @@ void ChassisInit() {
}};
cap = SuperCapInit(&cap_conf); // 超级电容初始化
//用一阶滤波代替斜波函数生成
first_order_filter_init(&vx_filter, 0.002f, &CHASSIS_ACCEL_X_NUM);
first_order_filter_init(&vx_filter, 0.002f, &CHASSIS_ACCEL_Y_NUM);
// PowerMeter_Init_Config_s
// 发布订阅初始化,如果为双板,则需要can comm来传递消息
@ -270,7 +278,9 @@ void ChassisTask() {
chassis_vx = chassis_cmd_recv.vx * cos_theta - chassis_cmd_recv.vy * sin_theta;
chassis_vy = chassis_cmd_recv.vx * sin_theta + chassis_cmd_recv.vy * cos_theta;
//一阶低通滤波计算
first_order_filter_cali(&vx_filter, chassis_vx);
first_order_filter_cali(&vy_filter, chassis_vy);
// 根据控制模式进行正运动学解算,计算底盘输出
//MecanumCalculate();
OmniCalculate();

View File

@ -119,8 +119,7 @@ static void CalcOffsetAngle() {
* @brief ()
*
*/
static void update_ui_data()
{
static void update_ui_data() {
ui_data.chassis_mode = chassis_cmd_send.chassis_mode;
ui_data.gimbal_mode = gimbal_cmd_send.gimbal_mode;
ui_data.friction_mode = shoot_cmd_send.friction_mode;
@ -129,6 +128,51 @@ static void update_ui_data()
ui_data.Chassis_Power_Data.chassis_power_mx = referee_data->GameRobotState.chassis_power_limit;
}
static void auto_aim_mode() {
trajectory_cal.v0 = 25; //弹速30
if (vision_recv_data->x == 0 && vision_recv_data->y == 0 && vision_recv_data->z == 0
&& vision_recv_data->vx == 0 && vision_recv_data->vy == 0 && vision_recv_data->vz == 0) {
aim_select.suggest_fire = 0;
//未发现目标
no_find_cnt++;
if (no_find_cnt >= 2000) {
//gimbal_scan_flag = 1;
//auto_aim_flag = 0;
}
//else
//auto_aim_flag = 1;
} else {
//弹道解算
no_find_cnt = 0;
auto_aim_flag = 1;
auto_aim(&aim_select, &trajectory_cal, vision_recv_data);
VisionSetAim(aim_select.aim_point[0], aim_select.aim_point[1], aim_select.aim_point[2]);
float single_angle_yaw_now = gimbal_fetch_data.gimbal_imu_data.Yaw;
float diff_yaw = trajectory_cal.cmd_yaw * 180 / PI - single_angle_yaw_now;
float yaw_err = diff_yaw;
if(diff_yaw>180)
diff_yaw -= 360;
else if(diff_yaw<-180)
diff_yaw += 360;
gimbal_cmd_send.yaw = gimbal_fetch_data.gimbal_imu_data.YawTotalAngle + diff_yaw;
gimbal_cmd_send.pitch = -trajectory_cal.cmd_pitch * 180 / PI;
if (yaw_err <= 3) //3度
{
aim_select.suggest_fire = 1;
}
else
aim_select.suggest_fire = 0;
}
}
static void RemoteControlSet() {
// 控制底盘和云台运行模式,云台待添加,云台是否始终使用IMU数据?
if (switch_is_down(rc_data[TEMP].rc.switch_right)) // 右侧开关状态[下],小陀螺
@ -167,38 +211,7 @@ static void RemoteControlSet() {
}
// 左侧开关状态为[下],视觉模式
if (switch_is_down(rc_data[TEMP].rc.switch_left)) {
trajectory_cal.v0 = 25; //弹速30
if (vision_recv_data->x == 0 && vision_recv_data->y == 0 && vision_recv_data->z == 0
&& vision_recv_data->vx == 0 && vision_recv_data->vy == 0 && vision_recv_data->vz == 0) {
aim_select.suggest_fire = 0;
//未发现目标
no_find_cnt++;
if (no_find_cnt >= 2000) {
//gimbal_scan_flag = 1;
//auto_aim_flag = 0;
}
//else
//auto_aim_flag = 1;
} else {
//弹道解算
no_find_cnt = 0;
auto_aim_flag = 1;
auto_aim(&aim_select, &trajectory_cal, vision_recv_data);
VisionSetAim(aim_select.aim_point[0], aim_select.aim_point[1], aim_select.aim_point[2]);
gimbal_cmd_send.yaw = truncf(gimbal_fetch_data.gimbal_imu_data.YawTotalAngle / 360) + trajectory_cal.cmd_yaw * 180 / PI;
gimbal_cmd_send.pitch = trajectory_cal.cmd_pitch * 180 / PI;
float yaw_err = fabsf(gimbal_cmd_send.yaw - gimbal_fetch_data.gimbal_imu_data.Yaw);
if (yaw_err <= 5) //3度
aim_select.suggest_fire = 1;
else
aim_select.suggest_fire = 0;
}
auto_aim_mode();
}
// 云台软件限位
@ -244,41 +257,6 @@ static void hand_aim_mode() {
}
static void auto_aim_mode() {
trajectory_cal.v0 = 25; //弹速30
if (vision_recv_data->x == 0 && vision_recv_data->y == 0 && vision_recv_data->z == 0
&& vision_recv_data->vx == 0 && vision_recv_data->vy == 0 && vision_recv_data->vz == 0) {
aim_select.suggest_fire = 0;
//未发现目标
no_find_cnt++;
if (no_find_cnt >= 2000) {
//gimbal_scan_flag = 1;
//auto_aim_flag = 0;
}
//else
//auto_aim_flag = 1;
} else {
//弹道解算
no_find_cnt = 0;
auto_aim_flag = 1;
auto_aim(&aim_select, &trajectory_cal, vision_recv_data);
VisionSetAim(aim_select.aim_point[0], aim_select.aim_point[1], aim_select.aim_point[2]);
gimbal_cmd_send.yaw = truncf(gimbal_fetch_data.gimbal_imu_data.YawTotalAngle / 360) + trajectory_cal.cmd_yaw * 180 / PI;
gimbal_cmd_send.pitch = trajectory_cal.cmd_pitch * 180 / PI;
float yaw_err = fabsf(gimbal_cmd_send.yaw - gimbal_fetch_data.gimbal_imu_data.Yaw);
if (yaw_err <= 5) //3度
aim_select.suggest_fire = 1;
else
aim_select.suggest_fire = 0;
}
}
/**
* @brief
*
@ -310,10 +288,7 @@ static void MouseKeySet() {
vision_recv_data->vz == 0))
{
shoot_cmd_send.load_mode = LOAD_STOP;
}
else {
} else {
auto_aim_mode();
if (aim_select.suggest_fire == 1 && rc_data[TEMP].mouse.press_l &&
shoot_cmd_send.friction_mode == FRICTION_ON) {
@ -432,7 +407,7 @@ void RobotCMDTask() {
EmergencyHandler(); // 处理模块离线和遥控器急停等紧急情况
// 设置视觉发送数据,还需增加加速度和角速度数据
VisionSetFlag(referee_data->referee_id.Robot_Color);
VisionSetFlag(!referee_data->referee_id.Robot_Color);
//根据裁判系统反馈确定底盘功率上限
chassis_cmd_send.chassis_power_limit = referee_data->GameRobotState.chassis_power_limit;

View File

@ -124,4 +124,15 @@ CMakeFiles/basic_framework.elf.dir/application/chassis/chassis.c.obj: \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/mpu_wrappers.h \
D:\zhandui\cqdm\basic_framework\modules/general_def.h \
D:\zhandui\cqdm\basic_framework\modules\referee/referee_UI.h \
D:\zhandui\cqdm\basic_framework\modules\algorithm/user_lib.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS/cmsis_os.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/task.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/list.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/timers.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/task.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/queue.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/semphr.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/queue.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/event_groups.h \
D:\zhandui\cqdm\basic_framework\Middlewares\Third_Party\FreeRTOS\Source\include/timers.h \
D:\zhandui\cqdm\basic_framework\modules\vofa/vofa.h

View File

@ -4154,6 +4154,17 @@ CMakeFiles/basic_framework.elf.dir/application/chassis/chassis.c.obj
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h
D:/zhandui/cqdm/basic_framework/modules/general_def.h
D:/zhandui/cqdm/basic_framework/modules/referee/referee_UI.h
D:/zhandui/cqdm/basic_framework/modules/algorithm/user_lib.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/task.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/list.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/task.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h
D:/zhandui/cqdm/basic_framework/modules/vofa/vofa.h
CMakeFiles/basic_framework.elf.dir/application/cmd/robot_cmd.c.obj

View File

@ -4081,6 +4081,17 @@ CMakeFiles/basic_framework.elf.dir/application/chassis/chassis.c.obj: D:/zhandui
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \
D:/zhandui/cqdm/basic_framework/modules/general_def.h \
D:/zhandui/cqdm/basic_framework/modules/referee/referee_UI.h \
D:/zhandui/cqdm/basic_framework/modules/algorithm/user_lib.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/task.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/list.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/task.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h \
D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h \
D:/zhandui/cqdm/basic_framework/modules/vofa/vofa.h
CMakeFiles/basic_framework.elf.dir/application/cmd/robot_cmd.c.obj: D:/zhandui/cqdm/basic_framework/application/cmd/robot_cmd.c \

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -212,3 +212,33 @@ void MatInit(mat *m, uint8_t row, uint8_t col)
m->numRows = row;
m->pData = (float *)zmalloc(row * col * sizeof(float));
}
/**
* @brief
* @author RM
* @param[in]
* @param[in] s
* @param[in]
* @retval
*/
void first_order_filter_init(first_order_filter_type_t *first_order_filter_type, float frame_period, const float num[1])
{
first_order_filter_type->frame_period = frame_period;
first_order_filter_type->num[0] = num[0];
first_order_filter_type->input = 0.0f;
first_order_filter_type->out = 0.0f;
}
/**
* @brief
* @author RM
* @param[in]
* @param[in] s
* @retval
*/
void first_order_filter_cali(first_order_filter_type_t *first_order_filter_type, float input)
{
first_order_filter_type->input = input;
first_order_filter_type->out =
first_order_filter_type->num[0] / (first_order_filter_type->num[0] + first_order_filter_type->frame_period) * first_order_filter_type->out + first_order_filter_type->frame_period / (first_order_filter_type->num[0] + first_order_filter_type->frame_period) * first_order_filter_type->input;
}

View File

@ -53,6 +53,13 @@ void MatInit(mat *m, uint8_t row, uint8_t col);
#ifndef PI
#define PI 3.14159265354f
#endif
typedef __packed struct
{
float input; //输入数据
float out; //滤波输出的数据
float num[1]; //滤波参数
float frame_period; //滤波的时间间隔 单位 s
} first_order_filter_type_t;
#define VAL_LIMIT(val, min, max) \
do \
@ -120,6 +127,10 @@ void Cross3d(float *v1, float *v2, float *res);
float Dot3d(float *v1, float *v2);
float AverageFilter(float new_data, float *buf, uint8_t len);
//一阶低通滤波初始化
void first_order_filter_init(first_order_filter_type_t *first_order_filter_type, float frame_period, const float num[1]);
//一阶低通滤波计算
void first_order_filter_cali(first_order_filter_type_t *first_order_filter_type, float input);
#define rad_format(Ang) loop_float_constrain((Ang), -PI, PI)

View File

@ -162,7 +162,7 @@ void INS_Task(void) {
INS.YawTotalAngle = QEKF_INS.YawTotalAngle;
//VisionSetAltitude(INS.Yaw, INS.Pitch, INS.Roll);
VisionSetAltitude(INS.Yaw * PI / 180, INS.Roll * PI / 180);
VisionSetAltitude(INS.Yaw * PI / 180, -INS.Roll * PI / 180);
}
// temperature control

View File

@ -103,7 +103,6 @@ void MyUIInit()
UICharDraw(&UI_State_dyn[4], "sd4", UI_Graph_ADD, 8, UI_Color_Pink, 15, 2, 270, 550, "open ");
UICharRefresh(&referee_recv_info->referee_id, UI_State_dyn[4]);
// 底盘功率显示,静态
UICharDraw(&UI_State_sta[5], "ss5", UI_Graph_ADD, 8, UI_Color_Green, 18, 2, 620, 230, "Power_MAX:");
UICharRefresh(&referee_recv_info->referee_id, UI_State_sta[5]);

View File

@ -33,6 +33,7 @@ void OnProjectLoad (void) {
//
// User settings
//
Project.SetOSPlugin ("FreeRTOSPlugin_CM4");
Edit.SysVar (VAR_HSS_SPEED, FREQ_500_HZ);
File.Open ("$(ProjectDir)/cmake-build-debug/basic_framework.elf");
}

View File

@ -1,32 +1,38 @@
OpenDocument="main.c", FilePath="D:/zhandui/cqdm/basic_framework/Src/main.c", Line=64
OpenDocument="bsp_dwt.c", FilePath="D:/zhandui/cqdm/basic_framework/bsp/dwt/bsp_dwt.c", Line=79
OpenDocument="xs.jdebug", FilePath="D:/zhandui/cqdm/basic_framework/xs.jdebug", Line=0
OpenDocument="ins_task.c", FilePath="D:/zhandui/cqdm/basic_framework/modules/imu/ins_task.c", Line=192
OpenDocument="referee_task.c", FilePath="D:/zhandui/cqdm/basic_framework/modules/referee/referee_task.c", Line=75
OpenDocument="main.c", FilePath="D:/zhandui/cqdm/basic_framework/Src/main.c", Line=63
OpenDocument="bsp_dwt.c", FilePath="D:/zhandui/cqdm/basic_framework/bsp/dwt/bsp_dwt.c", Line=75
OpenDocument="startup_stm32f407ighx.s", FilePath="D:/zhandui/cqdm/basic_framework/Startup/startup_stm32f407ighx.s", Line=46
OpenDocument="stm32f4xx_it.c", FilePath="D:/zhandui/cqdm/basic_framework/Src/stm32f4xx_it.c", Line=102
OpenDocument="controller.c", FilePath="D:/zhandui/cqdm/basic_framework/modules/algorithm/controller.c", Line=133
OpenDocument="controller.h", FilePath="D:/zhandui/cqdm/basic_framework/modules/algorithm/controller.h", Line=42
OpenDocument="SEGGER_RTT.c", FilePath="D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/SEGGER/RTT/SEGGER_RTT.c", Line=1181
OpenDocument="gimbal.c", FilePath="D:/zhandui/cqdm/basic_framework/application/gimbal/gimbal.c", Line=105
OpenDocument="chassis.c", FilePath="D:/zhandui/cqdm/basic_framework/application/chassis/chassis.c", Line=51
OpenDocument="chassis.c", FilePath="D:/zhandui/cqdm/basic_framework/application/chassis/chassis.c", Line=180
OpenDocument="tasks.c", FilePath="D:/zhandui/cqdm/basic_framework/Middlewares/Third_Party/FreeRTOS/Source/tasks.c", Line=3394
OpenToolbar="Debug", Floating=0, x=0, y=0
OpenWindow="Source Files", DockArea=LEFT, x=0, y=0, w=651, h=534, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Disassembly", DockArea=RIGHT, x=0, y=0, w=1649, h=158, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Memory 1", DockArea=BOTTOM, x=3, y=0, w=929, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, EditorAddress=0x30A3D70C
OpenWindow="Watched Data 1", DockArea=LEFT, x=0, y=1, w=651, h=558, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Terminal", DockArea=BOTTOM, x=0, y=0, w=645, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Data Sampling", DockArea=BOTTOM, x=2, y=0, w=379, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, VisibleTab=0, UniformSampleSpacing=0
OpenWindow="Timeline", DockArea=RIGHT, x=0, y=1, w=1649, h=934, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=1, DataPaneShown=1, PowerPaneShown=0, CodePaneShown=0, PinCursor="Cursor Movable", TimePerDiv="2 s / Div", TimeStampFormat="Time", DataGraphDrawAsPoints=0, DataGraphLegendShown=1, DataGraphUniformSampleSpacing=0, DataGraphLegendPosition="0;0", DataGraphShowNamesAtCursor=0, PowerGraphDrawAsPoints=0, PowerGraphLegendShown=0, PowerGraphAvgFilterTime=Off, PowerGraphAvgFilterLen=Off, PowerGraphUniformSampleSpacing=0, PowerGraphLegendPosition="1422;-71", CodeGraphLegendShown=0, CodeGraphLegendPosition="1438;0"
OpenWindow="Console", DockArea=BOTTOM, x=1, y=0, w=604, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Source Files", DockArea=LEFT, x=0, y=0, w=651, h=544, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Memory 1", DockArea=BOTTOM, x=3, y=0, w=1045, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, EditorAddress=0x30A3D70C
OpenWindow="Watched Data 1", DockArea=LEFT, x=0, y=1, w=651, h=568, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Terminal", DockArea=BOTTOM, x=0, y=0, w=725, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
OpenWindow="Data Sampling", DockArea=BOTTOM, x=2, y=0, w=426, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0, VisibleTab=0, UniformSampleSpacing=0
OpenWindow="Console", DockArea=BOTTOM, x=1, y=0, w=681, h=328, FilterBarShown=0, TotalValueBarShown=0, ToolBarShown=0
SmartViewPlugin="", Page="", Toolbar="Hidden", Window="SmartView 1"
TableHeader="Source Files", SortCol="File", SortOrder="ASCENDING", VisibleCols=["File";"Status";"Size";"#Insts";"Path"], ColWidths=[263;100;100;100;950]
TableHeader="Data Sampling Table", SortCol="None", SortOrder="ASCENDING", VisibleCols=["Index";"Time"], ColWidths=[100;100]
TableHeader="Data Sampling Setup", SortCol="Expression", SortOrder="ASCENDING", VisibleCols=["Expression";"Type";"Value";"Min";"Max";"Average";"# Changes";"Min. Change";"Max. Change"], ColWidths=[438;100;100;100;100;100;110;126;126]
TableHeader="Power Sampling", SortCol="None", SortOrder="ASCENDING", VisibleCols=["Index";"Time";"Ch 0"], ColWidths=[100;100;100]
TableHeader="Watched Data 1", SortCol="Expression", SortOrder="ASCENDING", VisibleCols=["Expression";"Value";"Location";"Refresh"], ColWidths=[238;100;104;183]
TableHeader="Task List", SortCol="None", SortOrder="ASCENDING", VisibleCols=["Name";"Run Count";"Priority";"Status";"Timeout";"Stack Info";"ID";"Mutex Count";"Notified Value";"Notify State"], ColWidths=[110;110;110;110;110;110;110;110;110;110]
TableHeader="Watched Data 1", SortCol="Expression", SortOrder="ASCENDING", VisibleCols=["Expression";"Value";"Location";"Refresh"], ColWidths=[238;100;104;209]
TableHeader="RegisterSelectionDialog", SortCol="None", SortOrder="ASCENDING", VisibleCols=[], ColWidths=[]
TableHeader="TargetExceptionDialog", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Value";"Address";"Description"], ColWidths=[27;27;27;685]
TableHeader="TargetExceptionDialog", SortCol="Name", SortOrder="ASCENDING", VisibleCols=["Name";"Value";"Address";"Description"], ColWidths=[27;27;27;27]
WatchedExpression="yaw_motor", RefreshRate=2, Window=Watched Data 1
WatchedExpression="pitch_motor", RefreshRate=2, Window=Watched Data 1
WatchedExpression="motor_rf", RefreshRate=2, Window=Watched Data 1
WatchedExpression="motor_rf", RefreshRate=2, Window=Watched Data 1
WatchedExpression="referee_data", RefreshRate=2, Window=Watched Data 1
WatchedExpression="referee_recv_info", Window=Watched Data 1
WatchedExpression="chassis_power_limit", Window=Watched Data 1
WatchedExpression="chassis_cmd_recv", RefreshRate=2, Window=Watched Data 1