Commit 834e18b4 authored by 957dd's avatar 957dd

Merge branch 'feature/angle_tank_filter' into 'master'

加入了一阶滤波算法,让角度平滑,减少跳变 See merge request !78
parents 4fc025e7 76f17c28
No preview for this file type
...@@ -439,11 +439,11 @@ void tank0204_pwm_value(int pin,int value){ ...@@ -439,11 +439,11 @@ void tank0204_pwm_value(int pin,int value){
if(pin == 27){ if(pin == 27){
device_shoting_check(27,30); device_shoting_check(27,30);
}else if(pin == 5) { }else if(pin == 5) {
softPwmWrite(7, 30); softPwmWrite(7, 35);
my_zlog_info("pwm:7,0"); my_zlog_info("pwm:7,1");
}else if(pin == 7) { }else if(pin == 7) {
softPwmWrite(5, 30); softPwmWrite(5, 35);
my_zlog_info("pwm:5,0"); my_zlog_info("pwm:5,1");
}else { }else {
softPwmWrite(pin, 30); softPwmWrite(pin, 30);
my_zlog_info("pwm:%d",pin); my_zlog_info("pwm:%d",pin);
...@@ -530,7 +530,7 @@ void dog0501_pwm_value(int pin,int value) { //软件陪我们控制调速 ...@@ -530,7 +530,7 @@ void dog0501_pwm_value(int pin,int value) { //软件陪我们控制调速
if(value==1) { if(value==1) {
if(pin == 27){ if(pin == 27){
softPwmWrite(27, 40); softPwmWrite(27, 40);
softPwmWrite(7, 80); softPwmWrite(7, 100);
} else { } else {
softPwmWrite(pin, 35); softPwmWrite(pin, 35);
my_zlog_info("pwm:%d",pin); my_zlog_info("pwm:%d",pin);
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
#include "common.h" #include "common.h"
#include "ads1115.h" #include "ads1115.h"
double tank_angle(){ double tank_angle(){
double angle=0; double angle=0;
float angle_shot=ads1115_read_channel(2); float angle_shot=ads1115_read_channel(2);
...@@ -13,8 +15,6 @@ double tank_angle(){ ...@@ -13,8 +15,6 @@ double tank_angle(){
return angle; return angle;
} }
int angle_limit(){ int angle_limit(){
if(ANGLE_LIMIT_INDEX == 1 ){ if(ANGLE_LIMIT_INDEX == 1 ){
int tank_limit_angele = tank_angle(); int tank_limit_angele = tank_angle();
...@@ -26,46 +26,19 @@ int angle_limit(){ ...@@ -26,46 +26,19 @@ int angle_limit(){
} }
/* float low_pass_filter_360(float prev_angle, float new_angle, float alpha) {
角度 EMA 滤波 // 规整到 [0, 360)
- filter : 上次滤波值(度) prev_angle = fmod(prev_angle, 360.0f);
- raw : 当前原始角度(度) if (prev_angle < 0) prev_angle += 360.0f;
- alpha : 衰减因子(0..1),越大越跟随原始值(推荐 0.05~0.5) new_angle = fmod(new_angle, 360.0f);
- deadband : 死区(度),小于该值认为是抖动 if (new_angle < 0) new_angle += 360.0f;
*/
// EN滤波结构体
// typedef struct {
// double alpha; // 滤波系数 (0~1)
// double filtered; // 上一次滤波角度
// } ENFilter;
// static ENFilter filter = {.alpha = 0.5, .filtered = 0.05};
// // 支持360°→0°跳变的滤波函数
// double en_filter_update(double new_angle)
// {
// double diff = new_angle - filter.filtered;
// // 处理角度环绕(支持359→0或0→359平滑过渡) // 计算最短路径角度差
// if (diff > 180.0) float diff = new_angle - prev_angle;
// diff -= 360.0; if (diff > 180.0f) diff -= 360.0f;
// else if (diff < -180.0) else if (diff < -180.0f) diff += 360.0f;
// diff += 360.0;
// // 一阶低通滤波
// filter.filtered += filter.alpha * diff;
// // 结果保持在[0, 360)
// if (filter.filtered < 0)
// filter.filtered += 360.0;
// else if (filter.filtered >= 360.0)
// filter.filtered -= 360.0;
// return filter.filtered;
// }
// //上次的角度滤波后的值
// double return_en_filter_last_angle(){
// return filter.filtered;
// }
// 应用滤波
float filtered = prev_angle + alpha * diff;
return fmod(filtered + 360.0f, 360.0f); // 确保输出在 [0, 360)
}
\ No newline at end of file
...@@ -11,6 +11,8 @@ double tank_angle(); ...@@ -11,6 +11,8 @@ double tank_angle();
int angle_limit(); int angle_limit();
float low_pass_filter_360(float prev_angle, float new_angle, float alpha);
// //角度滤波 // //角度滤波
// double en_filter_update(double new_angle); // double en_filter_update(double new_angle);
......
...@@ -76,17 +76,23 @@ void angle_mqtt_send() { ...@@ -76,17 +76,23 @@ void angle_mqtt_send() {
static int angle_i=0; static int angle_i=0;
cJSON *root = cJSON_CreateObject(); cJSON *root = cJSON_CreateObject();
char TOPIC_send_angle[26]; char TOPIC_send_angle[26];
double rounded_angle = tank_angle(); static double prev_angle=0;
static double rounded_angle;
rounded_angle =low_pass_filter_360(prev_angle,tank_angle(),0.7);
sprintf(TOPIC_send_angle,"dev_rtinfo/%s",mqtt_topic_pure_number()); sprintf(TOPIC_send_angle,"dev_rtinfo/%s",mqtt_topic_pure_number());
cJSON_AddStringToObject(root, "type","tank_angle"); cJSON_AddStringToObject(root, "type","tank_angle");
cJSON_AddNumberToObject(root, "angle",rounded_angle); cJSON_AddNumberToObject(root, "angle",rounded_angle);
char *payload = cJSON_PrintUnformatted(root); char *payload = cJSON_PrintUnformatted(root);
angle_i++; angle_i++;
if(angle_i>=20){ if(angle_i>=10){
my_zlog_debug("%s",payload); my_zlog_debug("%s",payload);
prev_angle=tank_angle();
angle_i=0; angle_i=0;
} }
if(rounded_angle == 0){
cJSON_Delete(root);
return;
}
for(int i=0;i<g_mqtt_cam_config_t->mqtt_count;i++){ for(int i=0;i<g_mqtt_cam_config_t->mqtt_count;i++){
mosquitto_publish(g_clients_t[i].mosq, NULL, TOPIC_send_angle, strlen(payload), payload, 0, false); mosquitto_publish(g_clients_t[i].mosq, NULL, TOPIC_send_angle, strlen(payload), payload, 0, false);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment