Main MRPT website > C++ reference for MRPT 1.4.0
CSickLaserSerial.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-2016, 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 CSickLaserSerial_H
10#define CSickLaserSerial_H
11
15
16namespace mrpt
17{
18 namespace hwdrivers
19 {
20 /** This "software driver" implements the communication protocol for interfacing a SICK LMS 2XX laser scanners through a standard RS232 serial port (or a USB2SERIAL converter).
21 * The serial port is opened upon the first call to "doProcess" or "initialize", so you must call "loadConfig" before
22 * this, or manually call "setSerialPort". Another alternative is to call the base class method C2DRangeFinderAbstract::bindIO,
23 * but the "setSerialPort" interface is probably much simpler to use.
24 *
25 * For an example of usage see the example in "samples/SICK_laser_serial_test".
26 * See also the example configuration file for rawlog-grabber in "share/mrpt/config_files/rawlog-grabber".
27 *
28 * \code
29 * PARAMETERS IN THE ".INI"-LIKE CONFIGURATION STRINGS:
30 * -------------------------------------------------------
31 * [supplied_section_name]
32 * COM_port_WIN = COM1 // Serial port to connect to
33 * COM_port_LIN = ttyS0
34 *
35 * COM_baudRate = 38400 // Possible values: 9600 (default), 38400, 5000000
36 * mm_mode = 1/0 // 1: millimeter mode, 0:centimeter mode (Default=0)
37 * FOV = 180 // Field of view: 100 or 180 degrees (Default=180)
38 * resolution = 50 // Scanning resolution, in units of 1/100 degree. Valid values: 25,50,100 (Default=50)
39 * //skip_laser_config = true // (Default:false) If true, doesn't send the initialization commands to the laser and go straight to capturing
40 *
41 * pose_x=0.21 // Laser range scaner 3D position in the robot (meters)
42 * pose_y=0
43 * pose_z=0.34
44 * pose_yaw=0 // Angles in degrees
45 * pose_pitch=0
46 * pose_roll=0
47 *
48 * //preview = true // Enable GUI visualization of captured data
49 *
50 * // Optional: Exclusion zones to avoid the robot seeing itself:
51 * //exclusionZone1_x = 0.20 0.30 0.30 0.20
52 * //exclusionZone1_y = 0.20 0.30 0.30 0.20
53 *
54 * // Optional: Exclusion zones to avoid the robot seeing itself:
55 * //exclusionAngles1_ini = 20 // Deg
56 * //exclusionAngles1_end = 25 // Deg
57 * \endcode
58 *
59 * \sa C2DRangeFinderAbstract
60 * \ingroup mrpt_hwdrivers_grp
61 */
63 {
65
66 private:
68 int m_scans_FOV; //!< 100 or 180 deg
69 int m_scans_res; //!< 1/100th of deg: 100, 50 or 25
70
71 /** The sensor 6D pose: */
73
74 static int CRC16_GEN_POL;
75
76
77 bool tryToOpenComms(std::string *err_msg=NULL); //!< Tries to open the com port and setup all the LMS protocol. Returns true if OK or already open.
78 bool waitContinuousSampleFrame( std::vector<float> &ranges, unsigned char &LMS_status, bool &is_mm_mode );
79
80
81 bool LMS_setupSerialComms(); //!< Assures laser is connected and operating at 38400, in its case returns true.
82 bool LMS_setupBaudrate(int baud); //!< Send a command to change the LMS comms baudrate, return true if ACK is OK. baud can be: 9600, 19200, 38400, 500000
83 bool LMS_statusQuery(); //!< Send a status query and wait for the answer. Return true on OK.
84 bool LMS_waitACK(uint16_t timeout_ms); //!< Returns false if timeout
85 bool LMS_waitIncomingFrame(uint16_t timeout); //!< Returns false if timeout
86 bool LMS_sendMeasuringMode_cm_mm(); //!< Returns false on error
89
90 bool SendCommandToSICK(const uint8_t *cmd,const uint16_t cmd_len); //!< Send header+command-data+crc and waits for ACK. Return false on error.
91
92 uint8_t m_received_frame_buffer[2000];
93
94 std::string m_com_port; //!< If set to non-empty, the serial port will be attempted to be opened automatically when this class is first used to request data from the laser.
95 CSerialPort *m_mySerialPort; //!< Will be !=NULL only if I created it, so I must destroy it at the end.
96 int m_com_baudRate; //!< Baudrate: 9600, 38400, 500000
97 unsigned int m_nTries_connect; //!< Default = 1
98 unsigned int m_nTries_current;
99 bool m_skip_laser_config; //!< If true, doesn't send the initialization commands to the laser and go straight to capturing
100
101 protected:
102 /** See the class documentation at the top for expected parameters */
104 const mrpt::utils::CConfigFileBase &configSource,
105 const std::string &iniSection );
106
107 public:
108 /** Constructor */
110
111 /** Destructor */
113
114 /** Changes the serial port to connect to (call prior to 'doProcess'), for example "COM1" or "ttyS0".
115 * This is not needed if the configuration is loaded with "loadConfig".
116 */
117 void setSerialPort(const std::string &port) { m_com_port = port; }
118
119 /** \sa setSerialPort */
120 std::string getSerialPort() const { return m_com_port; }
121
122 /** Changes the serial port baud rate (call prior to 'doProcess'); valid values are 9600,38400 and 500000.
123 * This is not needed if the configuration is loaded with "loadConfig".
124 * \sa getBaudRate */
125 void setBaudRate(int baud) {
126 m_com_baudRate = baud;
127 }
128 /** \sa setBaudRate */
129 int getBaudRate() const { return m_com_baudRate; }
130
131
132 /** Enables/Disables the millimeter mode, with a greater accuracy but a shorter range (default=false)
133 * (call prior to 'doProcess') This is not needed if the configuration is loaded with "loadConfig".
134 */
135 void setMillimeterMode(bool mm_mode=true) { m_mm_mode = mm_mode; }
136
137 /** Set the scanning field of view - possible values are 100 or 180 (default)
138 * (call prior to 'doProcess') This is not needed if the configuration is loaded with "loadConfig".
139 */
140 void setScanFOV(int fov_degrees) { m_scans_FOV = fov_degrees; }
141 int getScanFOV() const { return m_scans_FOV; }
142
143 /** Set the scanning resolution, in units of 1/100 degree - Possible values are 25, 50 and 100, for 0.25, 0.5 (default) and 1 deg.
144 * (call prior to 'doProcess') This is not needed if the configuration is loaded with "loadConfig".
145 */
146 void setScanResolution(int res_1_100th_degree) { m_scans_res=res_1_100th_degree; }
147 int getScanResolution() const { return m_scans_res; }
148
149 /** If performing several tries in ::initialize(), this is the current try loop number. */
150 unsigned int getCurrentConnectTry() const { return m_nTries_current; }
151
152
153 /** Specific laser scanner "software drivers" must process here new data from the I/O stream, and, if a whole scan has arrived, return it.
154 * This method will be typically called in a different thread than other methods, and will be called in a timely fashion.
155 */
157 bool &outThereIsObservation,
159 bool &hardwareError );
160
161
162 /** Set-up communication with the laser.
163 * Called automatically by rawlog-grabber.
164 * If used manually, call after "loadConfig" and before "doProcess".
165 *
166 * In this class this method does nothing, since the communications are setup at the first try from "doProcess" or "doProcessSimple".
167 */
169
170 /** Enables the scanning mode (in this class this has no effect).
171 * \return If everything works "true", or "false" if there is any error.
172 */
173 bool turnOn();
174
175 /** Disables the scanning mode (in this class this has no effect).
176 * \return If everything works "true", or "false" if there is any error.
177 */
178 bool turnOff();
179
180 }; // End of class
181
182 } // End of namespace
183} // End of namespace
184
185#endif
#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 communications serial port built as an implementation of a utils::CStream.
Definition: CSerialPort.h:44
This "software driver" implements the communication protocol for interfacing a SICK LMS 2XX laser sca...
bool m_skip_laser_config
If true, doesn't send the initialization commands to the laser and go straight to capturing.
bool LMS_waitACK(uint16_t timeout_ms)
Returns false if timeout.
unsigned int m_nTries_connect
Default = 1.
std::string m_com_port
If set to non-empty, the serial port will be attempted to be opened automatically when this class is ...
bool LMS_statusQuery()
Send a status query and wait for the answer. Return true on OK.
bool LMS_setupSerialComms()
Assures laser is connected and operating at 38400, in its case returns true.
bool SendCommandToSICK(const uint8_t *cmd, const uint16_t cmd_len)
Send header+command-data+crc and waits for ACK. Return false on error.
void setScanFOV(int fov_degrees)
Set the scanning field of view - possible values are 100 or 180 (default) (call prior to 'doProcess')...
void setBaudRate(int baud)
Changes the serial port baud rate (call prior to 'doProcess'); valid values are 9600,...
bool LMS_sendMeasuringMode_cm_mm()
Returns false on error.
void setScanResolution(int res_1_100th_degree)
Set the scanning resolution, in units of 1/100 degree - Possible values are 25, 50 and 100,...
bool LMS_waitIncomingFrame(uint16_t timeout)
Returns false if timeout.
unsigned int getCurrentConnectTry() const
If performing several tries in initialize(), this is the current try loop number.
void initialize()
Set-up communication with the laser.
mrpt::math::TPose3D m_sensorPose
The sensor 6D pose:
void setSerialPort(const std::string &port)
Changes the serial port to connect to (call prior to 'doProcess'), for example "COM1" or "ttyS0".
void setMillimeterMode(bool mm_mode=true)
Enables/Disables the millimeter mode, with a greater accuracy but a shorter range (default=false) (ca...
bool waitContinuousSampleFrame(std::vector< float > &ranges, unsigned char &LMS_status, bool &is_mm_mode)
bool turnOff()
Disables the scanning mode (in this class this has no effect).
bool LMS_setupBaudrate(int baud)
Send a command to change the LMS comms baudrate, return true if ACK is OK. baud can be: 9600,...
virtual ~CSickLaserSerial()
Destructor
int m_com_baudRate
Baudrate: 9600, 38400, 500000.
void loadConfig_sensorSpecific(const mrpt::utils::CConfigFileBase &configSource, const std::string &iniSection)
See the class documentation at the top for expected parameters.
void doProcessSimple(bool &outThereIsObservation, mrpt::obs::CObservation2DRangeScan &outObservation, bool &hardwareError)
Specific laser scanner "software drivers" must process here new data from the I/O stream,...
bool turnOn()
Enables the scanning mode (in this class this has no effect).
CSerialPort * m_mySerialPort
Will be !=NULL only if I created it, so I must destroy it at the end.
bool tryToOpenComms(std::string *err_msg=NULL)
Tries to open the com port and setup all the LMS protocol. Returns true if OK or already open.
int m_scans_res
1/100th of deg: 100, 50 or 25
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
This class allows loading and storing values and vectors of different types from a configuration text...
#define HWDRIVERS_IMPEXP
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
unsigned int uint16_t
Definition: pstdint.h:170
unsigned char uint8_t
Definition: pstdint.h:143
Lightweight 3D pose (three spatial coordinates, plus three angular coordinates).



Page generated by Doxygen 1.9.5 for MRPT 1.4.0 SVN: at Sun Nov 27 02:47:40 UTC 2022