C++와 Eigen에서 상태 피드백의 응답을 요구한다.
목적
C++ 언어와 Eigen에서 상태 피드백의 응답을 요구한다.
상태 피드백 응답은 별도로,
Python Control에서 상태 피드백 게인을 찾습니다. 에서 요구한다고 한다.
사전 준비
Eigen을 설치하십시오.
상태 피드백이란?
상태 피드백은 상태 방정식으로 표현 된 시스템에서
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
상태 변수 x를 피드백하는 제어 시스템입니다.
u(t)=-Kx(t)
구현
Python Control에서 상태 피드백 게인을 찾습니다.
혹은, Matlab·scilab 등 툴로부터, 피드백 게인 K가 요구되고 있다고 하면,
C++와 Eigen에서 상태 방정식을 풉니다.
시계열 응답을 구하는 루프에 u(t)=-Kx(t)를 더하면 된다.
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
cout << tt << "," << u(0, 0) << "," << Y(0, 0) << endl;
tt += dt;
}
샘플 소스
#include "Eigen/Dense"
#include "Eigen/Core"
#include <iostream>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace Eigen;
using namespace std;
void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D);
int main() {
// Parameters defining the system
double m = 250.0; // system mass
double k = 40.0; // spring constant
double b = 60.0; // damping constant
MatrixXd A(3, 3);
A << 1, -1, 1, 1, -k / m, -b / m, 1, 1, 1;
MatrixXd B(3, 1);
B << 0, -1 / m, 1;
MatrixXd C(1, 3);
C << 1, 0, 1;
MatrixXd D(1, 3);
D << 1, 0, 0;
MatrixXd K(1, 3); //FeedBask Gain
K << 15.80864382, -3.63298165, 7.85453193;
double dt = 0.01;
double tt = 0.0;
MatrixXd X(3, 1);
X << 10, 0, 0;
MatrixXd dX(3, 1);
dX << 0, 0, 0;
MatrixXd u(1, 1);
u << 0;
MatrixXd Y(1, 1);
Y << 0;
ofstream ofs("test.csv");
ofs << "time," << ",u,y,x0,x1,x2" << endl;
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
ofs << tt << "," << u(0, 0) << "," << Y(0, 0) << "," << X(0, 0) << "," << X(1, 0) << "," << X(2, 0) << endl;
tt += dt;
}
return 0;
}
다음과 같이 피드백 제어가 이루어졌는지 확인한다.
Reference
이 문제에 관하여(C++와 Eigen에서 상태 피드백의 응답을 요구한다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nnn112358/items/8092d63148ed7d911dc7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Eigen을 설치하십시오.
상태 피드백이란?
상태 피드백은 상태 방정식으로 표현 된 시스템에서
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
상태 변수 x를 피드백하는 제어 시스템입니다.
u(t)=-Kx(t)
구현
Python Control에서 상태 피드백 게인을 찾습니다.
혹은, Matlab·scilab 등 툴로부터, 피드백 게인 K가 요구되고 있다고 하면,
C++와 Eigen에서 상태 방정식을 풉니다.
시계열 응답을 구하는 루프에 u(t)=-Kx(t)를 더하면 된다.
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
cout << tt << "," << u(0, 0) << "," << Y(0, 0) << endl;
tt += dt;
}
샘플 소스
#include "Eigen/Dense"
#include "Eigen/Core"
#include <iostream>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace Eigen;
using namespace std;
void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D);
int main() {
// Parameters defining the system
double m = 250.0; // system mass
double k = 40.0; // spring constant
double b = 60.0; // damping constant
MatrixXd A(3, 3);
A << 1, -1, 1, 1, -k / m, -b / m, 1, 1, 1;
MatrixXd B(3, 1);
B << 0, -1 / m, 1;
MatrixXd C(1, 3);
C << 1, 0, 1;
MatrixXd D(1, 3);
D << 1, 0, 0;
MatrixXd K(1, 3); //FeedBask Gain
K << 15.80864382, -3.63298165, 7.85453193;
double dt = 0.01;
double tt = 0.0;
MatrixXd X(3, 1);
X << 10, 0, 0;
MatrixXd dX(3, 1);
dX << 0, 0, 0;
MatrixXd u(1, 1);
u << 0;
MatrixXd Y(1, 1);
Y << 0;
ofstream ofs("test.csv");
ofs << "time," << ",u,y,x0,x1,x2" << endl;
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
ofs << tt << "," << u(0, 0) << "," << Y(0, 0) << "," << X(0, 0) << "," << X(1, 0) << "," << X(2, 0) << endl;
tt += dt;
}
return 0;
}
다음과 같이 피드백 제어가 이루어졌는지 확인한다.
Reference
이 문제에 관하여(C++와 Eigen에서 상태 피드백의 응답을 요구한다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nnn112358/items/8092d63148ed7d911dc7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
u(t)=-Kx(t)
Python Control에서 상태 피드백 게인을 찾습니다.
혹은, Matlab·scilab 등 툴로부터, 피드백 게인 K가 요구되고 있다고 하면,
C++와 Eigen에서 상태 방정식을 풉니다.
시계열 응답을 구하는 루프에 u(t)=-Kx(t)를 더하면 된다.
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
cout << tt << "," << u(0, 0) << "," << Y(0, 0) << endl;
tt += dt;
}
샘플 소스
#include "Eigen/Dense"
#include "Eigen/Core"
#include <iostream>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace Eigen;
using namespace std;
void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D);
int main() {
// Parameters defining the system
double m = 250.0; // system mass
double k = 40.0; // spring constant
double b = 60.0; // damping constant
MatrixXd A(3, 3);
A << 1, -1, 1, 1, -k / m, -b / m, 1, 1, 1;
MatrixXd B(3, 1);
B << 0, -1 / m, 1;
MatrixXd C(1, 3);
C << 1, 0, 1;
MatrixXd D(1, 3);
D << 1, 0, 0;
MatrixXd K(1, 3); //FeedBask Gain
K << 15.80864382, -3.63298165, 7.85453193;
double dt = 0.01;
double tt = 0.0;
MatrixXd X(3, 1);
X << 10, 0, 0;
MatrixXd dX(3, 1);
dX << 0, 0, 0;
MatrixXd u(1, 1);
u << 0;
MatrixXd Y(1, 1);
Y << 0;
ofstream ofs("test.csv");
ofs << "time," << ",u,y,x0,x1,x2" << endl;
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
ofs << tt << "," << u(0, 0) << "," << Y(0, 0) << "," << X(0, 0) << "," << X(1, 0) << "," << X(2, 0) << endl;
tt += dt;
}
return 0;
}
다음과 같이 피드백 제어가 이루어졌는지 확인한다.
Reference
이 문제에 관하여(C++와 Eigen에서 상태 피드백의 응답을 요구한다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nnn112358/items/8092d63148ed7d911dc7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include "Eigen/Dense"
#include "Eigen/Core"
#include <iostream>
#include <fstream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace Eigen;
using namespace std;
void RungeKutta(MatrixXd dX, MatrixXd &X, MatrixXd u, double tt, double dt, MatrixXd A, MatrixXd B, MatrixXd C, MatrixXd D);
int main() {
// Parameters defining the system
double m = 250.0; // system mass
double k = 40.0; // spring constant
double b = 60.0; // damping constant
MatrixXd A(3, 3);
A << 1, -1, 1, 1, -k / m, -b / m, 1, 1, 1;
MatrixXd B(3, 1);
B << 0, -1 / m, 1;
MatrixXd C(1, 3);
C << 1, 0, 1;
MatrixXd D(1, 3);
D << 1, 0, 0;
MatrixXd K(1, 3); //FeedBask Gain
K << 15.80864382, -3.63298165, 7.85453193;
double dt = 0.01;
double tt = 0.0;
MatrixXd X(3, 1);
X << 10, 0, 0;
MatrixXd dX(3, 1);
dX << 0, 0, 0;
MatrixXd u(1, 1);
u << 0;
MatrixXd Y(1, 1);
Y << 0;
ofstream ofs("test.csv");
ofs << "time," << ",u,y,x0,x1,x2" << endl;
for (int i = 0; i < 1000; i++) {
RungeKutta(dX, X, u, tt, dt, A, B, C, D);
Y = C*X;
u = -K*X;
ofs << tt << "," << u(0, 0) << "," << Y(0, 0) << "," << X(0, 0) << "," << X(1, 0) << "," << X(2, 0) << endl;
tt += dt;
}
return 0;
}
Reference
이 문제에 관하여(C++와 Eigen에서 상태 피드백의 응답을 요구한다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nnn112358/items/8092d63148ed7d911dc7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)