首页 > 编程语言 >c++ imu

c++ imu

时间:2025-01-11 10:32:38浏览次数:1  
标签:std double yaw c++ imu pitch alpha roll

 

 

#include <iostream>
#include <cmath>
#include <chrono>
#include <thread>
#include <random>

// Simple helper: wraps angle to [-pi, pi]
double wrapToPi(double angle) {
    while (angle > M_PI) {
        angle -= 2.0 * M_PI;
    }
    while (angle < -M_PI) {
        angle += 2.0 * M_PI;
    }
    return angle;
}

// Complementary Filter Class
class ComplementaryFilter {
public:
    ComplementaryFilter(double alpha = 0.98)
        : alpha_(alpha),
          roll_(0.0), pitch_(0.0), yaw_(0.0)
    {
        lastTime_ = std::chrono::steady_clock::now();
    }

    // Update filter with new IMU data
    void update(double gx, double gy, double gz, double ax, double ay, double az) {
        // Time delta
        auto currentTime = std::chrono::steady_clock::now();
        std::chrono::duration<double> elapsed = currentTime - lastTime_;
        double dt = elapsed.count();
        lastTime_ = currentTime;

        // 1) Integrate gyro to get incremental angles
        roll_  += gx * dt;
        pitch_ += gy * dt;
        yaw_   += gz * dt;

        // 2) Estimate roll & pitch from accelerometer
        // Assuming sensor is mostly aligned so that az ~ +9.81 for “upright”
        double rollAcc = std::atan2(ay, az);
        // Negative sign for pitch if x axis forward and z axis down/up depends on your orientation
        double pitchAcc = std::atan2(-ax, std::sqrt(ay * ay + az * az));
        // We ignore magnetometer → yaw drifts

        // 3) Complementary filter to fuse gyro (fast changes) with accel (long-term reference)
        roll_  = alpha_ * roll_  + (1.0 - alpha_) * rollAcc;
        pitch_ = alpha_ * pitch_ + (1.0 - alpha_) * pitchAcc;

        // Wrap angles to [-pi, pi] for consistency
        roll_  = wrapToPi(roll_);
        pitch_ = wrapToPi(pitch_);
        yaw_   = wrapToPi(yaw_);
    }

    // Get current posture in radians
    void getPosture(double& roll, double& pitch, double& yaw) const {
        roll  = roll_;
        pitch = pitch_;
        yaw   = yaw_;
    }

private:
    double alpha_;  // Complementary filter parameter
    double roll_;
    double pitch_;
    double yaw_;
    std::chrono::steady_clock::time_point lastTime_;
};

int main() {
    // Instantiate our ComplementaryFilter
    // alpha_ near 1.0 → rely heavily on gyro
    // alpha_ near 0.0 → rely heavily on accelerometer
    ComplementaryFilter filter(0.98);

    // For demonstration, we’ll simulate small random gyro noise.
    // In a real application, replace these with your actual sensor reads.
    std::default_random_engine generator;
    std::uniform_real_distribution<double> distributionGyro(-0.01, 0.01); // rad/s
    // We'll keep accel near (0, 0, 9.81) for "upright" scenario
    // but you can try randomizing that, too, for more “motion.”

    while (true) {
        // Simulated IMU values
        double gx = distributionGyro(generator);
        double gy = distributionGyro(generator);
        double gz = distributionGyro(generator);

        // For now, assume only gravity on Z
        double ax = 0.0;
        double ay = 0.0;
        double az = 9.81;

        // Update the filter
        filter.update(gx, gy, gz, ax, ay, az);

        // Get the current posture (roll, pitch, yaw)
        double roll, pitch, yaw;
        filter.getPosture(roll, pitch, yaw);

        // Convert to degrees for printing
        double rollDeg  = roll  * 180.0 / M_PI;
        double pitchDeg = pitch * 180.0 / M_PI;
        double yawDeg   = yaw   * 180.0 / M_PI;

        // Print
        std::cout << "Roll:  " << rollDeg
                  << "°, Pitch: " << pitchDeg
                  << "°, Yaw: " << yawDeg << "°" << std::endl;

        // Sleep ~10ms to simulate ~100 Hz loop
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }

    return 0;
}

 

 

###################

