Skip to content

Commit 6e7e8a7

Browse files
committed
add set_param interface and implement command-pid
1 parent 52b4f1c commit 6e7e8a7

File tree

7 files changed

+215
-95
lines changed

7 files changed

+215
-95
lines changed

chassis/chassis.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,25 +186,90 @@ static void chassis_move_right(command_info_t info, void *param, rt_uint16_t siz
186186
}
187187
}
188188

189+
// TODO
190+
189191
static void chassis_forward_with_param(command_info_t info, void *param, rt_uint16_t size)
190192
{
191193
if (info->target != RT_NULL)
192194
{
193195
if (size == sizeof(struct cmd_dt_velocity))
194196
{
195197
struct cmd_dt_velocity *velocity_info = (struct cmd_dt_velocity *)param;
198+
if (velocity_info->data.linear_x < 0)
199+
{
200+
return;
201+
}
196202
chassis_straight(info->target, velocity_info->data.linear_x);
197203
}
198204
}
199205
}
200206

207+
// TODO
208+
209+
static void chassis_set_linear_x(command_info_t info, void *param, rt_uint16_t size)
210+
{
211+
if (info->target != RT_NULL)
212+
{
213+
if (size == sizeof(struct cmd_dt_velocity))
214+
{
215+
struct cmd_dt_velocity *velocity_info = (struct cmd_dt_velocity *)param;
216+
chassis_straight(info->target, velocity_info->data.linear_x);
217+
}
218+
}
219+
}
220+
221+
static void chassis_set_pid(command_info_t info, void *param, rt_uint16_t size)
222+
{
223+
if (info->target != RT_NULL)
224+
{
225+
if(size == sizeof(struct cmd_dt_pid))
226+
{
227+
chassis_t chas = (chassis_t)info->target;
228+
struct cmd_dt_pid *pid_info = (struct cmd_dt_pid *)param;
229+
struct controller_param parameter = {
230+
.data.pid.kp = pid_info->kp,
231+
.data.pid.ki = pid_info->ki,
232+
.data.pid.kd = pid_info->kd
233+
};
234+
235+
switch (pid_info->id)
236+
{
237+
case PID_ID_WHEEL_0:
238+
controller_set_param(chas->c_wheels[0]->w_controller, &parameter);
239+
break;
240+
case PID_ID_WHEEL_1:
241+
controller_set_param(chas->c_wheels[1]->w_controller, &parameter);
242+
break;
243+
case PID_ID_WHEEL_2:
244+
if (chas->c_kinematics->total_wheels > 2)
245+
{
246+
controller_set_param(chas->c_wheels[2]->w_controller, &parameter);
247+
}
248+
break;
249+
case PID_ID_WHEEL_3:
250+
if (chas->c_kinematics->total_wheels > 3)
251+
{
252+
controller_set_param(chas->c_wheels[3]->w_controller, &parameter);
253+
}
254+
break;
255+
default:
256+
break;
257+
}
258+
}
259+
}
260+
}
261+
201262
static int chassis_command_register(void)
202263
{
203264
// TODO
204265
command_register(COMMAND_CAR_STOP, chassis_stop);
205266

206267
command_register(COMMAND_CAR_FORWARD_WITH_PARAM, chassis_forward_with_param);
207268

269+
command_register(COMMAND_SET_CAR_VELOCITY_LINEAR_X, chassis_set_linear_x);
270+
271+
command_register(COMMAND_SET_PID, chassis_set_pid);
272+
208273
return RT_EOK;
209274
}
210275

controller/controller.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,10 @@ rt_err_t controller_set_sample_time(controller_t controller, rt_uint16_t sample_
8989
controller->sample_time = sample_time;
9090
return RT_EOK;
9191
}
92+
93+
rt_err_t controller_set_param(controller_t controller, controller_param_t param)
94+
{
95+
RT_ASSERT(controller != RT_NULL);
96+
97+
return controller->set_param(controller, param);
98+
}

controller/controller.h

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,34 @@
33

44
#include <rtthread.h>
55

6+
struct controller_pid_param
7+
{
8+
float kp;
9+
float ki;
10+
float kd;
11+
};
12+
13+
struct controller_param
14+
{
15+
union
16+
{
17+
struct controller_pid_param pid;
18+
} data;
19+
};
20+
21+
typedef struct controller_param *controller_param_t;
22+
623
struct controller
724
{
8-
float target;
9-
float output;
10-
rt_uint16_t sample_time; // unit:ms
11-
int enable;
12-
13-
rt_err_t (*update)(void *controller, float current_point);
14-
rt_err_t (*reset)(void *controller);
15-
rt_err_t (*destroy)(void *controller);
25+
float target;
26+
float output;
27+
rt_uint16_t sample_time; // unit:ms
28+
int enable;
29+
30+
rt_err_t (*update)(void *controller, float current_point);
31+
rt_err_t (*reset)(void *controller);
32+
rt_err_t (*destroy)(void *controller);
33+
rt_err_t (*set_param)(void *controller, controller_param_t param);
1634
};
1735

1836
typedef struct controller *controller_t;
@@ -25,5 +43,5 @@ rt_err_t controller_disable(controller_t controller);
2543
rt_err_t controller_reset(controller_t controller);
2644
rt_err_t controller_set_target(controller_t controller, rt_int16_t target);
2745
rt_err_t controller_set_sample_time(controller_t controller, rt_uint16_t sample_time);
28-
46+
rt_err_t controller_set_param(controller_t controller, controller_param_t param);
2947
#endif // __CONTROLLER_H__

controller/inc_pid_controller.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ static rt_err_t inc_pid_controller_destroy(void *pid)
1616
return RT_EOK;
1717
}
1818

19+
static rt_err_t inc_pid_controller_set_param(void *pid, controller_param_t param)
20+
{
21+
inc_pid_controller_t inc_pid = (inc_pid_controller_t)pid;
22+
23+
inc_pid->kp = param->data.pid.kp;
24+
inc_pid->ki = param->data.pid.ki;
25+
inc_pid->kd = param->data.pid.kd;
26+
27+
return RT_EOK;
28+
}
29+
1930
static rt_err_t inc_pid_controller_update(void *pid, float current_point)
2031
{
2132
inc_pid_controller_t inc_pid = (inc_pid_controller_t)pid;
@@ -88,6 +99,7 @@ inc_pid_controller_t inc_pid_controller_create(float kp, float ki, float kd, rt_
8899
new_pid->controller.reset = inc_pid_controller_reset;
89100
new_pid->controller.destroy = inc_pid_controller_destroy;
90101
new_pid->controller.update = inc_pid_controller_update;
102+
new_pid->controller.set_param = inc_pid_controller_set_param;
91103

92104
return new_pid;
93105
}

controller/pos_pid_controller.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ static rt_err_t pos_pid_controller_destroy(void *pid)
1616
return RT_EOK;
1717
}
1818

19+
static rt_err_t pos_pid_controller_set_param(void *pid, controller_param_t param)
20+
{
21+
pos_pid_controller_t pos_pid = (pos_pid_controller_t)pid;
22+
23+
pos_pid->kp = param->data.pid.kp;
24+
pos_pid->ki = param->data.pid.ki;
25+
pos_pid->kd = param->data.pid.kd;
26+
27+
return RT_EOK;
28+
}
29+
1930
static rt_err_t pos_pid_controller_update(void *pid, float current_point)
2031
{
2132
pos_pid_controller_t pos_pid = (pos_pid_controller_t)pid;
@@ -97,6 +108,7 @@ pos_pid_controller_t pos_pid_controller_create(float kp, float ki, float kd, rt_
97108
new_pid->controller.reset = pos_pid_controller_reset;
98109
new_pid->controller.destroy = pos_pid_controller_destroy;
99110
new_pid->controller.update = pos_pid_controller_update;
111+
new_pid->controller.set_param = pos_pid_controller_set_param;
100112

101113
return new_pid;
102114
}

0 commit comments

Comments
 (0)