Main MRPT website > C++ reference for MRPT 1.5.6
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
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...
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
GLsizei const GLcharARB ** string
Definition: glew.h:3293
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.6 for MRPT 1.5.6 Git: 4c65e84 Tue Apr 24 08:18:17 2018 +0200 at mar abr 24 08:26:17 CEST 2018