-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathtrans_space_tracking_data.cc
More file actions
81 lines (70 loc) · 3.13 KB
/
Copy pathtrans_space_tracking_data.cc
File metadata and controls
81 lines (70 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "trans_space_tracking_data.h"
#include <iostream>
using Eigen::MatrixXd;
using Eigen::Vector3d;
using Eigen::VectorXd;
using std::string;
using std::vector;
using drake::multibody::JacobianWrtVariable;
using drake::multibody::MultibodyPlant;
using drake::systems::Context;
namespace dairlib::systems::controllers {
/**** TransTaskSpaceTrackingData ****/
TransTaskSpaceTrackingData::TransTaskSpaceTrackingData(
const string& name, const MatrixXd& K_p, const MatrixXd& K_d,
const MatrixXd& W, const MultibodyPlant<double>& plant_w_spr,
const MultibodyPlant<double>& plant_wo_spr)
: OptionsTrackingData(name, kSpaceDim, kSpaceDim, K_p, K_d, W, plant_w_spr,
plant_wo_spr) {}
void TransTaskSpaceTrackingData::AddPointToTrack(const std::string& body_name,
const Vector3d& pt_on_body) {
AddStateAndPointToTrack(-1, body_name, pt_on_body);
}
void TransTaskSpaceTrackingData::AddStateAndPointToTrack(
int fsm_state, const std::string& body_name, const Vector3d& pt_on_body) {
AddFiniteStateToTrack(fsm_state);
DRAKE_DEMAND(plant_w_spr_.HasBodyNamed(body_name));
DRAKE_DEMAND(plant_wo_spr_.HasBodyNamed(body_name));
body_frames_w_spr_[fsm_state] =
&plant_w_spr_.GetBodyByName(body_name).body_frame();
body_frames_wo_spr_[fsm_state] =
&plant_wo_spr_.GetBodyByName(body_name).body_frame();
pts_on_body_[fsm_state] = pt_on_body;
}
void TransTaskSpaceTrackingData::UpdateY(const VectorXd& x_w_spr,
const Context<double>& context_w_spr) {
y_ = Vector3d::Zero();
plant_w_spr_.CalcPointsPositions(context_w_spr,
*body_frames_wo_spr_.at(fsm_state_),
pts_on_body_[fsm_state_], world_w_spr_, &y_);
}
void TransTaskSpaceTrackingData::UpdateYdot(
const VectorXd& x_w_spr, const Context<double>& context_w_spr) {
MatrixXd J(kSpaceDim, plant_w_spr_.num_velocities());
plant_w_spr_.CalcJacobianTranslationalVelocity(
context_w_spr, JacobianWrtVariable::kV,
*body_frames_w_spr_.at(fsm_state_), pts_on_body_[fsm_state_],
world_w_spr_, world_w_spr_, &J);
ydot_ = J * x_w_spr.tail(plant_w_spr_.num_velocities());
}
void TransTaskSpaceTrackingData::UpdateJ(
const VectorXd& x_wo_spr, const Context<double>& context_wo_spr) {
J_ = MatrixXd::Zero(kSpaceDim, plant_wo_spr_.num_velocities());
plant_wo_spr_.CalcJacobianTranslationalVelocity(
context_wo_spr, JacobianWrtVariable::kV,
*body_frames_wo_spr_.at(fsm_state_), pts_on_body_[fsm_state_],
world_wo_spr_, world_wo_spr_, &J_);
}
void TransTaskSpaceTrackingData::UpdateJdotV(
const VectorXd& x_wo_spr, const Context<double>& context_wo_spr) {
JdotV_ = plant_wo_spr_.CalcBiasTranslationalAcceleration(
context_wo_spr, drake::multibody::JacobianWrtVariable::kV,
*body_frames_wo_spr_.at(fsm_state_), pts_on_body_[fsm_state_],
world_wo_spr_, world_wo_spr_);
}
void TransTaskSpaceTrackingData::CheckDerivedOscTrackingData() {
if (!body_frames_w_spr_.empty()) {
body_frames_w_spr_ = body_frames_wo_spr_;
}
}
} // namespace dairlib::systems::controllers