9
9
*
10
10
*/
11
11
12
+ #include " mod_engineer_chassis.hpp"
13
+
12
14
#include < random>
13
15
14
16
#include " bsp_time.h"
15
- #include " mod_chassis.hpp"
16
17
17
18
#define ROTOR_WZ_MIN 0 .6f /* 小陀螺旋转位移下界 */
18
19
#define ROTOR_WZ_MAX 0 .8f /* 小陀螺旋转位移上界 */
21
22
22
23
#define MOTOR_MAX_ROTATIONAL_SPEED 7000 .0f /* 电机的最大转速 */
23
24
24
- #if POWER_LIMIT_WITH_CAP
25
- /* 保证电容电量宏定义在正确范围内 */
26
- #if ((CAP_PERCENT_NO_LIM < 0) || (CAP_PERCENT_NO_LIM > 100) || \
27
- (CAP_PERCENT_WORK < 0 ) || (CAP_PERCENT_WORK > 100 ))
28
- #error "Cap percentage should be in the range from 0 to 100."
29
- #endif
30
-
31
- /* 保证电容功率宏定义在正确范围内 */
32
- #if ((CAP_MAX_LOAD < 60) || (CAP_MAX_LOAD > 200))
33
- #error "The capacitor power should be in in the range from 60 to 200."
34
- #endif
35
-
36
- static const float kCAP_PERCENTAGE_NO_LIM = (float )CAP_PERCENT_NO_LIM / 100 .0f ;
37
- static const float kCAP_PERCENTAGE_WORK = (float )CAP_PERCENT_WORK / 100 .0f ;
38
-
39
- #endif
40
-
41
25
using namespace Module ;
42
26
43
27
template <typename Motor, typename MotorParam>
44
28
Chassis<Motor, MotorParam>::Chassis(Param& param, float control_freq)
45
29
: param_(param),
46
30
mode_ (Chassis::RELAX),
47
31
mixer_(param.type),
48
- follow_pid_(param.follow_pid_param, control_freq),
49
32
ctrl_lock_(true ) {
50
33
memset (&(this ->cmd_ ), 0 , sizeof (this ->cmd_ ));
51
34
@@ -70,12 +53,6 @@ Chassis<Motor, MotorParam>::Chassis(Param& param, float control_freq)
70
53
case SET_MODE_RELAX:
71
54
chassis->SetMode (RELAX);
72
55
break ;
73
- case SET_MODE_FOLLOW:
74
- chassis->SetMode (FOLLOW_GIMBAL);
75
- break ;
76
- case SET_MODE_ROTOR:
77
- chassis->SetMode (ROTOR);
78
- break ;
79
56
case SET_MODE_INDENPENDENT:
80
57
chassis->SetMode (INDENPENDENT);
81
58
break ;
@@ -95,26 +72,24 @@ Chassis<Motor, MotorParam>::Chassis(Param& param, float control_freq)
95
72
auto chassis_thread = [](Chassis* chassis) {
96
73
auto cmd_sub =
97
74
Message::Subscriber<Component::CMD::ChassisCMD>(" cmd_chassis" );
98
-
75
+ uint32_t last_online_time = bsp_time_get_ms ();
99
76
while (1 ) {
100
77
/* 读取控制指令、电容、裁判系统、电机反馈 */
101
78
cmd_sub.DumpData (chassis->cmd_ );
102
79
103
80
/* 更新反馈值 */
104
- chassis->PraseRef ();
105
-
106
81
chassis->ctrl_lock_ .Wait (UINT32_MAX);
107
82
chassis->UpdateFeedback ();
108
83
chassis->Control ();
109
84
chassis->ctrl_lock_ .Post ();
110
85
111
86
/* 运行结束,等待下一次唤醒 */
112
- chassis->thread_ .SleepUntil (2 );
87
+ chassis->thread_ .SleepUntil (2 , last_online_time );
113
88
}
114
89
};
115
90
116
- this ->thread_ .Create (chassis_thread, this , " chassis_thread" ,
117
- MODULE_CHASSIS_TASK_STACK_DEPTH, System::Thread::MEDIUM);
91
+ this ->thread_ .Create (chassis_thread, this , " chassis_thread" , 512 ,
92
+ System::Thread::MEDIUM);
118
93
119
94
System::Timer::Create (this ->DrawUIStatic , this , 2100 );
120
95
@@ -152,16 +127,6 @@ void Chassis<Motor, MotorParam>::Control() {
152
127
break ;
153
128
154
129
case Chassis::RELAX:
155
- case Chassis::FOLLOW_GIMBAL: /* 按照云台方向换算运动向量
156
- */
157
- case Chassis::ROTOR: {
158
- float beta = this ->yaw_ ;
159
- float cos_beta = cosf (beta);
160
- float sin_beta = sinf (beta);
161
- this ->move_vec_ .vx = cos_beta * this ->cmd_ .x - sin_beta * this ->cmd_ .y ;
162
- this ->move_vec_ .vy = sin_beta * this ->cmd_ .x + cos_beta * this ->cmd_ .y ;
163
- break ;
164
- }
165
130
case Chassis::REVERSE: {
166
131
this ->move_vec_ .vx = -this ->cmd_ .x ;
167
132
this ->move_vec_ .vy = -this ->cmd_ .y ;
@@ -177,19 +142,6 @@ void Chassis<Motor, MotorParam>::Control() {
177
142
case Chassis::INDENPENDENT: /* 独立模式wz为0 */
178
143
this ->move_vec_ .wz = this ->cmd_ .z ;
179
144
break ;
180
-
181
- case Chassis::FOLLOW_GIMBAL: /* 跟随模式通过PID控制使车头跟随云台
182
- */
183
- this ->move_vec_ .wz =
184
- this ->follow_pid_ .Calculate (0 .0f , this ->yaw_ , this ->dt_ );
185
- break ;
186
-
187
- case Chassis::ROTOR: { /* 小陀螺模式使底盘以一定速度旋转
188
- */
189
- this ->move_vec_ .wz =
190
- this ->wz_dir_mult_ * CalcWz (ROTOR_WZ_MIN, ROTOR_WZ_MAX);
191
- break ;
192
- }
193
145
case Chassis::REVERSE: {
194
146
this ->move_vec_ .wz = this ->cmd_ .z ;
195
147
break ;
@@ -207,21 +159,8 @@ void Chassis<Motor, MotorParam>::Control() {
207
159
/* 根据底盘模式计算输出值 */
208
160
switch (this ->mode_ ) {
209
161
case Chassis::BREAK:
210
- case Chassis::FOLLOW_GIMBAL:
211
- case Chassis::ROTOR:
212
162
case Chassis::REVERSE:
213
163
case Chassis::INDENPENDENT: /* 独立模式,受PID控制 */ {
214
- float percentage = 0 .0f ;
215
- if (cap_.online_ ) {
216
- percentage = cap_.percentage_ ;
217
- } else if (ref_.status == Device::Referee::RUNNING) {
218
- percentage = this ->ref_ .chassis_pwr_buff / 30 .0f ;
219
- } else {
220
- percentage = 1 .0f ;
221
- }
222
-
223
- clampf (&percentage, 0 .0f , 1 .0f );
224
-
225
164
for (unsigned i = 0 ; i < this ->mixer_ .len_ ; i++) {
226
165
float out = this ->actuator_ [i]->Calculate (
227
166
this ->setpoint_ .motor_rotational_speed [i] *
@@ -243,15 +182,6 @@ void Chassis<Motor, MotorParam>::Control() {
243
182
}
244
183
}
245
184
246
- template <typename Motor, typename MotorParam>
247
- void Chassis<Motor, MotorParam>::PraseRef() {
248
- this ->ref_ .chassis_power_limit =
249
- this ->raw_ref_ .robot_status .chassis_power_limit ;
250
- this ->ref_ .chassis_pwr_buff = this ->raw_ref_ .power_heat .chassis_pwr_buff ;
251
- this ->ref_ .chassis_watt = this ->raw_ref_ .power_heat .chassis_watt ;
252
- this ->ref_ .status = this ->raw_ref_ .status ;
253
- }
254
-
255
185
template <typename Motor, typename MotorParam>
256
186
float Chassis<Motor, MotorParam>::CalcWz(const float LO, const float HI) {
257
187
float wz_vary = fabsf (0 .2f * sinf (ROTOR_OMEGA * this ->now_ )) + LO;
@@ -265,10 +195,6 @@ void Chassis<Motor, MotorParam>::SetMode(Chassis::Mode mode) {
265
195
return ; /* 模式未改变直接返回 */
266
196
}
267
197
268
- if (mode == Chassis::ROTOR && this ->mode_ != Chassis::ROTOR) {
269
- std::srand (this ->now_ );
270
- this ->wz_dir_mult_ = (std::rand () % 2 ) ? -1 : 1 ;
271
- }
272
198
/* 切换模式后重置PID和滤波器 */
273
199
for (size_t i = 0 ; i < this ->mixer_ .len_ ; i++) {
274
200
this ->actuator_ [i]->Reset ();
@@ -294,14 +220,6 @@ void Chassis<Motor, MotorParam>::DrawUIStatic(
294
220
295
221
/* 更新底盘模式选择框 */
296
222
switch (chassis->mode_ ) {
297
- case FOLLOW_GIMBAL:
298
- box_pos_left = REF_UI_MODE_OFFSET_2_LEFT;
299
- box_pos_right = REF_UI_MODE_OFFSET_2_RIGHT;
300
- break ;
301
- case ROTOR:
302
- box_pos_left = REF_UI_MODE_OFFSET_4_LEFT;
303
- box_pos_right = REF_UI_MODE_OFFSET_4_RIGHT;
304
- break ;
305
223
case INDENPENDENT:
306
224
box_pos_left = REF_UI_MODE_OFFSET_3_LEFT;
307
225
box_pos_right = REF_UI_MODE_OFFSET_3_RIGHT;
@@ -342,14 +260,6 @@ void Chassis<Motor, MotorParam>::DrawUIDynamic(
342
260
343
261
/* 更新底盘模式选择框 */
344
262
switch (chassis->mode_ ) {
345
- case FOLLOW_GIMBAL:
346
- box_pos_left = REF_UI_MODE_OFFSET_2_LEFT;
347
- box_pos_right = REF_UI_MODE_OFFSET_2_RIGHT;
348
- break ;
349
- case ROTOR:
350
- box_pos_left = REF_UI_MODE_OFFSET_4_LEFT;
351
- box_pos_right = REF_UI_MODE_OFFSET_4_RIGHT;
352
- break ;
353
263
case RELAX:
354
264
355
265
case BREAK:
0 commit comments