コンテンツにスキップ

Hello World

cpp_roboticsの機能の一例として以下の機能を使っています

  • Vector : EigenのVector2d, Vector3d etcと違ってconstexprにでき、数学関数もいくつかメンバ関数として実装しています
  • LQR : 状態方程式からLQRでフィードバックゲインを求めます
  • Polynomal : 多項式の評価や合成を行います
  • TransferFunction : 伝達関数の合成やシミュレーションを行います
  • bode/nyquist : ボード線図やナイキスト線図を表示します

ソースコード

example/hello_world.cpp

#define CR_USE_MATPLOTLIB
#include <iostream>
#include <Eigen/Dense>
#include <cpp_robotics/vector.hpp>
#include <cpp_robotics/controller/lqr.hpp>
#include <cpp_robotics/system.hpp>
#include <cpp_robotics/matplotlibcpp.hpp>
#include <cpp_robotics/system/polynomial_stream.hpp>

int main()
{
    namespace cr = cpp_robotics;

    constexpr cr::Vector2d vec(3.0, 4.0);
    std::cout << "constexpr 2D vector: (" << vec.x << "," << vec.y  << "), norm = " << vec.norm() << std::endl;

    Eigen::MatrixXd A(2,2), B(2,1), Q(2,2), R(1,1), P(2,2);
    A << 0, 1, -10, -1;
    B << 0, 1;
    Q << 300, 0, 0, 60;
    R << 1;

    Eigen::MatrixXd K = cr::lqr(A, B, Q, R);
    std::cout << "\nLQR feedback vector" << std::endl;
    std::cout << K << std::endl;

    std::cout << "\npolynomial" << std::endl;
    cr::Polynomial p0({1, 0, 3});
    std::cout << p0 << std::endl;
    cr::Polynomial p1 = cr::Polynomial({1, -2}) * cr::Polynomial({1, 2});
    std::cout << "(x-2)*(x+2) = " << p1 << std::endl;

    cr::TransferFunction G({1.0}, {1.0, 1.0}, 0.01);
    cr::TransferFunction C({1.0, 1.0}, {0.01, 1.0}, 0.01);
    cr::TransferFunction CG = C*G;

    std::cout << "\nG(s) = " << std::endl;
    std::cout << G << std::endl;
    std::cout << "\nC(s) = " << std::endl;
    std::cout << C << std::endl;
    std::cout << "\nC(s)*G(s) = " << std::endl;
    std::cout << CG << std::endl;

    namespace plt = matplotlibcpp;
    std::cout << "\ntransfer function step responce" << std::endl;
    {
        auto [t, y] = cr::step(G, 30);
        plt::plot(t, y);
        plt::show();
    }

    std::cout << "transfer function bode fig plot" << std::endl;
    cr::bode_plot(G);

    std::cout << "transfer function nyquist fig plot" << std::endl;
    cr::nyquist_plot(G);
}

出力

constexpr 2D vector: (3,4), norm = 5

LQR feedback vector
10  8

polynomial
( 1x^2 + 3 )
(x-2)*(x+2) = ( 1x^2 - 4 )

G(s) = 
  1
-----
1s +1

C(s) = 
 1s +1
--------
0.01s +1

C(s)*G(s) = 
      1s +1
-----------------
0.01s^2 +1.01s +1

transfer function step responce
transfer function bode fig plot
transfer function nyquist fig plot

ステップ応答

ボード線図

ナイキスト線図