orca-robotics INTRODUCTION Overview Download and Install Documentation REPOSITORY Interfaces Drivers Libraries Utilities Software Map DEVELOPER Dashboard PEOPLE Contributors Users Project Download Mailing lists
|
rxdata.h00001 /* 00002 * Orca-Robotics Project: Components for robotics 00003 * http://orca-robotics.sf.net/ 00004 * Copyright (c) 2004-2008 Alex Brooks, Alexei Makarenko, Tobias Kaupp 00005 * 00006 * This copy of Orca is licensed to you under the terms described in 00007 * the LICENSE file included in this distribution. 00008 * 00009 */ 00010 00011 #ifndef SEGWAYRMP_RXDATA_H 00012 #define SEGWAYRMP_RXDATA_H 00013 00014 #include <vector> 00015 00016 #include "rawrxdata.h" 00017 #include "unitconverter.h" 00018 00019 namespace segwayrmpacfr { 00020 00021 class CanPacket; 00022 00023 // 00024 // @brief Holds data received by the host from the RMP. 00025 // The actual data is stored in a RmpRawData structure. 00026 // Public member functions return the data in sane units. 00027 // 00028 // This thing is supposed to have a lifetime longer than an individual CAN packet. 00029 // Since different CAN packets hold different kinds of data, this thing acts 00030 // as an accumulator. 00031 // 00032 class RxData 00033 { 00034 00035 public: 00036 00037 // Data is empty on construction. 00038 RxData( RmpModel rmpModel ); 00039 00040 // Adds the information contained in a single CAN packet 00041 void addPacket( const CanPacket &pkt ) { rawData_.addPacket(pkt); } 00042 // Did all the packets arrive? 00043 bool isComplete() const { return rawData_.isComplete(); } 00044 00045 // 00046 // Functions for retreiving the data in sane units. 00047 // Should only be called when the data structure is full. 00048 // 00049 // All units are S.I. 00050 // 00051 00052 // Get all status flags 00053 std::vector<StatusFlag> statusFlags() const; 00054 // Is there a warning condition? 00055 bool isWarn() const; 00056 // Is there an error condition? 00057 bool isFault() const; 00058 00059 // Not sure how to interpret the build ID, so just report it as-is. 00060 int16_t buildId() const 00061 { 00062 return rawData_.build_id; 00063 } 00064 00065 // roll/pitch/yaw 00066 double pitchAngle() const 00067 { 00068 return converter_.angleInRadians(rawData_.pitch); 00069 } 00070 double pitchRate() const 00071 { 00072 return converter_.angularRateInRadians(rawData_.pitch_dot); 00073 } 00074 double rollAngle() const 00075 { 00076 return converter_.angleInRadians(rawData_.roll); 00077 } 00078 double rollRate() const 00079 { 00080 return converter_.angularRateInRadians(rawData_.roll_dot); 00081 } 00082 double yaw() const 00083 { 00084 // Note special case: angle specified in revolutions 00085 return converter_.angleInRadiansFromRevCounts(rawData_.yaw); 00086 } 00087 double yawRate() const 00088 { 00089 // take the additive inverse, since the RMP reports 00090 // clockwise angular velocity as positive. 00091 return -converter_.angularRateInRadians(rawData_.yaw_dot); 00092 } 00093 00094 // wheels 00095 double leftWheelDisplacement() const 00096 { 00097 return converter_.distanceInM(rawData_.left_wheel_displacement); 00098 } 00099 00100 double rightWheelDisplacement() const 00101 { 00102 return converter_.distanceInM(rawData_.right_wheel_displacement); 00103 } 00104 double leftWheelVelocity() const 00105 { 00106 return converter_.speedInMperS(rawData_.left_wheel_velocity); 00107 } 00108 double rightWheelVelocity() const 00109 { 00110 return converter_.speedInMperS(rawData_.right_wheel_velocity); 00111 } 00112 00113 // values based on wheels 00114 double foreAftDisplacement() const 00115 { 00116 return converter_.distanceInM(rawData_.foreaft_displacement); 00117 } 00118 double leftMotorTorque() const 00119 { 00120 return converter_.torqueInNM(rawData_.left_torque); 00121 } 00122 double rightMotorTorque() const 00123 { 00124 return converter_.torqueInNM(rawData_.right_torque); 00125 } 00126 00127 // other gear 00128 int servoFrames() 00129 { 00130 return rawData_.servo_frames; 00131 } 00132 double uiBatteryVoltage() 00133 { 00134 return converter_.uiVoltageInVolts(rawData_.ui_battery_voltage); 00135 } 00136 // We only know the minimum of the two main batteries. 00137 double baseBatteryVoltage() 00138 { 00139 return converter_.baseVoltageInVolts(rawData_.base_battery_voltage); 00140 } 00141 OperationalMode operationalMode() 00142 { 00143 return converter_.operationalModeAsEnum(rawData_.operational_mode); 00144 } 00145 GainSchedule gainSchedule() 00146 { 00147 return converter_.gainScheduleAsEnum(rawData_.controller_gain_schedule); 00148 } 00149 00150 // double receivedVelocityCommand() 00151 // { 00152 // return converter_. 00153 // } 00154 00155 00156 // Prints out in human-readable form 00157 std::string toString() const { return rawData_.toString(); } 00158 00159 // Allow direct access to the raw data 00160 const RawRxData rawData() const { return rawData_; } 00161 00162 private: 00163 00164 // Stores the data in the RMP's native representation 00165 RawRxData rawData_; 00166 00167 // Convert between units 00168 UnitConverter converter_; 00169 }; 00170 00171 } 00172 00173 #endif |
Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)