From 22e80298538e7baf0612e769e9719c43e28ae4e0 Mon Sep 17 00:00:00 2001
From: Robofish <1683502971@qq.com>
Date: Sat, 25 Oct 2025 00:17:56 +0800
Subject: [PATCH] =?UTF-8?q?lqr=E5=A5=BD=E9=9A=BE=E8=B0=83=E5=95=8A?=
=?UTF-8?q?=E8=8D=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Core/Src/main.c | 2 +-
MDK-ARM/DevC.uvprojx | 85 ++++++++++-
MDK-ARM/DevC/DevC.lnp | 17 ++-
User/device/ai.h | 1 -
User/module/balance_chassis.c | 136 +++---------------
User/module/balance_chassis.h | 12 --
User/module/config.c | 25 ++--
.../balance/series_legs/get_k.m | 72 +++++-----
.../balance/series_legs/get_k_length.m | 6 +-
9 files changed, 166 insertions(+), 190 deletions(-)
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 6883e26..815abda 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -74,7 +74,7 @@ void MX_FREERTOS_Init(void);
* @retval int
*/
int main(void)
-{
+ {
/* USER CODE BEGIN 1 */
diff --git a/MDK-ARM/DevC.uvprojx b/MDK-ARM/DevC.uvprojx
index e01fb9b..265bb5b 100644
--- a/MDK-ARM/DevC.uvprojx
+++ b/MDK-ARM/DevC.uvprojx
@@ -784,11 +784,6 @@
1
..\User\component\ahrs.c
-
- cmd.c
- 1
- ..\User\component\cmd.c
-
filter.c
1
@@ -824,6 +819,21 @@
1
..\User\component\vmc.c
+
+ crc8.c
+ 1
+ ..\User\component\crc8.c
+
+
+ crc16.c
+ 1
+ ..\User\component\crc16.c
+
+
+ speed_planner.c
+ 1
+ ..\User\component\speed_planner.c
+
@@ -859,6 +869,31 @@
1
..\User\device\motor_lz.c
+
+ ai.c
+ 1
+ ..\User\device\ai.c
+
+
+ bmi088.c
+ 1
+ ..\User\device\bmi088.c
+
+
+ motor_dm.c
+ 1
+ ..\User\device\motor_dm.c
+
+
+ motor_rm.c
+ 1
+ ..\User\device\motor_rm.c
+
+
+ virtual_chassis.c
+ 1
+ ..\User\device\virtual_chassis.c
+
@@ -874,6 +909,21 @@
1
..\User\module\balance_chassis.c
+
+ cmd.c
+ 1
+ ..\User\module\cmd.c
+
+
+ gimbal.c
+ 1
+ ..\User\module\gimbal.c
+
+
+ shoot.c
+ 1
+ ..\User\module\shoot.c
+
@@ -919,6 +969,31 @@
1
..\User\task\ctrl_gimbal.c
+
+ ai.c
+ 1
+ ..\User\task\ai.c
+
+
+ cmd.c
+ 1
+ ..\User\task\cmd.c
+
+
+ ctrl_shoot.c
+ 1
+ ..\User\task\ctrl_shoot.c
+
+
+ monitor.c
+ 1
+ ..\User\task\monitor.c
+
+
+ music.c
+ 1
+ ..\User\task\music.c
+
diff --git a/MDK-ARM/DevC/DevC.lnp b/MDK-ARM/DevC/DevC.lnp
index 455e580..44b0d59 100644
--- a/MDK-ARM/DevC/DevC.lnp
+++ b/MDK-ARM/DevC/DevC.lnp
@@ -70,7 +70,6 @@
".\devc\time.o"
".\devc\uart.o"
".\devc\ahrs.o"
-".\devc\cmd.o"
".\devc\filter.o"
".\devc\limiter.o"
".\devc\pid.o"
@@ -78,14 +77,25 @@
".\devc\kinematics.o"
".\devc\lqr.o"
".\devc\vmc.o"
+".\devc\crc8.o"
+".\devc\crc16.o"
+".\devc\speed_planner.o"
".\devc\buzzer.o"
".\devc\dm_imu.o"
".\devc\dr16.o"
".\devc\motor.o"
".\devc\motor_lk.o"
".\devc\motor_lz.o"
+".\devc\ai.o"
+".\devc\bmi088.o"
+".\devc\motor_dm.o"
+".\devc\motor_rm.o"
+".\devc\virtual_chassis.o"
".\devc\config.o"
".\devc\balance_chassis.o"
+".\devc\cmd_1.o"
+".\devc\gimbal.o"
+".\devc\shoot.o"
".\devc\blink.o"
".\devc\init.o"
".\devc\rc.o"
@@ -93,6 +103,11 @@
".\devc\atti_esti.o"
".\devc\ctrl_chassis.o"
".\devc\ctrl_gimbal.o"
+".\devc\ai_1.o"
+".\devc\cmd_1.o"
+".\devc\ctrl_shoot.o"
+".\devc\monitor.o"
+".\devc\music.o"
--strict --scatter ".\DevC\DevC.sct"
--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
diff --git a/User/device/ai.h b/User/device/ai.h
index 47841e0..b9fc688 100644
--- a/User/device/ai.h
+++ b/User/device/ai.h
@@ -4,7 +4,6 @@
#pragma once
-#include
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/User/module/balance_chassis.c b/User/module/balance_chassis.c
index 74a3579..9d73c14 100644
--- a/User/module/balance_chassis.c
+++ b/User/module/balance_chassis.c
@@ -42,19 +42,6 @@ static int8_t Chassis_SetMode(Chassis_t *c, Chassis_Mode_t mode) {
if (mode == c->mode)
return CHASSIS_OK; /* 模式未改变直接返回 */
- // 特殊处理:从JUMP切换到WHELL_LEG_BALANCE时不重置
- // 但从WHELL_LEG_BALANCE切换到JUMP时,需要重置以触发新的跳跃
- if (c->mode == CHASSIS_MODE_JUMP && mode == CHASSIS_MODE_WHELL_LEG_BALANCE) {
- c->mode = mode;
- return CHASSIS_OK;
- }
- if (c->mode == CHASSIS_MODE_WHELL_LEG_BALANCE && mode == CHASSIS_MODE_JUMP) {
- c->mode = mode;
- c->state = 0; // 重置状态,确保每次切换模式时都重新初始化
- c->jump_time=0; // 重置跳跃时间,切换到JUMP模式时会触发新跳跃
- return CHASSIS_OK;
- }
-
Chassis_MotorEnable(c);
PID_Reset(&c->pid.leg_length[0]);
@@ -101,8 +88,6 @@ static int8_t Chassis_SetMode(Chassis_t *c, Chassis_Mode_t mode) {
LowPassFilter2p_Reset(&c->filter.wheel_out[1], 0.0f);
c->mode = mode;
- c->state = 0; // 重置状态,确保每次切换模式时都重新初始化
- c->jump_time=0; // 重置跳跃时间,切换到JUMP模式时会触发新跳跃
c->wz_multi=0.0f;
return CHASSIS_OK;
@@ -132,11 +117,8 @@ static void Chassis_UpdateChassisState(Chassis_t *c) {
c->chassis_state.velocity_x =
(left_wheel_linear_vel + right_wheel_linear_vel) / 2.0f;
- // 在跳跃模式的起跳和收腿阶段暂停位移积分,避免轮子空转导致的位移误差
- if (!(c->mode == CHASSIS_MODE_JUMP && (c->state == 2 || c->state == 3))) {
- // 积分得到位置
- c->chassis_state.position_x += c->chassis_state.velocity_x * c->dt;
- }
+ // 积分得到位置
+ c->chassis_state.position_x += c->chassis_state.velocity_x * c->dt;
}
@@ -289,45 +271,6 @@ int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
Chassis_Output(c); // 统一输出
} break;
- case CHASSIS_MODE_JUMP:
- // 跳跃模式状态机
- // 状态转换: 0(准备)->1(0.3s)->2(0.2s)->3(0.3s)->0(完成)
- // jump_time == 0: 未开始跳跃
- // jump_time == 1: 已完成跳跃(不再触发)
- // jump_time > 1: 跳跃进行中
-
- // 检测是否需要开始新的跳跃(state为0且jump_time为0)
- if (c->state == 0 && c->jump_time == 0) {
- // 开始跳跃,进入state 1
- c->state = 1;
- c->jump_time = BSP_TIME_Get_us();
- }
-
- // 只有在跳跃进行中时才处理状态转换(jump_time > 1)
- if (c->jump_time > 1) {
- // 计算已经过的时间(微秒)
- uint64_t elapsed_us = BSP_TIME_Get_us() - c->jump_time;
-
- // 状态转换逻辑
- if (c->state == 1 && elapsed_us >= 300000) {
- // state 1 保持0.3s后转到state 2
- c->state = 2;
- c->jump_time = BSP_TIME_Get_us(); // 重置计时
- } else if (c->state == 2 && elapsed_us >= 230000) {
- // state 2 保持0.25s后转到state 3,确保腿部充分伸展
- c->state = 3;
- c->jump_time = BSP_TIME_Get_us(); // 重置计时
- } else if (c->state == 3 && elapsed_us >= 500000) {
- // state 3 保持0.4s后转到state 0,确保收腿到最高
- c->state = 0;
- c->jump_time = 1; // 设置为1,表示已完成跳跃,不再触发
- }
- }
-
- // 执行LQR控制(包含PID腿长控制)
- Chassis_LQRControl(c, c_cmd);
- Chassis_Output(c); // 统一输出
- break;
case CHASSIS_MODE_WHELL_LEG_BALANCE:
case CHASSIS_MODE_ROTOR:
@@ -431,17 +374,11 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
/* 构建目标状态 */
LQR_State_t target_state = {0};
- // 在跳跃收腿阶段强制摆角目标为0,确保落地时腿部竖直
- if (c->mode == CHASSIS_MODE_JUMP && c->state == 3) {
- target_state.theta = 0.0f; // 强制摆杆角度为0,确保腿部竖直
- } else {
- target_state.theta = 0.00; // 目标摆杆角度
- }
-
+ target_state.theta = 0.0f; // 目标摆杆角度
target_state.d_theta = 0.0f; // 目标摆杆角速度
- target_state.phi = 11.9601*pow((0.16f + c_cmd->height * 0.25f),3) + -11.8715*pow((0.16f + c_cmd->height * 0.25f),2) + 3.87083*(0.16f + c_cmd->height * 0.25f) + -0.4154; // 目标俯仰角
+ target_state.phi = 0.0f; // 目标俯仰角
target_state.d_phi = 0.0f; // 目标俯仰角速度
- target_state.x = c->chassis_state.target_x -2.07411f*(0.16f + c_cmd->height * 0.25f) + 0.41182f;
+ target_state.x = c->chassis_state.target_x;
target_state.d_x = target_dot_x; // 目标速度
if (c->mode != CHASSIS_MODE_ROTOR){
@@ -494,13 +431,11 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
LQR_SetTargetState(&c->lqr[0], &target_state);
LQR_Control(&c->lqr[0]);
} else {
- // 在跳跃收腿阶段强制摆角目标为0,其他情况为0.16f
- float non_contact_theta = (c->mode == CHASSIS_MODE_JUMP && c->state == 3) ? 0.0f : 0.16f;
- target_state.theta = non_contact_theta; // 非接触时的腿摆角目标
+ target_state.theta = 0.16f; // 非接触时的腿摆角目标
LQR_SetTargetState(&c->lqr[0], &target_state);
c->lqr[0].control_output.T = 0.0f;
c->lqr[0].control_output.Tp =
- c->lqr[0].K_matrix[1][0] * (-c->vmc_[0].leg.theta + non_contact_theta) +
+ c->lqr[0].K_matrix[1][0] * (-c->vmc_[0].leg.theta + 0.16f) +
c->lqr[0].K_matrix[1][1] * (-c->vmc_[0].leg.d_theta + 0.0f);
c->yaw_control.yaw_force = 0.0f; // 单腿离地时关闭偏航控制
}
@@ -508,28 +443,20 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
LQR_SetTargetState(&c->lqr[1], &target_state);
LQR_Control(&c->lqr[1]);
}else {
- // 在跳跃收腿阶段强制摆角目标为0,其他情况为0.16f
- float non_contact_theta = (c->mode == CHASSIS_MODE_JUMP && c->state == 3) ? 0.0f : 0.16f;
- target_state.theta = non_contact_theta; // 非接触时的腿摆角目标
+ target_state.theta = 0.16f; // 非接触时的腿摆角目标
LQR_SetTargetState(&c->lqr[1], &target_state);
c->lqr[1].control_output.T = 0.0f;
c->lqr[1].control_output.Tp =
- c->lqr[1].K_matrix[1][0] * (-c->vmc_[1].leg.theta + non_contact_theta) +
+ c->lqr[1].K_matrix[1][0] * (-c->vmc_[1].leg.theta + 0.16f) +
c->lqr[1].K_matrix[1][1] * (-c->vmc_[1].leg.d_theta + 0.0f);
c->yaw_control.yaw_force = 0.0f; // 单腿离地时关闭偏航控制
}
/* 轮毂力矩输出(参考C++版本的减速比) */
- // 在跳跃的起跳和收腿阶段强制关闭轮子输出,防止离地时轮子猛转
- if (c->mode == CHASSIS_MODE_JUMP && (c->state == 2 || c->state == 3)) {
- c->output.wheel[0] = 0.0f;
- c->output.wheel[1] = 0.0f;
- } else {
- c->output.wheel[0] =
- c->lqr[0].control_output.T / 4.5f + c->yaw_control.yaw_force;
- c->output.wheel[1] =
- c->lqr[1].control_output.T / 4.5f - c->yaw_control.yaw_force;
- }
+ c->output.wheel[0] =
+ c->lqr[0].control_output.T / 4.5f + c->yaw_control.yaw_force;
+ c->output.wheel[1] =
+ c->lqr[1].control_output.T / 4.5f - c->yaw_control.yaw_force;
/* 腿长控制和VMC逆解算(使用PID控制) */
float virtual_force[2];
float target_L0[2];
@@ -556,39 +483,12 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
}
// 目标腿长设定(包含横滚角补偿)
- switch (c->state) {
- case 0: // 正常状态,根据高度指令调节腿长
- target_L0[0] = 0.16f + c_cmd->height * 0.22f + roll_compensation_length; // 左腿:基础腿长 + 高度调节 + 横滚补偿
- target_L0[1] = 0.16f + c_cmd->height * 0.22f - roll_compensation_length; // 右腿:基础腿长 + 高度调节 - 横滚补偿
- break;
- case 1: // 准备阶段,腿长收缩
- target_L0[0] = 0.14f + roll_compensation_length; // 左腿:收缩到较短腿长 + 横滚补偿
- target_L0[1] = 0.14f - roll_compensation_length; // 右腿:收缩到较短腿长 - 横滚补偿
- break;
- case 2: // 起跳阶段,腿长快速伸展
- target_L0[0] = 0.65f; // 左腿:伸展到最大腿长(跳跃时不进行横滚补偿)
- target_L0[1] = 0.65f; // 右腿:伸展到最大腿长(跳跃时不进行横滚补偿)
- break;
- case 3: // 收腿阶段,腿长收缩到最高
- target_L0[0] = 0.06f; // 左腿:收缩到最短腿长(确保收腿到最高)
- target_L0[1] = 0.06f; // 右腿:收缩到最短腿长(确保收腿到最高)
- break;
- default:
- target_L0[0] = 0.16f + c_cmd->height * 0.22f + roll_compensation_length;
- target_L0[1] = 0.16f + c_cmd->height * 0.22f - roll_compensation_length;
- break;
- }
+ target_L0[0] = 0.16f + c_cmd->height * 0.22f + roll_compensation_length; // 左腿:基础腿长 + 高度调节 + 横滚补偿
+ target_L0[1] = 0.16f + c_cmd->height * 0.22f - roll_compensation_length; // 右腿:基础腿长 + 高度调节 - 横滚补偿
- // 腿长限幅:根据跳跃状态调整限制范围
- if (c->mode == CHASSIS_MODE_JUMP && c->state == 3) {
- // 在跳跃收腿阶段,允许更短的腿长,确保收腿到最高
- if (target_L0[0] < 0.06f) target_L0[0] = 0.06f;
- if (target_L0[1] < 0.06f) target_L0[1] = 0.06f;
- } else {
- // 正常情况下的腿长限制:最短0.10,最长0.42m
- if (target_L0[0] < 0.10f) target_L0[0] = 0.10f;
- if (target_L0[1] < 0.10f) target_L0[1] = 0.10f;
- }
+ // 腿长限幅:最短0.10,最长0.42m
+ if (target_L0[0] < 0.10f) target_L0[0] = 0.10f;
+ if (target_L0[1] < 0.10f) target_L0[1] = 0.10f;
if (target_L0[0] > 0.42f) target_L0[0] = 0.42f;
if (target_L0[1] > 0.42f) target_L0[1] = 0.42f;
diff --git a/User/module/balance_chassis.h b/User/module/balance_chassis.h
index 98f694e..82c72c1 100644
--- a/User/module/balance_chassis.h
+++ b/User/module/balance_chassis.h
@@ -40,17 +40,9 @@ typedef enum {
CHASSIS_MODE_RELAX, /* 放松模式,电机不输出。一般情况底盘初始化之后的模式 */
CHASSIS_MODE_RECOVER, /* 复位模式 */
CHASSIS_MODE_WHELL_LEG_BALANCE, /* 轮子+腿平衡模式,底盘自我平衡 */
- CHASSIS_MODE_JUMP, /* 跳跃模式,底盘跳跃 */
CHASSIS_MODE_ROTOR, /* 小陀螺模式,底盘高速旋转 */
} Chassis_Mode_t;
-typedef enum {
- CHASSIS_JUMP_STATE_READY, /* 准备跳跃 */
- CHASSIS_JUMP_STATE_JUMPING, /* 跳跃中 */
- CHASSIS_JUMP_STATE_LANDING, /* 着陆中 */
- CHASSIS_JUMP_STATE_END, /* 跳跃结束 */
-} Chassis_JumpState_t;
-
typedef struct {
Chassis_Mode_t mode; /* 底盘模式 */
MoveVector_t move_vec; /* 底盘运动向量 */
@@ -125,10 +117,6 @@ typedef struct {
VMC_t vmc_[2]; /* 两条腿的VMC */
LQR_t lqr[2]; /* 两条腿的LQR控制器 */
- int8_t state;
- uint64_t jump_time;
-
-
float angle;
float height;
diff --git a/User/module/config.c b/User/module/config.c
index 66ecc42..0f7b956 100644
--- a/User/module/config.c
+++ b/User/module/config.c
@@ -254,20 +254,19 @@ Config_RobotParam_t robot_config = {
}
},
-
.lqr_gains = {
- .k11_coeff = { -2.299492214443364e+02f, 2.371048664025156e+02f, -1.091592921067477e+02f, -5.004256900558796e+00f }, // theta
- .k12_coeff = { -5.160496889728024e+00f, 3.062519293243873e+00f, -9.339456933350174e+00f, -4.793280770575950e-01f }, // d_theta
- .k13_coeff = { -5.187383520564029e+01f, 4.899697460241380e+01f, -1.565478588426995e+01f, -2.004694192093775e+00f }, // x
- .k14_coeff = { -5.668796498905875e+01f, 5.377351750824888e+01f, -1.871718521370502e+01f, -2.691170008421150e+00f }, // d_x
- .k15_coeff = { -1.449457451875909e+02f, 1.491544007677516e+02f, -5.400783326406858e+01f, 7.212250094701016e+00f }, // phi
- .k16_coeff = { -9.623232912225313e+01f, 1.012699482439727e+02f, -3.862842162301360e+01f, 6.174165209610019e+00f }, // d_phi
- .k21_coeff = { -1.197720213257983e+02f, 1.432558800683586e+02f, -6.332976803783767e+01f, 1.244403075562354e+01f }, // theta
- .k22_coeff = { -1.641975451035667e+01f, 1.816373049685376e+01f, -6.825602612420409e+00f, 1.759808519224317e+00f }, // d_theta
- .k23_coeff = { -9.525505626411980e+01f, 9.986545276773818e+01f, -3.780741158172127e+01f, 6.150010121224194e+00f }, // x
- .k24_coeff = { -1.249520841685426e+02f, 1.297949868891588e+02f, -4.847618771898694e+01f, 7.842551207050604e+00f }, // d_x
- .k25_coeff = { 1.098971996183004e+02f, -1.028972351169783e+02f, 3.234322461758097e+01f, 1.250515887186789e+01f }, // phi
- .k26_coeff = { 1.122150774085550e+02f, -1.059683417765082e+02f, 3.379315768085248e+01f, 5.474171975795353e+00f }, // d_phi
+ .k11_coeff = { -2.156343028411120e+02f, 2.257665290023013e+02f, -1.002267208978328e+02f, -2.350184261149268e+00f }, // theta
+ .k12_coeff = { -7.743056249446016e+00f, 6.752493325294916e+00f, -8.796808854152014e+00f, -3.119669283951065e-01f }, // d_theta
+ .k13_coeff = { -1.118487386616928e+02f, 1.102429207742772e+02f, -3.732715045746770e+01f, -7.925992877328480e-01f }, // x
+ .k14_coeff = { -6.940658312417929e+01f, 6.823355321869006e+01f, -2.465299412907610e+01f, -1.060847118860617e+00f }, // d_x
+ .k15_coeff = { -4.583141861746078e+01f, 5.818701324121601e+01f, -2.683216623272723e+01f, 4.507357792784873e+00f }, // phi
+ .k16_coeff = { -1.544882596273596e+01f, 1.975202028975679e+01f, -9.521615432406449e+00f, 1.862826936219259e+00f }, // d_phi
+ .k21_coeff = { 9.252532546470242e+00f, 4.417889614536075e+01f, -4.710921937977012e+01f, 1.516691345722052e+01f }, // theta
+ .k22_coeff = { -1.018276949440906e+00f, 6.140925452791167e+00f, -4.973407169060023e+00f, 2.141324584243587e+00f }, // d_theta
+ .k23_coeff = { -1.020910325776861e+02f, 1.292784950839223e+02f, -6.114289602021928e+01f, 1.251012410414232e+01f }, // x
+ .k24_coeff = { -1.009199238331894e+02f, 1.180052040402144e+02f, -5.140001160311314e+01f, 9.859995261307304e+00f }, // d_x
+ .k25_coeff = { 9.176820525459368e+01f, -9.170665517126247e+01f, 3.124569590587187e+01f, 6.886312255252024e+00f }, // phi
+ .k26_coeff = { 4.772624933352569e+01f, -4.722944757834970e+01f, 1.599553913425377e+01f, 1.037598895224650e+00f }, // d_phi
},
.theta = 0.0f,
.x = 0.0f,
diff --git a/utils/Simulation-master/balance/series_legs/get_k.m b/utils/Simulation-master/balance/series_legs/get_k.m
index 62754ff..73f8a65 100644
--- a/utils/Simulation-master/balance/series_legs/get_k.m
+++ b/utils/Simulation-master/balance/series_legs/get_k.m
@@ -56,41 +56,41 @@ fprintf('},\n');
fprintf('========================================\n\n');
% 可选:显示拟合曲线图
-x0=leg; %步长为0.1
-y11=polyval(a11,x0); %返回值y0是对应于x0的函数值
-y12=polyval(a12,x0); %返回值y0是对应于x0的函数值
-y13=polyval(a13,x0); %返回值y0是对应于x0的函数值
-y14=polyval(a14,x0); %返回值y0是对应于x0的函数值
-y15=polyval(a15,x0); %返回值y0是对应于x0的函数值
-y16=polyval(a16,x0); %返回值y0是对应于x0的函数值
-
-y21=polyval(a21,x0); %返回值y0是对应于x0的函数值
-y22=polyval(a22,x0); %返回值y0是对应于x0的函数值
-y23=polyval(a23,x0); %返回值y0是对应于x0的函数值
-y24=polyval(a24,x0); %返回值y0是对应于x0的函数值
-y25=polyval(a25,x0); %返回值y0是对应于x0的函数值
-y26=polyval(a26,x0); %返回值y0是对应于x0的函数值
-
-figure;
-subplot(3,4,1);plot(leg,k11,'o',x0,y11,'r');xlabel('leg length');ylabel('k11');title('k11拟合');
-subplot(3,4,2);plot(leg,k12,'o',x0,y12,'r');xlabel('leg length');ylabel('k12');title('k12拟合');
-subplot(3,4,3);plot(leg,k13,'o',x0,y13,'r');xlabel('leg length');ylabel('k13');title('k13拟合');
-subplot(3,4,4);plot(leg,k14,'o',x0,y14,'r');xlabel('leg length');ylabel('k14');title('k14拟合');
-subplot(3,4,5);plot(leg,k15,'o',x0,y15,'r');xlabel('leg length');ylabel('k15');title('k15拟合');
-subplot(3,4,6);plot(leg,k16,'o',x0,y16,'r');xlabel('leg length');ylabel('k16');title('k16拟合');
-
-subplot(3,4,7);plot(leg,k21,'o',x0,y21,'r');xlabel('leg length');ylabel('k21');title('k21拟合');
-subplot(3,4,8);plot(leg,k22,'o',x0,y22,'r');xlabel('leg length');ylabel('k22');title('k22拟合');
-subplot(3,4,9);plot(leg,k23,'o',x0,y23,'r');xlabel('leg length');ylabel('k23');title('k23拟合');
-subplot(3,4,10);plot(leg,k24,'o',x0,y24,'r');xlabel('leg length');ylabel('k24');title('k24拟合');
-subplot(3,4,11);plot(leg,k25,'o',x0,y25,'r');xlabel('leg length');ylabel('k25');title('k25拟合');
-subplot(3,4,12);plot(leg,k26,'o',x0,y26,'r');xlabel('leg length');ylabel('k26');title('k26拟合');
-
-for i = 1:12
- subplot(3,4,i);
- grid on; %添加网格线
- set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',0.5); %将网格线变成虚线
- legend('原始数据','拟合曲线','Location','best');
-end
+% x0=leg; %步长为0.1
+% y11=polyval(a11,x0); %返回值y0是对应于x0的函数值
+% y12=polyval(a12,x0); %返回值y0是对应于x0的函数值
+% y13=polyval(a13,x0); %返回值y0是对应于x0的函数值
+% y14=polyval(a14,x0); %返回值y0是对应于x0的函数值
+% y15=polyval(a15,x0); %返回值y0是对应于x0的函数值
+% y16=polyval(a16,x0); %返回值y0是对应于x0的函数值
+%
+% y21=polyval(a21,x0); %返回值y0是对应于x0的函数值
+% y22=polyval(a22,x0); %返回值y0是对应于x0的函数值
+% y23=polyval(a23,x0); %返回值y0是对应于x0的函数值
+% y24=polyval(a24,x0); %返回值y0是对应于x0的函数值
+% y25=polyval(a25,x0); %返回值y0是对应于x0的函数值
+% y26=polyval(a26,x0); %返回值y0是对应于x0的函数值
+%
+% figure;
+% subplot(3,4,1);plot(leg,k11,'o',x0,y11,'r');xlabel('leg length');ylabel('k11');title('k11拟合');
+% subplot(3,4,2);plot(leg,k12,'o',x0,y12,'r');xlabel('leg length');ylabel('k12');title('k12拟合');
+% subplot(3,4,3);plot(leg,k13,'o',x0,y13,'r');xlabel('leg length');ylabel('k13');title('k13拟合');
+% subplot(3,4,4);plot(leg,k14,'o',x0,y14,'r');xlabel('leg length');ylabel('k14');title('k14拟合');
+% subplot(3,4,5);plot(leg,k15,'o',x0,y15,'r');xlabel('leg length');ylabel('k15');title('k15拟合');
+% subplot(3,4,6);plot(leg,k16,'o',x0,y16,'r');xlabel('leg length');ylabel('k16');title('k16拟合');
+%
+% subplot(3,4,7);plot(leg,k21,'o',x0,y21,'r');xlabel('leg length');ylabel('k21');title('k21拟合');
+% subplot(3,4,8);plot(leg,k22,'o',x0,y22,'r');xlabel('leg length');ylabel('k22');title('k22拟合');
+% subplot(3,4,9);plot(leg,k23,'o',x0,y23,'r');xlabel('leg length');ylabel('k23');title('k23拟合');
+% subplot(3,4,10);plot(leg,k24,'o',x0,y24,'r');xlabel('leg length');ylabel('k24');title('k24拟合');
+% subplot(3,4,11);plot(leg,k25,'o',x0,y25,'r');xlabel('leg length');ylabel('k25');title('k25拟合');
+% subplot(3,4,12);plot(leg,k26,'o',x0,y26,'r');xlabel('leg length');ylabel('k26');title('k26拟合');
+%
+% for i = 1:12
+% subplot(3,4,i);
+% grid on; %添加网格线
+% set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',0.5); %将网格线变成虚线
+% legend('原始数据','拟合曲线','Location','best');
+% end
toc
diff --git a/utils/Simulation-master/balance/series_legs/get_k_length.m b/utils/Simulation-master/balance/series_legs/get_k_length.m
index 1aadeb4..946f636 100644
--- a/utils/Simulation-master/balance/series_legs/get_k_length.m
+++ b/utils/Simulation-master/balance/series_legs/get_k_length.m
@@ -20,7 +20,7 @@ function K = get_k_length(leg_length)
l1=-0.03; %机体质心距离转轴距离
mw1=0.60; %驱动轮质量
mp1=1.8; %杆质量
- M1=8.0; %机体质量
+ M1=6.0; %机体质量
Iw1=mw1*R1^2; %驱动轮转动惯量
Ip1=mp1*((L1+LM1)^2+0.05^2)/12.0; %摆杆转动惯量
IM1=M1*(0.3^2+0.12^2)/12.0; %机体绕质心转动惯量
@@ -48,8 +48,8 @@ function K = get_k_length(leg_length)
B=subs(B,[R,L,LM,l,mw,mp,M,Iw,Ip,IM,g],[R1,L1,LM1,l1,mw1,mp1,M1,Iw1,Ip1,IM1,9.8]);
B=double(B);
- Q=diag([160 160 2000 1500 20000 5000]);%theta d_theta x d_x phi d_phi%700 1 600 200 1000 1
- R=[140 0;0 60]; %T Tp
+ Q=diag([700 150 4000 200 6000 300]);%theta d_theta x d_x phi d_phi%700 1 600 200 1000 1
+ R=[140 0;0 40]; %T Tp
K=lqr(A,B,Q,R);