Main MRPT website > C++ reference for MRPT 1.9.9
CGyroKVHDSP3000.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2017, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "hwdrivers-precomp.h" // Precompiled headers
11 
14 
15 #include <thread>
16 
18 
19 using namespace mrpt::utils;
20 using namespace mrpt::comms;
21 using namespace mrpt::obs;
22 using namespace mrpt::hwdrivers;
23 using namespace std;
24 
25 /*-------------------------------------------------------------
26  CGyroKVHDSP3000
27 -------------------------------------------------------------*/
28 CGyroKVHDSP3000::CGyroKVHDSP3000()
29  : m_COMbauds(38400),
30  m_com_port(),
31  m_sensorPose(),
32  m_mode(RATE),
33  m_firstInteration(true)
34 {
36  m_sensorLabel = "KVH_DSP3000";
37  m_serialPort = nullptr;
38 }
39 
40 /*-------------------------------------------------------------
41  ~CGyroKVHDSP3000
42 -------------------------------------------------------------*/
44 {
46  delete m_serialPort;
47 }
48 
49 /*-------------------------------------------------------------
50  doProcess
51 -------------------------------------------------------------*/
53 {
54  if (m_state == ssError)
55  {
56  std::this_thread::sleep_for(200ms);
57  initialize();
58  }
59 
60  if (m_state == ssError) return;
61 
62  string msg;
63  CObservationIMU::Ptr observationGyro =
64  mrpt::make_aligned_shared<CObservationIMU>();
65  observationGyro->timestamp = mrpt::system::now();
66 
67  msg = m_serialPort->ReadString(-1, nullptr, "\n");
68 
69  observationGyro->sensorPose = m_sensorPose;
70  observationGyro->sensorLabel = m_sensorLabel;
71  string delimiter(" ");
72  vector<string> words;
73  mrpt::system::tokenize(msg, delimiter, words);
74  if (words.size() < 2) return;
75  if (words[1].c_str()[0] == '0') return;
76  double mesure = atof(words[0].c_str());
77  switch (m_mode)
78  {
79  case RATE:
80  observationGyro->rawMeasurements[IMU_YAW_VEL] = DEG2RAD(mesure);
81  observationGyro->dataIsPresent[IMU_YAW_VEL] = true;
82  break;
83  case INTEGRATED_ANGLE:
84  case INCREMENTAL_ANGLE:
85  observationGyro->rawMeasurements[IMU_YAW] = DEG2RAD(mesure);
86  observationGyro->dataIsPresent[IMU_YAW] = true;
87  break;
88  }
89 
90  if (!m_firstInteration)
91  {
92  appendObservation(observationGyro);
93  }
94  else
95  m_firstInteration = false;
96 }
97 
98 /*-------------------------------------------------------------
99  initialize
100 -------------------------------------------------------------*/
102 {
103  m_process_rate = 100;
104 
105  /*
106  Open modem device for reading and writing and not as controlling tty
107  because we don't want to get killed if linenoise sends CTRL-C.
108  */
109  if (m_serialPort) delete m_serialPort;
111  if (!(m_serialPort->isOpen())) THROW_EXCEPTION("can't open serial port");
112  cout << "m_COMbaud " << m_COMbauds << endl;
114 
117  m_state = ssWorking;
118 }
119 
120 /*-------------------------------------------------------------
121  loadConfig_sensorSpecific
122 -------------------------------------------------------------*/
124  const mrpt::utils::CConfigFileBase& configSource,
125  const std::string& iniSection)
126 {
128  configSource.read_float(iniSection, "pose_x", 0, false),
129  configSource.read_float(iniSection, "pose_y", 0, false),
130  configSource.read_float(iniSection, "pose_z", 0, false),
131  DEG2RAD(configSource.read_float(iniSection, "pose_yaw", 0, false)),
132  DEG2RAD(configSource.read_float(iniSection, "pose_pitch", 0, false)),
133  DEG2RAD(configSource.read_float(iniSection, "pose_roll", 0, false)));
134  string operatingMode =
135  configSource.read_string(iniSection, "operatingMode", "rate", false);
136  cout << "Operating mode : " << operatingMode << endl;
137  if (operatingMode == "incremental")
138  {
140  cout << "Incremental mode" << endl;
141  }
142  else if (operatingMode == "integral")
143  {
145  cout << "Integrated mode" << endl;
146  }
147  else
148  {
149  m_mode = RATE;
150  cout << "Rate mode" << endl;
151  }
152  m_com_port =
153  configSource.read_string(iniSection, "COM_port_LIN", m_com_port, false);
154 }
155 
157 {
158  m_mode = _newMode;
159  char commande[3];
160  switch (m_mode)
161  {
162  case RATE:
163  commande[0] = 'R';
164  break;
165  case INTEGRATED_ANGLE:
166  commande[0] = 'P';
167  break;
168  case INCREMENTAL_ANGLE:
169  commande[0] = 'A'; // incremental.
170  break;
171  }
172  commande[1] = 0x0A;
173  commande[2] = 0;
174  // we send the command four times to be sure that the command will be
175  // interpreted by the sensor.
176  if (m_serialPort->Write(commande, 3 * sizeof(char)) <= 0)
177  {
178  THROW_EXCEPTION("can't write on serial port");
179  }
180 }
181 
183 {
184  if (m_mode != RATE)
185  {
186  char commande[3];
187  commande[0] = 'Z';
188  commande[1] = '\n';
189  commande[2] = 0;
190  if (m_serialPort->Write(commande, 3 * sizeof(char)) <= 0)
191  {
192  THROW_EXCEPTION("can't write on serial port");
193  }
194  }
195 }
#define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace)
This must be inserted in all CGenericSensor classes implementation files:
#define DEG2RAD
Definition: bits.h:112
A communications serial port built as an implementation of a utils::CStream.
Definition: CSerialPort.h:48
bool isOpen() const
Returns if port has been correctly open.
void setConfig(int baudRate, int parity=0, int bits=8, int nStopBits=1, bool enableFlowControl=false)
Changes the configuration of the port.
std::string ReadString(const int total_timeout_ms=-1, bool *out_timeout=nullptr, const char *eol_chars="\r\n")
Reads one text line from the serial port in POSIX "canonical mode".
size_t Write(const void *Buffer, size_t Count)
Implements the virtual method responsible for writing to the stream.
void close()
Close the port.
double m_process_rate
See CGenericSensor.
std::string m_sensorLabel
See CGenericSensor.
void appendObservation(const mrpt::utils::CSerializable::Ptr &obj)
Like appendObservations() but for just one observation.
A class for interfacing KVH DSP 3000 gyroscope with an assynchronous serial communication (product SN...
virtual ~CGyroKVHDSP3000()
Destructor.
void doProcess()
This method will be invoked at a minimum rate of "process_rate" (Hz)
void changeMode(GYRO_MODE _newMode)
void resetIncrementalAngle(void)
Send to the sensor the command 'Z' wich reset the integrated angle.
mrpt::comms::CSerialPort * m_serialPort
Search the port where the sensor is located and connect to it.
mrpt::poses::CPose3D m_sensorPose
void initialize()
Turns on the KVH DSP 3000 device and configure it for getting orientation data.
void loadConfig_sensorSpecific(const mrpt::utils::CConfigFileBase &configSource, const std::string &iniSection)
See the class documentation at the top for expected parameters.
int m_COMbauds
This serial port will be attempted to be opened automatically when this class is first used to reques...
std::shared_ptr< CObservationIMU > Ptr
void setFromValues(const double x0, const double y0, const double z0, const double yaw=0, const double pitch=0, const double roll=0)
Set the pose from a 3D position (meters) and yaw/pitch/roll angles (radians) - This method recomputes...
Definition: CPose3D.cpp:248
This class allows loading and storing values and vectors of different types from a configuration text...
std::string read_string(const std::string &section, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
float read_float(const std::string &section, const std::string &name, float defaultValue, bool failIfNotFound=false) const
GLsizei const GLchar ** string
Definition: glext.h:4101
@ IMU_YAW
orientation yaw absolute value (global/navigation frame) (rad)
@ IMU_YAW_VEL
yaw angular velocity (local/vehicle frame) (rad/sec)
void tokenize(const std::string &inString, const std::string &inDelimiters, std::deque< std::string > &outTokens, bool skipBlankTokens=true) noexcept
Tokenizes a string according to a set of delimiting characters.
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
Definition: datetime.h:76
#define THROW_EXCEPTION(msg)
Definition: mrpt_macros.h:111
Serial and networking devices and utilities.
Contains classes for various device interfaces.
This namespace contains representation of robot actions and observations.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...



Page generated by Doxygen 1.9.1 for MRPT 1.9.9 Git: 63ea9d1f1 Thu Nov 23 00:06:53 2017 +0100 at mar 26 may 2026 12:19:29 CEST