UndercarriageCtrlGeom.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Fraunhofer Institute for Manufacturing Engineering and Automation (IPA)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
19 
20 #include <math.h>
21 #include <angles/angles.h>
22 #include <stdexcept>
23 #include <boost/shared_ptr.hpp>
24 
25 
26 namespace MathSup {
27  const double PI = 3.14159265358979323846;
28  void normalizePi(double &val) { val = angles::normalize_angle(val); }
29 
30  double atan4quad(double y, double x)
31  {
32  if((x==0.0) && (y==0.0)) return 0; // special case (?)
33  return atan2(y,x);
34  }
35 }
36 
37 double getWeightedDelta(double current_position, double old_target, double new_target){
38  // current_position = angles::normalize_angle(current_position); not needed if current Pos is alread normalized
39 
40  // Calculate differences between current config to possible set-points
41  double dtempDeltaPhi1RAD = angles::normalize_angle( new_target - current_position );
42  double dtempDeltaPhiCmd1RAD = angles::normalize_angle(new_target - old_target);
43 
44  // determine optimal setpoint value
45  // 1st which set point is closest to current cinfog
46  // but: avoid permanent switching (if next target is about PI/2 from current config)
47  // 2nd which set point is closest to last set point
48  // "fitness criteria" to choose optimal set point:
49  // calculate accumulted (+ weighted) difference between targets, current config. and last command
50  return 0.6*fabs(dtempDeltaPhi1RAD) + 0.4*fabs(dtempDeltaPhiCmd1RAD);
51 }
52 
54  state_ = state;
55 
56  // calculate current geometry of robot (exact wheel position, taking into account steering offset of wheels)
59 
60  // calculate distance from platform center to wheel center
62 
63  // calculate direction of rotational vector
65 
67 }
68 
69 double WheelData::mergeRotRobRadS(const WheelData &wheel1, const WheelData &wheel2){
70  // calc Parameters (Dist,Phi) of virtual linking axis of the two considered wheels
71  double dtempDiffXMM = wheel2.m_dExWheelXPosMM - wheel1.m_dExWheelXPosMM;
72  double dtempDiffYMM = wheel2.m_dExWheelYPosMM - wheel1.m_dExWheelYPosMM;
73 
74  double dtempRelDistWheelsMM = sqrt( dtempDiffXMM*dtempDiffXMM + dtempDiffYMM*dtempDiffYMM );
75  double dtempRelPhiWheelsRAD = MathSup::atan4quad( dtempDiffYMM, dtempDiffXMM );
76 
77  // transform velocity of wheels into relative coordinate frame of linking axes -> subtract angles
78  double dtempRelPhiWheel1RAD = wheel1.state_.dAngGearSteerRad - dtempRelPhiWheelsRAD;
79  double dtempRelPhiWheel2RAD = wheel2.state_.dAngGearSteerRad - dtempRelPhiWheelsRAD;
80 
81  return (wheel2.m_dVelWheelMMS * sin(dtempRelPhiWheel2RAD) - wheel1.m_dVelWheelMMS * sin(dtempRelPhiWheel1RAD))/dtempRelDistWheelsMM;
82 }
83 
84 double WheelData::getVelX() const {
86 }
87 double WheelData::getVelY() const {
89 }
90 UndercarriageGeom::UndercarriageGeom(const std::vector<WheelParams> &params){
91  for(std::vector<WheelParams>::const_iterator it = params.begin(); it != params.end(); ++it){
92  wheels_.push_back(boost::make_shared<WheelData>(it->geom));
93  }
94 }
95 
98 }
99 
100 void UndercarriageGeom::updateWheelStates(const std::vector<WheelState> &states){
102 }
103 
104 void CtrlData::setTarget(const PlatformState &plt_state){
105  // check if zero movement commanded -> keep orientation of wheels, set wheel velocity to zero
106  if((plt_state.dVelLongMMS == 0) && (plt_state.dVelLatMMS == 0) && (plt_state.dRotRobRadS == 0))
107  {
110  return;
111  }
112 
113  // calculate velocity and direction of single wheel motion
114  // Translational Portion
115  double dtempAxVelXRobMMS = plt_state.dVelLongMMS;
116  double dtempAxVelYRobMMS = plt_state.dVelLatMMS;
117  // Rotational Portion
118  dtempAxVelXRobMMS += plt_state.dRotRobRadS * m_dExWheelDistMM * -sin(m_dExWheelAngRad);
119  dtempAxVelYRobMMS += plt_state.dRotRobRadS * m_dExWheelDistMM * cos(m_dExWheelAngRad);
120 
121  // calculate resulting steering angle
122  // Wheel has to move in direction of resulting velocity vector of steering axis
123  double dAngGearSteerTarget1Rad = MathSup::atan4quad(dtempAxVelYRobMMS, dtempAxVelXRobMMS);
124  // calculate corresponding angle in opposite direction (+180 degree)
125  double dAngGearSteerTarget2Rad = dAngGearSteerTarget1Rad + MathSup::PI;
126  MathSup::normalizePi(dAngGearSteerTarget2Rad);
127 
128  // calculate absolute value of rotational rate of driving wheels in rad/s
129  double dVelGearDriveTarget1RadS = sqrt( (dtempAxVelXRobMMS * dtempAxVelXRobMMS) +
130  (dtempAxVelYRobMMS * dtempAxVelYRobMMS) ) / geom_.dRadiusWheelMM;
131  // now adapt to direction (forward/backward) of wheel
132  double dVelGearDriveTarget2RadS = -dVelGearDriveTarget1RadS;
133 
134 
137  {
138  // Target1 is "optimal"
139  m_dVelGearDriveTargetRadS = dVelGearDriveTarget1RadS;
140  m_dAngGearSteerTargetRad = dAngGearSteerTarget1Rad;
141  }
142  else
143  {
144  // Target2 is "optimal"
145  m_dVelGearDriveTargetRadS = dVelGearDriveTarget2RadS;
146  m_dAngGearSteerTargetRad = dAngGearSteerTarget2Rad;
147  }
148 
149 }
150 
151 double limitValue(double value, double limit){
152  if(limit != 0){
153  if (value > limit){
154  value = limit;
155  } else if (value < -limit) {
156  value = -limit;
157  }
158  }
159  return value;
160 }
161 
162 void CtrlData::calcControlStep(WheelCommand &command, double dCmdRateS, bool reset){
163  if(reset){
164  this->reset();
165  command.dVelGearDriveRadS = 0.0;
166  command.dVelGearSteerRadS = 0.0;
167  command.dAngGearSteerRad = state_.dAngGearSteerRad;
168  command.dAngGearSteerRadDelta = 0.0;
169  return;
170  }
171 
172  // Normalize Actual Wheel Position before calculation
173  double dCurrentPosWheelRAD = angles::normalize_angle(state_.dAngGearSteerRad);
174  command.dAngGearSteerRadDelta = angles::normalize_angle(m_dAngGearSteerTargetRad - dCurrentPosWheelRAD);
175 
176  // set outputs
178 
179  // provisorial --> skip interpolation and always take Target
180  command.dAngGearSteerRad = m_dAngGearSteerTargetRad;
181 }
182 
183 void PosCtrlData::calcControlStep(WheelCommand &command, double dCmdRateS, bool reset){
185  if(!reset){
186  // Impedance-Ctrl
187  // Calculate resulting desired forces, velocities
188  // double dForceDamp, dForceProp, dAccCmd, dVelCmdInt;
189  double dForceDamp = - pos_params_.dDamp *m_dCtrlVelCmdInt;
190  double dForceProp = pos_params_.dSpring * command.dAngGearSteerRadDelta;
191 
192  double dAccCmd = (dForceDamp + dForceProp) / pos_params_.dVirtM;
193  dAccCmd = limitValue(dAccCmd, pos_params_.dDDPhiMax);
194 
195  double dVelCmdInt =m_dCtrlVelCmdInt + dCmdRateS * dAccCmd;
196  dVelCmdInt = limitValue(dVelCmdInt, pos_params_.dDPhiMax);
197 
198  // Store internal ctrlr-states
199  m_dCtrlVelCmdInt = dVelCmdInt;
200 
201  // set outputs
202  command.dVelGearSteerRadS = limitValue(dVelCmdInt, params_.dMaxSteerRateRadpS);
203  }
204 }
206 }
208  m_dCtrlVelCmdInt = 0.0;
209 }
210 
211 void UndercarriageCtrl::configure(const std::vector<PosCtrlParams> &pos_ctrls){
212  assert(wheels_.size() == pos_ctrls.size());
213  for(size_t i = 0; i < wheels_.size(); ++i){
214  wheels_[i]->pos_params_ = pos_ctrls[i];
215  }
216 }
WheelData::getVelX
double getVelX() const
Definition: UndercarriageCtrlGeom.cpp:84
PosCtrlData::m_dCtrlVelCmdInt
double m_dCtrlVelCmdInt
Definition: UndercarriageCtrlGeom.h:280
WheelCommand
Definition: UndercarriageCtrlGeom.h:45
WheelState
Definition: UndercarriageCtrlGeom.h:39
UndercarriageGeom::updateWheelStates
virtual void updateWheelStates(const std::vector< WheelState > &states)
Definition: UndercarriageCtrlGeom.cpp:100
command
ROSLIB_DECL std::string command(const std::string &cmd)
WheelGeom::dWheelYPosMM
double dWheelYPosMM
Definition: UndercarriageCtrlGeom.h:57
PosCtrlParams::dDPhiMax
double dDPhiMax
Definition: UndercarriageCtrlGeom.h:265
PosCtrlParams::dVirtM
double dVirtM
Definition: UndercarriageCtrlGeom.h:265
WheelData::m_dExWheelYPosMM
double m_dExWheelYPosMM
Definition: UndercarriageCtrlGeom.h:81
WheelGeom::dRadiusWheelMM
double dRadiusWheelMM
Definition: UndercarriageCtrlGeom.h:61
angles::normalize_angle
def normalize_angle(angle)
WheelData::m_dExWheelDistMM
double m_dExWheelDistMM
Definition: UndercarriageCtrlGeom.h:82
CtrlParams::dMaxDriveRateRadpS
double dMaxDriveRateRadpS
Definition: UndercarriageCtrlGeom.h:217
WheelData::getVelY
double getVelY() const
Definition: UndercarriageCtrlGeom.cpp:87
PosCtrlParams::dDDPhiMax
double dDDPhiMax
Definition: UndercarriageCtrlGeom.h:265
UndercarriageGeom::wheels_
std::vector< boost::shared_ptr< WheelData > > wheels_
Definition: UndercarriageCtrlGeom.h:165
UndercarriageCtrlBase< PosCtrlData >::wheels_
std::vector< boost::shared_ptr< PosCtrlData > > wheels_
Definition: UndercarriageCtrlGeom.h:211
WheelData::state_
WheelState state_
Definition: UndercarriageCtrlGeom.h:74
limitValue
double limitValue(double value, double limit)
Definition: UndercarriageCtrlGeom.cpp:151
UndercarriageCtrl::configure
void configure(const std::vector< PosCtrlParams > &pos_ctrl)
Definition: UndercarriageCtrlGeom.cpp:211
CtrlData::reset
virtual void reset()
Definition: UndercarriageCtrlGeom.cpp:205
UndercarriageGeomBase::updateWheelStates
virtual void updateWheelStates(const std::vector< WheelState > &states)=0
UndercarriageCtrlGeom.h
UndercarriageGeomBase::calcDirect
virtual void calcDirect(PlatformState &state) const =0
getWeightedDelta
double getWeightedDelta(double current_position, double old_target, double new_target)
Definition: UndercarriageCtrlGeom.cpp:37
PlatformState::dVelLongMMS
double dVelLongMMS
Definition: UndercarriageCtrlGeom.h:27
PosCtrlParams::dSpring
double dSpring
Definition: UndercarriageCtrlGeom.h:265
WheelData::geom_
WheelGeom geom_
Definition: UndercarriageCtrlGeom.h:66
WheelData::m_dExWheelXPosMM
double m_dExWheelXPosMM
Definition: UndercarriageCtrlGeom.h:80
PosCtrlData::calcControlStep
virtual void calcControlStep(WheelCommand &command, double dCmdRateS, bool reset)
Definition: UndercarriageCtrlGeom.cpp:183
CtrlData::calcControlStep
virtual void calcControlStep(WheelCommand &command, double dCmdRateS, bool reset)
Definition: UndercarriageCtrlGeom.cpp:162
UndercarriageGeom::UndercarriageGeom
UndercarriageGeom(const std::vector< WheelParams > &params)
Definition: UndercarriageCtrlGeom.cpp:90
PosCtrlParams::dDamp
double dDamp
Definition: UndercarriageCtrlGeom.h:265
WheelData::m_dExWheelAngRad
double m_dExWheelAngRad
Definition: UndercarriageCtrlGeom.h:83
MathSup::normalizePi
void normalizePi(double &val)
Definition: UndercarriageCtrlGeom.cpp:28
WheelData::mergeRotRobRadS
static double mergeRotRobRadS(const WheelData &wheel1, const WheelData &wheel2)
Definition: UndercarriageCtrlGeom.cpp:69
WheelData
Definition: UndercarriageCtrlGeom.h:65
MathSup
Definition: UndercarriageCtrlGeom.cpp:26
WheelGeom::dWheelXPosMM
double dWheelXPosMM
Definition: UndercarriageCtrlGeom.h:56
WheelData::dFactorVel
double dFactorVel
Definition: UndercarriageCtrlGeom.h:72
WheelState::dVelGearSteerRadS
double dVelGearSteerRadS
Definition: UndercarriageCtrlGeom.h:41
PlatformState
Definition: UndercarriageCtrlGeom.h:26
WheelGeom::dDistSteerAxisToDriveWheelMM
double dDistSteerAxisToDriveWheelMM
Definition: UndercarriageCtrlGeom.h:62
WheelState::dVelGearDriveRadS
double dVelGearDriveRadS
Definition: UndercarriageCtrlGeom.h:40
CtrlData::m_dAngGearSteerTargetRad
double m_dAngGearSteerTargetRad
Definition: UndercarriageCtrlGeom.h:229
PosCtrlData::reset
virtual void reset()
Definition: UndercarriageCtrlGeom.cpp:207
PosCtrlData::pos_params_
PosCtrlParams pos_params_
Definition: UndercarriageCtrlGeom.h:275
CtrlData::params_
CtrlParams params_
Definition: UndercarriageCtrlGeom.h:227
WheelData::updateState
void updateState(const WheelState &state)
Definition: UndercarriageCtrlGeom.cpp:53
CtrlParams::dMaxSteerRateRadpS
double dMaxSteerRateRadpS
Definition: UndercarriageCtrlGeom.h:218
PlatformState::dRotRobRadS
double dRotRobRadS
Definition: UndercarriageCtrlGeom.h:29
MathSup::PI
const double PI
Definition: UndercarriageCtrlGeom.cpp:27
WheelData::m_dVelWheelMMS
double m_dVelWheelMMS
Definition: UndercarriageCtrlGeom.h:85
MathSup::atan4quad
double atan4quad(double y, double x)
Definition: UndercarriageCtrlGeom.cpp:30
UndercarriageGeom::calcDirect
virtual void calcDirect(PlatformState &state) const
Definition: UndercarriageCtrlGeom.cpp:96
CtrlData::setTarget
void setTarget(const PlatformState &state)
Definition: UndercarriageCtrlGeom.cpp:104
WheelState::dAngGearSteerRad
double dAngGearSteerRad
Definition: UndercarriageCtrlGeom.h:42
PlatformState::dVelLatMMS
double dVelLatMMS
Definition: UndercarriageCtrlGeom.h:28
angles.h
CtrlData::m_dVelGearDriveTargetRadS
double m_dVelGearDriveTargetRadS
Definition: UndercarriageCtrlGeom.h:230


cob_omni_drive_controller
Author(s): Christian Connette, Mathias Lüdtke
autogenerated on Mon May 1 2023 02:44:36