Main MRPT website > C++ reference for MRPT 1.5.7
CHokuyoURG.h
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2018, 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 #ifndef CHokuyoURG_H
10 #define CHokuyoURG_H
11 
15 #include <mrpt/poses/CPose3D.h>
16 
17 namespace mrpt {
18 namespace hwdrivers {
19 /** This software driver implements the protocol SCIP-2.0 for interfacing HOKUYO
20  * URG/UTM/UXM/UST laser scanners (USB or Ethernet).
21  * Refer to the example code
22  * [HOKUYO_laser_test](http://www.mrpt.org/tutorials/mrpt-examples/example_hokuyo_urgutm_laser_scanner/)
23  * and to example rawlog-grabber [config
24  * files](https://github.com/MRPT/mrpt/tree/master/share/mrpt/config_files/rawlog-grabber)
25  *
26  * See also the application "rawlog-grabber" for a ready-to-use application to
27  * gather data from the scanner.
28  *
29  * \code
30  * PARAMETERS IN THE ".INI"-LIKE CONFIGURATION STRINGS:
31  * -------------------------------------------------------
32  * [supplied_section_name]
33  * HOKUYO_motorSpeed_rpm=600
34  * #HOKUYO_HS_mode = false // Optional (un-comment line if used):
35  * Set/unset the High-sensitivity mode (not on all models/firmwares!)
36  *
37  * # Uncomment serial port or IP address, depending on the Hokuyo model
38  * (serial/USB vs. Ethernet):
39  * COM_port_WIN = COM3 // Serial port name in Windows
40  * COM_port_LIN = ttyS0 // Serial port name in GNU/Linux
41  * #IP_DIR = 192.168.0.10 // Uncommented this and "PORT_DIR" if the
42  * used HOKUYO is connected by Ethernet instead of USB
43  * #PORT_DIR = 10940 // Default value: 10940
44  *
45  * pose_x=0.21 // Laser range scaner 3D position in the robot (meters)
46  * pose_y=0
47  * pose_z=0.34
48  * pose_yaw=0 // Angles in degrees
49  * pose_pitch=0
50  * pose_roll=0
51  *
52  * #disable_firmware_timestamp = true // Uncomment to use PC time instead
53  * of laser time
54  *
55  * # Optional: reduced FOV:
56  * # reduced_fov = 25 // Deg
57  *
58  * # Sets decimation of scans directly at the Hokuyo scanner.
59  * # 0=means send all scans, 1=means send 50% of scans, etc.
60  * # scan_interval = 0
61  *
62  * #preview = true // Enable GUI visualization of captured data
63  *
64  * # Optional: Exclusion zones to avoid the robot seeing itself:
65  * #exclusionZone1_x = 0.20 0.30 0.30 0.20
66  * #exclusionZone1_y = 0.20 0.30 0.30 0.20
67  *
68  * # Optional: Exclusion zones to avoid the robot seeing itself:
69  * #exclusionAngles1_ini = 20 // Deg
70  * #exclusionAngles1_end = 25 // Deg
71  *
72  * \endcode
73  * \ingroup mrpt_hwdrivers_grp
74  */
77 public:
78  /** Used in CHokuyoURG::displayVersionInfo */
80  /** The sensor model */
82  /** Min/Max ranges, in meters. */
83  double d_min{0}, d_max{0};
84  /** Number of measuremens per 360 degrees. */
85  int scans_per_360deg{0};
86  /** First, last, and front step of the scanner angular span. */
87  int scan_first{0}, scan_last{0}, scan_front{0};
88  /** Standard motor speed, rpm. */
89  int motor_speed_rpm{0};
90  };
91 
92 private:
93  /** The first and last ranges to consider from the scan. */
94  int m_firstRange, m_lastRange;
95  /** The motor speed (default=600rpm) */
97  /** The sensor 6D pose: */
99  /** Auxiliary buffer for readings */
101 
102  /** The last sent measurement command (MDXXX), including the last 0x0A. */
104 
105  /** High sensitivity [HS] mode (default: false) */
108 
109  /** Enables the SCIP2.0 protocol (this must be called at the very
110  * begining!).
111  * \return false on any error
112  */
113  bool enableSCIP20();
114 
115  /** Passes to 115200bps bitrate.
116  * \return false on any error
117  */
118  bool setHighBaudrate();
119 
120  /** Switchs the laser on.
121  * \return false on any error
122  */
123  bool switchLaserOn();
124 
125  /** Switchs the laser off
126  * \return false on any error
127  */
128  bool switchLaserOff();
129 
130  /** Changes the motor speed in rpm's (default 600rpm)
131  * \return false on any error
132  */
133  bool setMotorSpeed(int motoSpeed_rpm);
134 
135  /** Ask to the device, and print to the debug stream, details about the
136  * firmware version,serial number,...
137  * \return false on any error
138  */
139  bool displayVersionInfo();
140 
141  /** Ask to the device, and print to the debug stream, details about the
142  * sensor model.
143  * It also optionally saves all the information in an user supplied data
144  * structure "out_data".
145  * \return false on any error
146  */
147  bool displaySensorInfo(CHokuyoURG::TSensorInfo *out_data = NULL);
148 
149  /** Start the continuous scanning mode, using parameters stored in the object
150  * (loaded from the .ini file). Maps to SCIP2.0 commands MD (no intensity) or
151  * ME (intensity). After this command the device will start to send scans
152  * until switchLaserOff() is called. \return false on any error
153  */
154  bool startScanningMode();
155 
156  /** Turns the laser on */
157  void initialize();
158 
159  /** Waits for a response from the device. Packet is stored in m_rcv_data,
160  * and status codes in the reference parameters.
161  * \return false on any error
162  */
163  bool receiveResponse(char &rcv_status0, char &rcv_status1);
164 
165  /** Assures a minimum number of bytes in the input buffer, reading from the
166  * serial port only if required.
167  * \return false if the number of bytes are not available, even after
168  * trying to fetch more data from the serial port.
169  */
170  bool assureBufferHasBytes(const size_t nDesiredBytes);
171 
172 public:
173  /** Constructor
174  */
175  CHokuyoURG();
176 
177  /** Destructor: turns the laser off */
178  virtual ~CHokuyoURG();
179 
180  /** Specific laser scanner "software drivers" must process here new data
181  * from the I/O stream, and, if a whole scan has arrived, return it.
182  * This method will be typically called in a different thread than other
183  * methods, and will be called in a timely fashion.
184  */
185  void doProcessSimple(bool &outThereIsObservation,
186  mrpt::obs::CObservation2DRangeScan &outObservation,
187  bool &hardwareError);
188 
189  /** Enables the scanning mode (which may depend on the specific laser
190  * device); this must be called before asking for observations to assure
191  * that the protocol has been initializated.
192  * \return If everything works "true", or "false" if there is any error.
193  */
194  bool turnOn();
195 
196  /** Disables the scanning mode (this can be used to turn the device in low
197  * energy mode, if available)
198  * \return If everything works "true", or "false" if there is any error.
199  */
200  bool turnOff();
201 
202  /** Empties the RX buffers of the serial port */
203  void purgeBuffers();
204 
205  /** If set to non-empty, the serial port will be attempted to be opened
206  * automatically when this class is first used to request data from the
207  * laser. */
208  void setSerialPort(const std::string &port_name) { m_com_port = port_name; }
209  /** Set the ip direction and port to connect using Ethernet communication */
210  void setIPandPort(const std::string &ip, const unsigned int &port) {
211  m_ip_dir = ip;
212  m_port_dir = port;
213  }
214 
215  /** Returns the currently set serial port \sa setSerialPort */
216  const std::string getSerialPort() { return m_com_port; }
217  /** If called (before calling "turnOn"), the field of view of the laser is
218  * reduced to the given range (in radians), discarding the rest of measures.
219  * Call with "0" to disable this reduction again (the default).
220  */
221  void setReducedFOV(const double fov) { m_reduced_fov = fov; }
222  /** Changes the high sensitivity mode (HS) (default: false)
223  * \return false on any error
224  */
225  bool setHighSensitivityMode(bool enabled);
226 
227  /** If true scans will capture intensity. (default: false)
228  * Should not be called while scanning.
229  * \return false on any error
230  */
231  bool setIntensityMode(bool enabled);
232 
233  /** Set the skip scan count (0 means send all scans).
234  * Must be set before initialize()
235  */
236  void setScanInterval(unsigned int skipScanCount);
237  unsigned int getScanInterval() const;
238 
239  void sendCmd(const char *str);
240 
241 protected:
242  /** temp buffer for incoming data packets */
244 
245  /** Returns true if there is a valid stream bound to the laser scanner,
246  * otherwise it first try to open the serial port "m_com_port"
247  */
248  bool ensureStreamIsOpen();
249 
250  /** Used to reduce artificially the interval of scan ranges. */
252 
253  /** If set to non-empty, the serial port will be attempted to be opened
254  * automatically when this class is first used to request data from the
255  * laser. */
257 
258  /** If set to non-empty and m_port_dir too, the program will try to connect
259  * to a Hokuyo using Ethernet communication */
261  /** If set to non-empty and m_ip_dir too, the program will try to connect to
262  * a Hokuyo using Ethernet communication */
263  unsigned int m_port_dir;
264 
265  /** The information gathered when the laser is first open */
267 
269 
270  /** Time of the first data packet, for synchronization purposes. */
272  /** Counter to discard to first few packets before setting the
273  * correspondence between device and computer timestamps. */
277  /** Get intensity from lidar scan (default: false) */
279  unsigned int m_scan_interval;
280 
281  /** See the class documentation at the top for expected parameters */
282  void
283  loadConfig_sensorSpecific(const mrpt::utils::CConfigFileBase &configSource,
284  const std::string &iniSection);
285 
286 }; // End of class
287 
288 } // namespace hwdrivers
289 
290 } // namespace mrpt
291 
292 #endif
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
Definition: datetime.h:30
const std::string getSerialPort()
Returns the currently set serial port.
Definition: CHokuyoURG.h:216
std::string m_com_port
If set to non-empty, the serial port will be attempted to be opened automatically when this class is ...
Definition: CHokuyoURG.h:256
uint32_t m_timeStartUI
Time of the first data packet, for synchronization purposes.
Definition: CHokuyoURG.h:271
void setReducedFOV(const double fov)
If called (before calling "turnOn"), the field of view of the laser is reduced to the given range (in...
Definition: CHokuyoURG.h:221
std::string m_rcv_data
temp buffer for incoming data packets
Definition: CHokuyoURG.h:243
bool m_intensity
Get intensity from lidar scan (default: false)
Definition: CHokuyoURG.h:278
unsigned int m_port_dir
If set to non-empty and m_ip_dir too, the program will try to connect to a Hokuyo using Ethernet comm...
Definition: CHokuyoURG.h:263
This class allows loading and storing values and vectors of different types from a configuration text...
std::string m_lastSentMeasCmd
The last sent measurement command (MDXXX), including the last 0x0A.
Definition: CHokuyoURG.h:103
mrpt::gui::CDisplayWindow3D::Ptr m_win
Definition: CHokuyoURG.h:107
void setSerialPort(const std::string &port_name)
If set to non-empty, the serial port will be attempted to be opened automatically when this class is ...
Definition: CHokuyoURG.h:208
Used in CHokuyoURG::displayVersionInfo.
Definition: CHokuyoURG.h:79
int m_timeStartSynchDelay
Counter to discard to first few packets before setting the correspondence between device and computer...
Definition: CHokuyoURG.h:274
mrpt::system::TTimeStamp m_timeStartTT
Definition: CHokuyoURG.h:275
GLsizei const GLchar ** string
Definition: glext.h:3919
int m_motorSpeed_rpm
The motor speed (default=600rpm)
Definition: CHokuyoURG.h:96
#define DEFINE_GENERIC_SENSOR(class_name)
This declaration must be inserted in all CGenericSensor classes definition, within the class declarat...
This is the base, abstract class for "software drivers" interfaces to 2D scanners (laser range finder...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
Definition: CPose3D.h:72
void setIPandPort(const std::string &ip, const unsigned int &port)
Set the ip direction and port to connect using Ethernet communication.
Definition: CHokuyoURG.h:210
This software driver implements the protocol SCIP-2.0 for interfacing HOKUYO URG/UTM/UXM/UST laser sc...
Definition: CHokuyoURG.h:75
poses::CPose3D m_sensorPose
The sensor 6D pose:
Definition: CHokuyoURG.h:98
unsigned int m_scan_interval
Definition: CHokuyoURG.h:279
TSensorInfo m_sensor_info
The information gathered when the laser is first open.
Definition: CHokuyoURG.h:266
bool m_highSensMode
High sensitivity [HS] mode (default: false)
Definition: CHokuyoURG.h:106
std::string model
The sensor model.
Definition: CHokuyoURG.h:81
double m_reduced_fov
Used to reduce artificially the interval of scan ranges.
Definition: CHokuyoURG.h:251
mrpt::utils::circular_buffer< uint8_t > m_rx_buffer
Auxiliary buffer for readings.
Definition: CHokuyoURG.h:100
unsigned __int32 uint32_t
Definition: rptypes.h:49
std::string m_ip_dir
If set to non-empty and m_port_dir too, the program will try to connect to a Hokuyo using Ethernet co...
Definition: CHokuyoURG.h:260



Page generated by Doxygen 1.8.14 for MRPT 1.5.7 Git: 5902e14cc Wed Apr 24 15:04:01 2019 +0200 at lun oct 28 01:39:17 CET 2019