Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <towr/variables/phase_spline.h>
00031 #include <towr/variables/phase_durations.h>
00032
00033 namespace towr {
00034
00035 PhaseSpline::PhaseSpline(
00036 NodesVariablesPhaseBased::Ptr const nodes,
00037 PhaseDurations* const phase_durations)
00038 : NodeSpline(nodes.get(), nodes->ConvertPhaseToPolyDurations(phase_durations->GetPhaseDurations())),
00039 PhaseDurationsObserver(phase_durations)
00040 {
00041 phase_nodes_ = nodes;
00042
00043 UpdatePolynomialDurations();
00044
00045
00046
00047
00048
00049
00050 for (int i=0; i<nodes->GetPolynomialCount(); ++i)
00051 FillJacobianWrtNodes(i, 0.0, kPos, jac_wrt_nodes_structure_, true);
00052 }
00053
00054 void
00055 PhaseSpline::UpdatePolynomialDurations()
00056 {
00057 auto phase_duration = phase_durations_->GetPhaseDurations();
00058 auto poly_durations = phase_nodes_->ConvertPhaseToPolyDurations(phase_duration);
00059
00060 for (int i=0; i<cubic_polys_.size(); ++i) {
00061 cubic_polys_.at(i).SetDuration(poly_durations.at(i));
00062 }
00063
00064 UpdatePolynomialCoeff();
00065 }
00066
00067 PhaseSpline::Jacobian
00068 PhaseSpline::GetJacobianOfPosWrtDurations (double t_global) const
00069 {
00070 VectorXd dx_dT = GetDerivativeOfPosWrtPhaseDuration(t_global);
00071 VectorXd xd = GetPoint(t_global).v();
00072 int current_phase = GetSegmentID(t_global, phase_durations_->GetPhaseDurations());
00073
00074 return phase_durations_->GetJacobianOfPos(current_phase, dx_dT, xd);
00075 }
00076
00077 Eigen::VectorXd
00078 PhaseSpline::GetDerivativeOfPosWrtPhaseDuration (double t_global) const
00079 {
00080 int poly_id; double t_local;
00081 std::tie(poly_id, t_local) = GetLocalTime(t_global, GetPolyDurations());
00082
00083 VectorXd vel = GetPoint(t_global).v();
00084 VectorXd dxdT = cubic_polys_.at(poly_id).GetDerivativeOfPosWrtDuration(t_local);
00085
00086 double inner_derivative = phase_nodes_->GetDerivativeOfPolyDurationWrtPhaseDuration(poly_id);
00087 double prev_polys_in_phase = phase_nodes_->GetNumberOfPrevPolynomialsInPhase(poly_id);
00088
00089
00090
00091
00092 return inner_derivative*(dxdT - prev_polys_in_phase*vel);
00093 }
00094
00095
00096 }