我正在使用其他人制作的代码,用arduino将kalman过滤器实现到我的imu中。我理解它的绝大多数和它背后的数学,但我在实现它时遇到一些我无法理解的错误(严重缺乏对typdef和结构的知识并初始化它们)。如果有人能向我解释这个错误,我将不胜感激。
头文件包含此内容......
struct kalman_data{
float x1, x2, x3;
float p11, p12, p13,
p21, p22, p23,
p31, p32, p33;
float q1, q2, q3;
};
typedef struct _kalman_data kalman_data;
void kalman_data(kalman_data* data);
void kalman_calc(kalman_data* data, float z1, float z2);
我的arduino代码包含了这个..
kalman_data pitch_data;
kalman_data roll_data;
void loop(){
kalman_data(&pitch_data);
kalman_data(&roll_data);
kalman_calc(&pitch_data, pitch, gyro_yz);
kalman_calc(&roll_data, roll, gyro_xz);
}
这就是我得到的错误......
在test.ino中包含的文件中:2:0: E:\ Users \ Alexander \ Documents \ Arduino \ libraries \ Kalman / kalman.h:30:29:错误:冲突声明'typedef struct _kalman_data kalman_data'
typedef struct _kalman_data kalman_data;E:\ Users \ Alexander \ Documents \ Arduino \ libraries \ Kalman / kalman.h:17:8:错误:'struct kalman_data'之前的声明为'struct kalman_data' struct kalman_data {
答案 0 :(得分:1)
struct kalman_data{
应该是
struct _kalman_data{
以便对应后续的
typedef struct _kalman_data kalman_data;
然后,功能
void kalman_data(kalman_data* data);
应该更好地重命名。我记得C和C ++允许你重用一个函数的类型名称,同时在范围内同时使用,但即使它允许它绝对不是一个好主意。非常混乱。
答案 1 :(得分:0)
struct
定义保留名称kalman_data
,并且typedef尝试再次为名为_kalman_data
的结构保留名称。这会导致错误。
要解决此问题,请使用struct _kalman_data
,然后typedef将按预期工作。