HPM SDK
HPMicro Software Development Kit
hpm_mcl_hybrid_ctrl.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 #ifndef HPM_MCL_HYBRID_CTRL_H
8 #define HPM_MCL_HYBRID_CTRL_H
9 
10 #include "hpm_mcl_common.h"
11 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
32 typedef struct {
33  float kp;
34  float kd;
35  float tau_ff;
36  float q_des;
37  float dq_des;
38  float tau_max;
39  float tau_min;
43 
47 typedef struct {
48  float q_actual;
49  float dq_actual;
50  float tau_output;
51  float pos_error;
52  float vel_error;
53  float speed_lpf;
55 
73 
86 
95 static inline void mcl_hybrid_ctrl_set_kp(mcl_hybrid_ctrl_cfg_t *cfg, float kp)
96 {
97  cfg->kp = kp;
98 }
99 
106 static inline void mcl_hybrid_ctrl_set_kd(mcl_hybrid_ctrl_cfg_t *cfg, float kd)
107 {
108  cfg->kd = kd;
109 }
110 
118 static inline void mcl_hybrid_ctrl_set_tau_ff(mcl_hybrid_ctrl_cfg_t *cfg, float tau_ff)
119 {
120  cfg->tau_ff = tau_ff;
121 }
122 
129 static inline void mcl_hybrid_ctrl_set_position(mcl_hybrid_ctrl_cfg_t *cfg, float q_des)
130 {
131  cfg->q_des = q_des;
132 }
133 
141 static inline void mcl_hybrid_ctrl_set_velocity(mcl_hybrid_ctrl_cfg_t *cfg, float dq_des)
142 {
143  cfg->dq_des = dq_des;
144 }
145 
153 static inline void mcl_hybrid_ctrl_set_limits(mcl_hybrid_ctrl_cfg_t *cfg, float tau_min, float tau_max)
154 {
155  cfg->tau_min = tau_min;
156  cfg->tau_max = tau_max;
157 }
158 
167 static inline void mcl_hybrid_ctrl_set_speed_filter(mcl_hybrid_ctrl_cfg_t *cfg, float lpf_alpha, float deadzone)
168 {
169  cfg->speed_lpf_alpha = lpf_alpha;
170  cfg->speed_deadzone = deadzone;
171 }
172 
181 static inline void mcl_hybrid_ctrl_set_params(mcl_hybrid_ctrl_cfg_t *cfg, float kp, float kd, float tau_ff)
182 {
183  cfg->kp = kp;
184  cfg->kd = kd;
185  cfg->tau_ff = tau_ff;
186 }
187 
195 static inline void mcl_hybrid_ctrl_set_trajectory(mcl_hybrid_ctrl_cfg_t *cfg, float q_des, float dq_des)
196 {
197  cfg->q_des = q_des;
198  cfg->dq_des = dq_des;
199 }
200 
207 static inline float mcl_hybrid_ctrl_get_torque(const mcl_hybrid_ctrl_state_t *state)
208 {
209  return state->tau_output;
210 }
211 
219 {
220  return state->pos_error;
221 }
222 
230 {
231  return state->vel_error;
232 }
233 
234 #ifdef __cplusplus
235 }
236 #endif
237 
238 #endif /* HPM_MCL_HYBRID_CTRL_H */
239 
static void mcl_hybrid_ctrl_set_trajectory(mcl_hybrid_ctrl_cfg_t *cfg, float q_des, float dq_des)
Set desired trajectory.
Definition: hpm_mcl_hybrid_ctrl.h:195
static void mcl_hybrid_ctrl_set_params(mcl_hybrid_ctrl_cfg_t *cfg, float kp, float kd, float tau_ff)
Set all parameters at once.
Definition: hpm_mcl_hybrid_ctrl.h:181
static void mcl_hybrid_ctrl_set_tau_ff(mcl_hybrid_ctrl_cfg_t *cfg, float tau_ff)
Set feedforward torque.
Definition: hpm_mcl_hybrid_ctrl.h:118
static float mcl_hybrid_ctrl_get_torque(const mcl_hybrid_ctrl_state_t *state)
Get output torque.
Definition: hpm_mcl_hybrid_ctrl.h:207
static void mcl_hybrid_ctrl_set_limits(mcl_hybrid_ctrl_cfg_t *cfg, float tau_min, float tau_max)
Set output torque limits.
Definition: hpm_mcl_hybrid_ctrl.h:153
static void mcl_hybrid_ctrl_set_kp(mcl_hybrid_ctrl_cfg_t *cfg, float kp)
Set position stiffness gain.
Definition: hpm_mcl_hybrid_ctrl.h:95
static void mcl_hybrid_ctrl_set_kd(mcl_hybrid_ctrl_cfg_t *cfg, float kd)
Set damping gain.
Definition: hpm_mcl_hybrid_ctrl.h:106
static void mcl_hybrid_ctrl_set_position(mcl_hybrid_ctrl_cfg_t *cfg, float q_des)
Set desired position.
Definition: hpm_mcl_hybrid_ctrl.h:129
static float mcl_hybrid_ctrl_get_pos_error(const mcl_hybrid_ctrl_state_t *state)
Get position error.
Definition: hpm_mcl_hybrid_ctrl.h:218
void mcl_hybrid_ctrl_init(mcl_hybrid_ctrl_cfg_t *cfg)
Initialize hybrid control parameters with default values.
Definition: hpm_mcl_hybrid_ctrl.c:13
static void mcl_hybrid_ctrl_set_speed_filter(mcl_hybrid_ctrl_cfg_t *cfg, float lpf_alpha, float deadzone)
Set speed filter parameters.
Definition: hpm_mcl_hybrid_ctrl.h:167
static void mcl_hybrid_ctrl_set_velocity(mcl_hybrid_ctrl_cfg_t *cfg, float dq_des)
Set desired velocity.
Definition: hpm_mcl_hybrid_ctrl.h:141
void mcl_hybrid_ctrl_step(const mcl_hybrid_ctrl_cfg_t *cfg, mcl_hybrid_ctrl_state_t *state)
Execute one step of hybrid control.
Definition: hpm_mcl_hybrid_ctrl.c:44
static float mcl_hybrid_ctrl_get_vel_error(const mcl_hybrid_ctrl_state_t *state)
Get velocity error.
Definition: hpm_mcl_hybrid_ctrl.h:229
Hybrid Force-Position Control Library.
Definition: hpm_mcl_hybrid_ctrl.h:32
float speed_deadzone
Definition: hpm_mcl_hybrid_ctrl.h:41
float speed_lpf_alpha
Definition: hpm_mcl_hybrid_ctrl.h:40
float tau_min
Definition: hpm_mcl_hybrid_ctrl.h:39
float kp
Definition: hpm_mcl_hybrid_ctrl.h:33
float dq_des
Definition: hpm_mcl_hybrid_ctrl.h:37
float tau_ff
Definition: hpm_mcl_hybrid_ctrl.h:35
float tau_max
Definition: hpm_mcl_hybrid_ctrl.h:38
float kd
Definition: hpm_mcl_hybrid_ctrl.h:34
float q_des
Definition: hpm_mcl_hybrid_ctrl.h:36
Hybrid control state/output structure.
Definition: hpm_mcl_hybrid_ctrl.h:47
float vel_error
Definition: hpm_mcl_hybrid_ctrl.h:52
float tau_output
Definition: hpm_mcl_hybrid_ctrl.h:50
float speed_lpf
Definition: hpm_mcl_hybrid_ctrl.h:53
float dq_actual
Definition: hpm_mcl_hybrid_ctrl.h:49
float pos_error
Definition: hpm_mcl_hybrid_ctrl.h:51
float q_actual
Definition: hpm_mcl_hybrid_ctrl.h:48