只是样例 核心代码: RobotState类的完整实现, 这里直接对这三个量赋值: 以下统一表示为: 具体形式如下: 注意这里的xyz不是坐标,而是四元数的固定表示 具体形式: 输入为 具体形式: 输入: 输出: 这里有两个旋转矩阵 利用了eigen的toRotationMatrix(),通过四元数求出旋转矩阵。具体转换公式如下: 这里通过对角矩阵创建 最终形式:
一、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
:定义了机器人的在世界坐标系下的,位置
p,速度
p˙,以及机身坐标系下的旋转角
ω,均为
3×1矩阵Matrix<fpt,3,4> r_feet
:机身参考系下的足端位置,
3×4矩阵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文件
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]; }
下标
G表示世界坐标系下,下标
B表示机身坐标系下
p=[xGyGzG]v=[xG˙yG˙zG˙]ω=[ϕB˙θB˙ψB˙]2、四元数
this->q.w() = q_[0]; this->q.x() = q_[1]; this->q.y() = q_[2]; this->q.z() = q_[3];
q=[w,x,y,z]3、足端位置
12×1,输出为
3×4for(u8 rs = 0; rs < 3; rs++) for(u8 c = 0; c < 4; c++) this->r_feet(rs,c) = r_[rs*4 + c];
[x1x2x3x4∣y1y2y3y4∣z1z2z3z4]
rfeet=⎣⎡x1y1z1x2y2z2x3y3z3x4y4z4⎦⎤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、机身坐标系到世界坐标系的旋转矩阵
⎣⎡1−2y2−2z22xy−2wz2xz+2wy2xy+2wz1−2x2−2z22yz−2wx2xz−2wy2yz+2wx1−2x2−2y2⎦⎤b、偏航角组成的旋转矩阵
Ryaw=⎣⎡cos(ψB)sin(ψB)0−sin(ψB)cos(ψB)0000⎦⎤5、惯性矩阵
Matrix<fpt,3,1> Id; Id << .07f, 0.26f, 0.242f; //Id << 0.3f, 2.1f, 2.1f; // DH I_body.diagonal() = Id;
IB=⎣⎡0.070000.260000.242⎦⎤
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算