标签:std,double,yaw,c++,imu,pitch,alpha,roll
From: https://www.cnblogs.com/herd/p/18665317

相关文章

  • 【机器人学和计算机视觉】SLAM(Simultaneous Localization and Mapping)原理与技术实现
    引言SLAM(SimultaneousLocalizationandMapping,即时定位与地图构建)是机器人学和计算机视觉领域的一项关键技术。它允许机器人在未知环境中自主导航,同时构建环境的地图并确定自身的精确位置。SLAM技术在机器人、无人驾驶、增强现实和无人机等领域有着广泛的应用。本文将......
  • 【华为OD技术面试手撕真题】- C++手撕技术面试八股文(1)
    文章目录一、delete和delete[]的区别二、const解释一下其作用1.定义常量2.修饰指针3.修饰函数参数4.修饰类成员函数三、struct和class的区别1.默认访问控制2.继承的默认访问控制四、#include<file.h>#include"file.h"的区别五、C++文件......
  • C++语言的学习路线
    C++语言的学习路线C++是一种强大的高级编程语言,广泛应用于系统软件、游戏开发、嵌入式系统和高性能应用等多个领域。由于其丰富的功能和灵活性,C++是一门值得深入学习的语言。本文旨在为初学者制定一条系统的学习路线,帮助他们循序渐进地掌握C++语言。第一阶段:基础知识1.......
  • 1.10日学习笔记之C++的类
    ·类其实就是一种数据类型,和结构相似。类的成员包括两类,属性(成员变量)和行为(成员函数)。·成员函数定义的两种方法(可能有多种,觉得这两种比较常用)1、将类的成员函数定义在类体内,如classCPerson{public:shortage;shortgetage(){returnage;}};2、将......
  • 【C++】穿越编程岁月,细品C++进化轨迹,深化入门基石(续章)——揭秘函数缺省参数的魅力、函
    文章目录一、函数缺省参数二、函数重载三、引用1.引用的概念和定义2.引用的特性3.引用的使用4.const引用5.指针和引用的关系四、inline内联函数和nullptr1.inline2.nullptr一、函数缺省参数   缺省参数其实就是默认参数,它是声明或定义函数时为函数的参数指定......
  • 【C++】揭开C++类与对象的神秘面纱(首卷)(类的基础操作详解、实例化艺术及this指针的深
    文章目录一、类的定义1.类定义格式2.类访问限定符3.类域二、类的实例化1.实例化概念2.对象的大小三、隐藏的this指针与相关练习1.this指针的引入与介绍练习1练习2练习3一、类的定义1.类定义格式   在讲解类的作用之前,我们来看看类是如何定义的,在C++中,class......
  • Qt C++学习笔记1.7
    1.7Qt入门:实现一个图片查看软件需要用到的控件:QLabelQLineEditQPushButton需要实现的功能:打开目录选择图片显示图片的名字显示图片QLabel基本用法设置文本voidsetText(constQString&);获取文本QStringtext()const;设置图片voidsetPixmap(constQPixm......
  • C++并发编程之基于锁的数据结构的适用场合与需要考虑和注意的问题
    在C++多线程编程中,锁是一种常用的同步机制,用于保护共享数据,防止多个线程同时访问和修改,从而避免数据不一致或其他并发问题。基于锁的数据结构适用于多种并发编程场合,但同时也需要注意一些关键问题。1. 适用的并发编程场合锁在以下几种场合特别有用:1.1 保护共享数据当多个......
  • 详解 C++ 防御性编程声明一个类型 int *(*(*foo)(int))[5];
    C++中有一些语法由于灵活性和强大功能显得非常复杂。例如,复杂声明是许多人在学习C++时遇到的难题之一。下面以一条常被称为“C++最难的声明”为例,逐步拆解它的含义。声明:int*(*(*foo)(int))[5];这是一个看似复杂的C++声明。让我们逐步分析它的含义。1.阅读......
  • c++ 赋值运算符的定义
    1.赋值运算符的定义赋值运算符是用于修改已有对象的内容,而不是用于创建新对象。其典型的定义如下:Person&Person::operator=(constPerson&other);Person&Person::operator=(Person&&other);左侧对象(*this):表示已经存在的目标对象。右侧对象(other):表示要从中复制或转......