Laelaps  2.3.5
RoadNarrows Robotics Small Outdoor Mobile Robot Project
laeReports.cxx
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Package: Laelaps
4 //
5 // Library: liblaelaps
6 //
7 // File: laeReports.cxx
8 //
9 /*! \file
10  *
11  * $LastChangedDate: 2016-04-08 15:42:39 -0600 (Fri, 08 Apr 2016) $
12  * $Rev: 4380 $
13  *
14  * \brief Implementations of Laelaps requested and/or published report classes.
15  *
16  * \author Robin Knight (robin.knight@roadnarrows.com)
17  *
18  * \par Copyright
19  * \h_copy 2015-2017. RoadNarrows LLC.\n
20  * http://www.roadnarrows.com\n
21  * All Rights Reserved
22  */
23 /*
24  * @EulaBegin@
25  *
26  * Unless otherwise stated explicitly, all materials contained are copyrighted
27  * and may not be used without RoadNarrows LLC's written consent,
28  * except as provided in these terms and conditions or in the copyright
29  * notice (documents and software) or other proprietary notice provided with
30  * the relevant materials.
31  *
32  * IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY
33  * MEMBERS/EMPLOYEES/CONTRACTORS OF ROADNARROWS OR DISTRIBUTORS OF THIS SOFTWARE
34  * BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
35  * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
36  * DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN
37  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  * THE AUTHORS AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
40  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
41  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
42  * "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
43  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
44  *
45  * @EulaEnd@
46  */
47 ////////////////////////////////////////////////////////////////////////////////
48 
49 
50 #include <stdio.h>
51 
52 #include <string>
53 #include <vector>
54 
55 #include "rnr/rnrconfig.h"
56 #include "rnr/log.h"
57 
58 #include "Laelaps/RoboClaw.h"
59 
60 #include "Laelaps/laelaps.h"
61 #include "Laelaps/laeMotor.h"
62 #include "Laelaps/laeAlarms.h"
63 #include "Laelaps/laeDb.h"
64 #include "Laelaps/laeDesc.h"
65 #include "Laelaps/laeReports.h"
66 #include "Laelaps/laeRobot.h"
67 
68 using namespace std;
69 using namespace laelaps;
70 using namespace motor::roboclaw;
71 
72 
73 // -----------------------------------------------------------------------------
74 // Class LaeRptMotorCtlrHealth
75 // -----------------------------------------------------------------------------
76 
77 LaeRptMotorCtlrHealth::LaeRptMotorCtlrHealth()
78 {
79  m_fTemperature = 0.0;
80  m_fVoltage = 0.0;
81  LaeAlarms::clearAlarms(m_alarms);
82 }
83 
84 LaeRptMotorCtlrHealth::LaeRptMotorCtlrHealth(const LaeRptMotorCtlrHealth &src)
85 {
86  m_strName = src.m_strName;
87  m_fTemperature = src.m_fTemperature;
88  m_fVoltage = src.m_fVoltage;
89  LaeAlarms::copyAlarms(src.m_alarms, m_alarms);
90 }
91 
92 LaeRptMotorCtlrHealth LaeRptMotorCtlrHealth::operator=(
93  const LaeRptMotorCtlrHealth &rhs)
94 {
95  m_strName = rhs.m_strName;
96  m_fTemperature = rhs.m_fTemperature;
97  m_fVoltage = rhs.m_fVoltage;
98  LaeAlarms::copyAlarms(rhs.m_alarms, m_alarms);
99 
100  return *this;
101 }
102 
103 
104 // -----------------------------------------------------------------------------
105 // Class LaeRptMotorHealth
106 // -----------------------------------------------------------------------------
107 
108 LaeRptMotorHealth::LaeRptMotorHealth()
109 {
110  m_fTemperature = 0.0;
111  m_fVoltage = 0.0;
112  m_fCurrent = 0.0;
113  LaeAlarms::clearAlarms(m_alarms);
114 }
115 
116 LaeRptMotorHealth::LaeRptMotorHealth(const LaeRptMotorHealth &src)
117 {
118  m_strName = src.m_strName;
119  m_fTemperature = src.m_fTemperature;
120  m_fVoltage = src.m_fVoltage;
121  m_fCurrent = src.m_fCurrent;
122  LaeAlarms::copyAlarms(src.m_alarms, m_alarms);
123 }
124 
125 LaeRptMotorHealth LaeRptMotorHealth::operator=(const LaeRptMotorHealth &rhs)
126 {
127  m_strName = rhs.m_strName;
128  m_fTemperature = rhs.m_fTemperature;
129  m_fVoltage = rhs.m_fVoltage;
130  m_fCurrent = rhs.m_fCurrent;
131  LaeAlarms::copyAlarms(rhs.m_alarms, m_alarms);
132 
133  return *this;
134 }
135 
136 
137 // -----------------------------------------------------------------------------
138 // Class LaeRptRobotStatus
139 // -----------------------------------------------------------------------------
140 
141 LaeRptRobotStatus::LaeRptRobotStatus(const LaeRptRobotStatus &src)
142 {
143  // standard ROS industrial
144  m_eRobotMode = src.m_eRobotMode;
145  m_eIsEStopped = src.m_eIsEStopped;
146  m_eAreDrivesPowered = src.m_eAreDrivesPowered;
147  m_eIsMotionPossible = src.m_eIsMotionPossible;
148  m_eIsInMotion = src.m_eIsInMotion;
149  m_eIsInError = src.m_eIsInError;
150  m_nErrorCode = src.m_nErrorCode;
151 
152  // robot base extensions
153  m_fBatterySoC = src.m_fBatterySoC;
154  m_bIsCharging = src.m_bIsCharging;
155  m_fCurrent = src.m_fCurrent;
156  m_fVoltage = src.m_fVoltage;
157  m_fTemperature = src.m_fTemperature;
158  m_eAuxBattEn = src.m_eAuxBattEn;
159  m_eAux5VEn = src.m_eAux5VEn;
160  LaeAlarms::copyAlarms(src.m_alarms, m_alarms);
161 
162  // motor extensions
163  m_vecCtlrHealth = src.m_vecCtlrHealth;
164  m_vecMotorHealth = src.m_vecMotorHealth;
165 }
166 
167 LaeRptRobotStatus LaeRptRobotStatus::operator=(const LaeRptRobotStatus &rhs)
168 {
169  // standard ROS industrial
170  m_eRobotMode = rhs.m_eRobotMode;
171  m_eIsEStopped = rhs.m_eIsEStopped;
172  m_eAreDrivesPowered = rhs.m_eAreDrivesPowered;
173  m_eIsMotionPossible = rhs.m_eIsMotionPossible;
174  m_eIsInMotion = rhs.m_eIsInMotion;
175  m_eIsInError = rhs.m_eIsInError;
176  m_nErrorCode = rhs.m_nErrorCode;
177 
178  // robot base extensions
179  m_fBatterySoC = rhs.m_fBatterySoC;
180  m_bIsCharging = rhs.m_bIsCharging;
181  m_fCurrent = rhs.m_fCurrent;
182  m_fVoltage = rhs.m_fVoltage;
183  m_fTemperature = rhs.m_fTemperature;
184  m_eAuxBattEn = rhs.m_eAuxBattEn;
185  m_eAux5VEn = rhs.m_eAux5VEn;
186  LaeAlarms::copyAlarms(rhs.m_alarms, m_alarms);
187 
188  // motor extensions
189  m_vecCtlrHealth = rhs.m_vecCtlrHealth;
190  m_vecMotorHealth = rhs.m_vecMotorHealth;
191 
192  return *this;
193 }
194 
195 void LaeRptRobotStatus::clear()
196 {
197  // standard ROS industrial
198  m_eRobotMode = LaeRobotModeUnknown;
199  m_eIsEStopped = LaeTriStateUnknown;
200  m_eAreDrivesPowered = LaeTriStateUnknown;
201  m_eIsMotionPossible = LaeTriStateUnknown;
202  m_eIsInMotion = LaeTriStateUnknown;
203  m_eIsInError = LaeTriStateUnknown;
204  m_nErrorCode = LAE_OK;
205 
206  // robot base extensions
207  m_fBatterySoC = 0.0;
208  m_bIsCharging = false;
209  m_fCurrent = 0.0;
210  m_fVoltage = 0.0;
211  m_fTemperature = 0.0;
212  m_eAuxBattEn = LaeTriStateUnknown;
213  m_eAux5VEn = LaeTriStateUnknown;
214  LaeAlarms::clearAlarms(m_alarms);
215 
216  // motor extensions
217  m_vecCtlrHealth.clear();
218  m_vecMotorHealth.clear();
219 }
220 
221 void LaeRptRobotStatus::generate(LaeRobot *pRobot)
222 {
223  // ---
224  // ROS Industrial
225  // ---
226  m_eRobotMode = RtDb.m_robotstatus.m_eRobotMode;
227  m_eIsEStopped = RtDb.m_robotstatus.m_bIsEStopped?
228  LaeTriStateTrue: LaeTriStateFalse;
229  m_eAreDrivesPowered = RtDb.m_robotstatus.m_bAreMotorsPowered?
230  LaeTriStateTrue: LaeTriStateFalse;
231  m_eIsInMotion = RtDb.m_robotstatus.m_bInMotion?
232  LaeTriStateTrue: LaeTriStateFalse;
233 
234  // alarmed state
235  if( RtDb.m_robotstatus.m_bAlarmState )
236  {
237  m_eIsInError = LaeTriStateTrue;
238  m_nErrorCode = m_eIsEStopped == LaeTriStateTrue?
239  -LAE_ECODE_ESTOP: -LAE_ECODE_ALARMED;
240  }
241 
242  // unalarmed state
243  else
244  {
245  m_eIsInError = LaeTriStateFalse;
246  m_nErrorCode = LAE_OK;
247  }
248 
249  m_eIsMotionPossible = pRobot->canMove()? LaeTriStateTrue: LaeTriStateFalse;
250 
251  // ---
252  // Robot extended status
253  // ---
254  m_fBatterySoC = RtDb.m_energy.m_fBatterySoC;
255  m_bIsCharging = RtDb.m_energy.m_bBatteryIsCharging;
256  m_fCurrent = RtDb.m_energy.m_fTotalCurrent;
257  m_fVoltage = RtDb.m_energy.m_fBatteryVoltage;
258 
259  m_fTemperature = RtDb.m_robotstatus.m_fTempAvg;
260  m_eAuxBattEn = RtDb.m_enable.m_bAuxPortBatt?
261  LaeTriStateFalse: LaeTriStateTrue;
262  m_eAux5VEn = RtDb.m_enable.m_bAuxPort5v?
263  LaeTriStateFalse: LaeTriStateTrue;
264 
265  LaeAlarms::copyAlarms(RtDb.m_alarms.m_system, m_alarms);
266 
267  LaePlatform &base = pRobot->m_kin.getPlatform();
268 
269  //
270  // Motor controller health extended status
271  //
272  for(int nCtlr = 0; nCtlr < LaeNumMotorCtlrs; ++nCtlr)
273  {
274  LaeRptMotorCtlrHealth ctlrHealth;
275 
276  ctlrHealth.m_strName = base.m_ctlr[nCtlr].m_strName;
277  ctlrHealth.m_fTemperature = base.m_ctlr[nCtlr].m_fBoardTemp;
278  ctlrHealth.m_fVoltage = base.m_ctlr[nCtlr].m_fMainVolts;
279  LaeAlarms::copyAlarms(RtDb.m_alarms.m_motorctlr[nCtlr],
280  ctlrHealth.m_alarms);
281 
282  m_vecCtlrHealth.push_back(ctlrHealth);
283  }
284 
285  //
286  // Motor health extended status
287  //
288  LaeMapPowertrain::iterator iter; // kinematic chain iterator
289  LaeMapPowertrain &mapPowertrains = pRobot->m_kin.getPowertrainMap();
290 
291  for(iter = mapPowertrains.begin(); iter != mapPowertrains.end(); ++iter)
292  {
293  LaeRptMotorHealth motorHealth;
294  LaePowertrain &train = iter->second;
295  int nMotorId = train.m_attr.m_nMotorId;
296 
297  motorHealth.m_strName = train.m_strName;
298  motorHealth.m_fTemperature = train.m_state.m_fTemp;
299  motorHealth.m_fVoltage = train.m_state.m_fVolts;
300  LaeAlarms::copyAlarms(RtDb.m_alarms.m_motor[nMotorId],
301  motorHealth.m_alarms);
302 
303  m_vecMotorHealth.push_back(motorHealth);
304  }
305 }
306 
307 
308 // -----------------------------------------------------------------------------
309 // Class LaeRptDynPowertrain
310 // -----------------------------------------------------------------------------
311 
312 
313 LaeRptDynPowertrain::LaeRptDynPowertrain()
314 {
315  clear();
316 }
317 
318 LaeRptDynPowertrain::LaeRptDynPowertrain(const LaeRptDynPowertrain &src)
319 {
320  m_strName = src.m_strName;
321  m_nEncoder = src.m_nEncoder;
322  m_nSpeed = src.m_nSpeed;
323  m_fPosition = src.m_fPosition;
324  m_fVelocity = src.m_fVelocity;
325  m_fPe = src.m_fPe;
326  m_fTorque = src.m_fTorque;
327 }
328 
329 
330 LaeRptDynPowertrain LaeRptDynPowertrain::operator=(const LaeRptDynPowertrain
331  &rhs)
332 {
333  m_strName = rhs.m_strName;
334  m_nEncoder = rhs.m_nEncoder;
335  m_nSpeed = rhs.m_nSpeed;
336  m_fPosition = rhs.m_fPosition;
337  m_fVelocity = rhs.m_fVelocity;
338  m_fPe = rhs.m_fPe;
339  m_fTorque = rhs.m_fTorque;
340 
341  return *this;
342 }
343 
344 void LaeRptDynPowertrain::clear()
345 {
346  m_strName.clear();
347  m_nEncoder = 0;
348  m_nSpeed = 0;
349  m_fPosition = 0.0;
350  m_fVelocity = 0.0;
351  m_fPe = 0.0;
352  m_fTorque = 0.0;
353 }
354 
355 void LaeRptDynPowertrain::generate(int nMotorId)
356 {
357  m_strName = LaeDesc::KeyPowertrain[nMotorId];
358  m_nEncoder = RtDb.m_kin.m_powertrain[nMotorId].m_nEncoder;
359  m_nSpeed = RtDb.m_kin.m_powertrain[nMotorId].m_nSpeed;
360  m_fPosition = RtDb.m_kin.m_powertrain[nMotorId].m_fPosition;
361  m_fVelocity = RtDb.m_kin.m_powertrain[nMotorId].m_fVelocity;
362  m_fPe = RtDb.m_kin.m_powertrain[nMotorId].m_fPe;
363  m_fTorque = RtDb.m_kin.m_powertrain[nMotorId].m_fTorque;
364 }
365 
366 
367 // -----------------------------------------------------------------------------
368 // Class LaeRptDynamics
369 // -----------------------------------------------------------------------------
370 
371 LaeRptDynamics::LaeRptDynamics()
372 {
373  clear();
374 }
375 
376 LaeRptDynamics::LaeRptDynamics(const LaeRptDynamics &src)
377 {
378  m_pose = src.m_pose;
379  m_fOdometer = src.m_fOdometer;
380  m_fVelocity = src.m_fVelocity;
381 
382  m_vecDynPowertrain = src.m_vecDynPowertrain;
383 }
384 
385 LaeRptDynamics LaeRptDynamics::operator=(const LaeRptDynamics &rhs)
386 {
387  m_pose = rhs.m_pose;
388  m_fOdometer = rhs.m_fOdometer;
389  m_fVelocity = rhs.m_fVelocity;
390  m_vecDynPowertrain = rhs.m_vecDynPowertrain;
391 
392  return *this;
393 }
394 
395 void LaeRptDynamics::clear()
396 {
397  m_pose.clear();
398  m_fOdometer = 0.0;
399  m_fVelocity = 0.0;
400  m_vecDynPowertrain.clear();
401 }
402 
403 void LaeRptDynamics::generate(LaeRobot *pRobot)
404 {
405  int nMotorId;
407 
408  //
409  // Platform dynamics
410  //
411  m_pose.m_x = RtDb.m_kin.m_robot.m_x;
412  m_pose.m_y = RtDb.m_kin.m_robot.m_y;
413  m_pose.m_theta = RtDb.m_kin.m_robot.m_theta;
414  m_fOdometer = RtDb.m_kin.m_robot.m_fOdometer;
415  m_fVelocity = RtDb.m_kin.m_robot.m_fVelocity;
416 
417  //
418  // Powertrain dynamics
419  //
420  for(nMotorId = 0; nMotorId < LaeMotorsNumOf; ++nMotorId)
421  {
422  pt.clear();
423  pt.generate(nMotorId);
424  m_vecDynPowertrain.push_back(pt);
425  }
426 }
double m_fVoltage
motor controller main input voltage (V)
Definition: laeReports.h:81
std::string m_strName
motor controller name
Definition: laePlatform.h:78
double m_fBatterySoC
battery state of charge (0%-100%)
Definition: laeReports.h:179
Robot motor health.
Definition: laeReports.h:76
double m_fVelocity
robot linear velocity v (meters/second)
Definition: laeReports.h:310
double m_fPe
motor input electrical power (W)
Definition: laeReports.h:251
double m_fTemp
motor temperature (C)
LaeTriState m_eIsInMotion
robot is [not] moving
Definition: laeReports.h:174
double m_fTemperature
motor controller board temperature (C)
Definition: laeReports.h:80
std::string m_strName
powertrain unique name (key)
RoboClaw motor controller class interface.
bool canMove()
Test if robot is safe to operate, given the current robot and alarm state.
Definition: laeRobot.cxx:807
LaeTriState m_eIsInError
robot is [not] in error condition
Definition: laeReports.h:175
LaeAlarmInfo m_alarms
motor alarms and warnings
Definition: laeReports.h:126
Laelaps dynamics report.
Definition: laeReports.h:302
double m_fBoardTemp
average sensed interior tempature (C)
Definition: laePlatform.h:80
VecMotorCtlrHealth m_vecCtlrHealth
motors controllers&#39; health
Definition: laeReports.h:189
LaeTriState m_eIsMotionPossible
motion is [not] possible
Definition: laeReports.h:173
VecDynPowertrain m_vecDynPowertrain
powertrains&#39; state
Definition: laeReports.h:313
int m_nSpeed
raw speed (qpps)
Definition: laeReports.h:248
LaeTriState m_eAux5VEn
auxilliary 5V power enable
Definition: laeReports.h:185
double m_fOdometer
robot odometer (meters)
Definition: laeReports.h:309
double m_fPosition
wheel angular position (radians)
Definition: laeReports.h:249
Powertrain dynamics subreport.
Definition: laeReports.h:243
double m_fVoltage
average battery voltage (V)
Definition: laeReports.h:182
double m_fVoltage
motor voltage (volts)
Definition: laeReports.h:124
LaePowertrainAttr m_attr
semi-fixed attribute data
void generate(int nMotorId)
Generate report.
Definition: laeReports.cxx:355
The <b><i>Laelaps</i></b> namespace encapsulates all <b><i>Laelaps</i></b> related constructs...
Definition: laeAlarms.h:64
Interfaces of Laelaps requested and/or published report classes.
Laelaps robotic base mobile platform description class interface.
Robot motor health.
Definition: laeReports.h:119
LaeMapPowertrain & getPowertrainMap()
Get map of all powertrain kinodynamics.
Definition: laeKin.h:247
double m_fVolts
input motor voltage (V)
double m_fCurrent
estimated robot draw (A)
Definition: laeReports.h:181
std::string m_strName
motor controller name
Definition: laeReports.h:79
LaeTriState m_eIsEStopped
robot is [not] emergency stopped
Definition: laeReports.h:171
Laelasp Robot Class interface.
double m_fCurrent
motor current draw (amperes)
Definition: laeReports.h:125
double m_fTemperature
motor temperature (Celsius)
Definition: laeReports.h:123
double m_fMainVolts
average sensed battery voltage (V)
Definition: laePlatform.h:79
s64_t m_nEncoder
motor encoder position (quad pulses)
Definition: laeReports.h:247
LaeAlarmInfo m_alarms
motor controller alarms and warnings
Definition: laeReports.h:82
LaePlatform & getPlatform()
Get robot platform kinodynamics.
Definition: laeKin.h:226
Laelaps motors, encoder, and controllers hardware abstraction interfaces.
std::string m_strName
powertrain unique name (key)
Definition: laeReports.h:246
LaeRobotMode m_eRobotMode
robot operating mode
Definition: laeReports.h:170
Laelaps alarm monitoring class interface.
void clear()
Clear report.
Definition: laeReports.cxx:344
LaeAlarmInfo m_alarms
system alarms and warnings
Definition: laeReports.h:186
Robot global status report.
Definition: laeReports.h:163
LaePowertrainState m_state
dynamic state data
double m_fTorque
wheel torque (N-m)
Definition: laeReports.h:252
VecMotorHealth m_vecMotorHealth
motors&#39; health
Definition: laeReports.h:190
LaeKinematics m_kin
robot base dynamics and kinematics
Definition: laeRobot.h:665
int m_nErrorCode
laelaps error code
Definition: laeReports.h:176
LaeMotorCtlrState m_ctlr[LaeNumMotorCtlrs]
motor controllers&#39; state
Definition: laePlatform.h:161
double m_fTemperature
interior average temperature (C)
Definition: laeReports.h:183
LaeTriState m_eAreDrivesPowered
motor are [not] powered
Definition: laeReports.h:172
std::string m_strName
motor name
Definition: laeReports.h:122
Powertrain data class.
LaePose m_pose
robot 2D pose (meters, meters, radians)
Definition: laeReports.h:308
Laelaps real-time "database".
double m_fVelocity
wheel angular velocity (radians/second)
Definition: laeReports.h:250
LaeTriState m_eAuxBattEn
auxilliary battery power enable
Definition: laeReports.h:184
bool m_bIsCharging
battery is [not] being charged
Definition: laeReports.h:180
Laelaps robotic manipulator plus accesories class.
Definition: laeRobot.h:103
Top-level package include file.
Robot platform control and state data class.
Definition: laePlatform.h:127