只是樣例,更多詳情請私信
一、RobotState.h文件
核心代碼:
class RobotState
{
public:
void set(flt* p, flt* v, flt* q, flt* w, flt* r, flt yaw);
//void compute_rotations();
void print();
Matrix<fpt,3,1> p,v,w;
Matrix<fpt,3,4> r_feet;
Matrix<fpt,3,3> R;
Matrix<fpt,3,3> R_yaw;
Matrix<fpt,3,3> I_body;
Quaternionf q;
fpt yaw;
fpt m = 9;
//fpt m = 50.236; //DH
//private:
};
-
Matrix<fpt,3,1> p,v,w
:定義了機器人的在世界座標系下的,位置,速度,以及機身座標系下的旋轉角,均爲矩陣 -
Matrix<fpt,3,4> r_feet
:機身參考系下的足端位置,矩陣 -
Matrix<fpt,3,3> R
:機身座標系到世界座標系的旋轉矩陣 -
Matrix<fpt,3,3> R_yaw
;:偏航角旋轉矩陣 -
Matrix<fpt,3,3> I_body
:機身座標系下的慣量矩陣 -
Matrix<fpt,3,3> I_body
:四元素表示的世界座標系下的旋轉 -
fpt yaw
:偏航角 -
fpt m = 9
:機器人質量
二、RobotState.cpp文件
RobotState類的完整實現,set
函數的輸入爲當前(或上一)時刻的狀態數據,包括位置,速度,旋轉角,足端位置,偏航角以及四元數表示的旋轉量,具體定義參考上一節。
void RobotState::set(flt* p_, flt* v_, flt* q_, flt* w_, flt* r_,flt yaw_)
{
//位置,速度,旋轉角
for(u8 i = 0; i < 3; i++)
{
this->p(i) = p_[i];
this->v(i) = v_[i];
this->w(i) = w_[i];
}
//四元數
this->q.w() = q_[0];
this->q.x() = q_[1];
this->q.y() = q_[2];
this->q.z() = q_[3];
//偏航角
this->yaw = yaw_;
//足端位置
//for(u8 i = 0; i < 12; i++)
// this->r_feet(i) = r[i];
for(u8 rs = 0; rs < 3; rs++)
for(u8 c = 0; c < 4; c++)
this->r_feet(rs,c) = r_[rs*4 + c];
//旋轉矩陣
R = this->q.toRotationMatrix();
fpt yc = cos(yaw_);
fpt ys = sin(yaw_);
R_yaw << yc, -ys, 0,
ys, yc, 0,
0, 0, 1;
//慣量矩陣
Matrix<fpt,3,1> Id;
Id << .07f, 0.26f, 0.242f;
//Id << 0.3f, 2.1f, 2.1f; // DH
I_body.diagonal() = Id;
//TODO: Consider normalizing quaternion??
}
1、位置,速度,旋轉角
這裏直接對這三個量賦值:
for(u8 i = 0; i < 3; i++)
{
this->p(i) = p_[i];
this->v(i) = v_[i];
this->w(i) = w_[i];
}
以下統一表示爲:
下標表示世界座標系下,下標表示機身座標系下
具體形式如下:
2、四元數
this->q.w() = q_[0];
this->q.x() = q_[1];
this->q.y() = q_[2];
this->q.z() = q_[3];
注意這裏的xyz不是座標,而是四元數的固定表示
具體形式:
3、足端位置
輸入爲,輸出爲
for(u8 rs = 0; rs < 3; rs++)
for(u8 c = 0; c < 4; c++)
this->r_feet(rs,c) = r_[rs*4 + c];
具體形式:
輸入:
輸出:
4、旋轉矩陣
R = this->q.toRotationMatrix();
fpt yc = cos(yaw_);
fpt ys = sin(yaw_);
R_yaw << yc, -ys, 0,
ys, yc, 0,
0, 0, 1;
這裏有兩個旋轉矩陣
a、機身座標系到世界座標系的旋轉矩陣
利用了eigen的toRotationMatrix(),通過四元數求出旋轉矩陣。具體轉換公式如下:
b、偏航角組成的旋轉矩陣
5、慣性矩陣
這裏通過對角矩陣創建
Matrix<fpt,3,1> Id;
Id << .07f, 0.26f, 0.242f;
//Id << 0.3f, 2.1f, 2.1f; // DH
I_body.diagonal() = Id;
最終形式: