/*
compute u.thrust and u.q, controller gains and other parameters are in param_
*/
quadrotor_msgs::Px4ctrlDebug
LinearControl::calculateControl(const Desired_State_t &des,
const Odom_Data_t &odom,
const Imu_Data_t &imu,
Controller_Output_t &u)
{
/* WRITE YOUR CODE HERE */
//compute disired acceleration
Eigen::Vector3d des_acc(0.0, 0.0, 0.0);
Eigen::Vector3d Kp,Kv;
//初始化向量
Kp << param_.gain.Kp0, param_.gain.Kp1, param_.gain.Kp2;
//将参数中的增益赋值给向量
Kv << param_.gain.Kv0, param_.gain.Kv1, param_.gain.Kv2;
//将参数中的增益赋值给向量
des_acc = des.a + Kv.asDiagonal() * (des.v - odom.v) + Kp.asDiagonal() * (des.p - odom.p);
//des.a应该是初值0,Kv.asDiagonal()构建速度增益对角矩阵参与计算
//des.v在指点是为设定值,定点时为0,也就是所kv的系数决定了命令飞行输出在总输出中所站的比率
//Kp.asDiagonal()构建位置增益对角矩阵参与计算,des.p在定点模式下被设置与视觉里程计位置变化做差
//kp的系数决定了定点输出在总输出中所占的比率
des_acc += Eigen::Vector3d(0,0,param_.gra);
//将计算输出加速度叠加重力加速度输出
u.thrust = computeDesiredCollectiveThrustSignal(des_acc);
//将z轴加速度转换为油门输出
double roll,pitch,yaw,yaw_imu;
double yaw_odom = fromQuaternion2yaw(odom.q);
//将视觉里程计姿态变换四元数转换为角度向量,并返回z轴变换角度
double sin = std::sin(yaw_odom);
double cos = std::cos(yaw_odom);
roll = (des_acc(0) * sin - des_acc(1) * cos )/ param_.gra;
pitch = (des_acc(0) * cos + des_acc(1) * sin )/ param_.gra;
//得到当前角度下xy轴加速度输出(为啥除g?)
// yaw = fromQuaternion2yaw(des.q);
yaw_imu = fromQuaternion2yaw(imu.q);
// Eigen::Quaterniond q = Eigen::AngleAxisd(yaw,Eigen::Vector3d::UnitZ())
// * Eigen::AngleAxisd(roll,Eigen::Vector3d::UnitX())
// * Eigen::AngleAxisd(pitch,Eigen::Vector3d::UnitY());
Eigen::Quaterniond q = Eigen::AngleAxisd(des.yaw,Eigen::Vector3d::UnitZ())
* Eigen::AngleAxisd(pitch,Eigen::Vector3d::UnitY())
* Eigen::AngleAxisd(roll,Eigen::Vector3d::UnitX());
u.q = imu.q * odom.q.inverse() * q;
//没搞明白,再查一下
/* WRITE YOUR CODE HERE */
//used for debug
// debug_msg_.des_p_x = des.p(0);
// debug_msg_.des_p_y = des.p(1);
// debug_msg_.des_p_z = des.p(2);
debug_msg_.des_v_x = des.v(0);
debug_msg_.des_v_y = des.v(1);
debug_msg_.des_v_z = des.v(2);
debug_msg_.des_a_x = des_acc(0);
debug_msg_.des_a_y = des_acc(1);
debug_msg_.des_a_z = des_acc(2);
debug_msg_.des_q_x = u.q.x();
debug_msg_.des_q_y = u.q.y();
debug_msg_.des_q_z = u.q.z();
debug_msg_.des_q_w = u.q.w();
debug_msg_.des_thr = u.thrust;
// Used for thrust-accel mapping estimation
timed_thrust_.push(std::pair<ros::Time, double>(ros::Time::now(), u.thrust));
while (timed_thrust_.size() > 100)
{
timed_thrust_.pop();
}
return debug_msg_;
}
px4ctrl代码解读-calculateControl()
最新推荐文章于 2024-12-06 22:39:17 发布