urg_sim.h
Go to the documentation of this file.
1 /*
2  * Copyright 2024 The urg_stamped Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef URG_SIM_URG_SIM_H
18 #define URG_SIM_URG_SIM_H
19 
20 #include <atomic>
21 #include <cstdint>
22 #include <functional>
23 #include <list>
24 #include <map>
25 #include <memory>
26 #include <mutex>
27 #include <random>
28 #include <string>
29 #include <utility>
30 #include <vector>
31 
32 #include <boost/asio/deadline_timer.hpp>
33 #include <boost/asio/io_service.hpp>
34 #include <boost/asio/ip/tcp.hpp>
35 #include <boost/asio/streambuf.hpp>
36 
37 namespace urg_sim
38 {
39 
41 {
42  uint32_t timestamp;
43  boost::posix_time::ptime full_time;
44  std::vector<uint32_t> ranges;
45  std::vector<uint32_t> intensities;
46 
47  using Ptr = std::shared_ptr<RawScanData>;
48 };
49 
50 using RawScanDataCallback = std::function<void(const RawScanData::Ptr)>;
51 
52 namespace
53 {
54 void nopRawScanDataCallback(const RawScanData::Ptr)
55 {
56 }
57 } // namespace
58 
60 {
61 public:
62  enum class Model
63  {
64  UTM,
65  UST_UUST1,
66  UST_UUST2,
67  };
68  struct Params
69  {
71  double boot_duration;
74  double scan_interval;
75  double clock_rate;
78  int angle_min;
79  int angle_max;
81  };
82  enum class SensorState
83  {
84  BOOTING,
85  IDLE,
87  MULTI_SCAN,
90  };
91  enum class MeasurementMode
92  {
93  RANGE,
95  };
96 
97  inline URGSimulator(
98  const boost::asio::ip::tcp::endpoint& endpoint,
100  const RawScanDataCallback raw_scan_data_cb = nopRawScanDataCallback)
101  : params_(params)
102  , acceptor_(io_service_, endpoint)
106  , raw_scan_data_cb_(raw_scan_data_cb)
107  , rand_engine_(std::random_device()())
108  , comm_delay_distribution_(0, params.comm_delay_sigma)
109  , killed_(false)
110  , handlers_(
111  {
112  {"II", std::bind(&URGSimulator::handleII, this, std::placeholders::_1)},
113  {"VV", std::bind(&URGSimulator::handleVV, this, std::placeholders::_1)},
114  {"PP", std::bind(&URGSimulator::handlePP, this, std::placeholders::_1)},
115  {"TM", std::bind(&URGSimulator::handleTM, this, std::placeholders::_1)},
116  {"BM", std::bind(&URGSimulator::handleBM, this, std::placeholders::_1)},
117  {"QT", std::bind(&URGSimulator::handleQT, this, std::placeholders::_1)},
118  {"RS", std::bind(&URGSimulator::handleRS, this, std::placeholders::_1)},
119  {"RT", std::bind(&URGSimulator::handleRS, this, std::placeholders::_1)},
120  {"RB", std::bind(&URGSimulator::handleRB, this, std::placeholders::_1)},
121  {"MD", std::bind(&URGSimulator::handleMX, this, std::placeholders::_1)},
122  {"ME", std::bind(&URGSimulator::handleMX, this, std::placeholders::_1)},
123  }) // NOLINT(whitespace/braces)
125  , boot_cnt_(0)
126  {
127  switch (params_.model)
128  {
129  case Model::UTM:
130  model_name_ = "UTM-30LX-EW";
131  firm_version_ = "1.1.0 (2011-09-30)";
132  break;
133  case Model::UST_UUST1:
134  model_name_ = "UST-30LC";
135  firm_version_ = "1.1.0 (2011-09-30)";
136  break;
137  case Model::UST_UUST2:
138  model_name_ = "UST-30LC";
139  firm_version_ = "4.0.2-A";
140  break;
141  }
142  }
143 
144  inline boost::asio::ip::tcp::endpoint getLocalEndpoint() const
145  {
146  return acceptor_.local_endpoint();
147  }
148 
149  void spin();
150  void kill();
151  void setState(const SensorState s);
152  int getBootCnt();
153 
154 private:
155  using KeyValue = std::pair<std::string, std::string>;
156  using KeyValues = std::vector<KeyValue>;
157 
159  std::string model_name_;
160  std::string firm_version_;
161 
162  boost::asio::io_service io_service_;
163  boost::asio::io_service input_fifo_;
164  boost::asio::io_service output_fifo_;
165  boost::asio::ip::tcp::acceptor acceptor_;
166  boost::asio::ip::tcp::socket socket_;
167  boost::asio::streambuf input_buf_;
168  boost::asio::deadline_timer boot_timer_;
169  boost::asio::deadline_timer scan_timer_;
170  std::mutex mu_; // Mutex for sensor_state_ and boot_cnt_ for access from CI thread
171 
173 
174  std::default_random_engine rand_engine_;
175  std::normal_distribution<double> comm_delay_distribution_;
176 
177  std::atomic<bool> killed_;
178  boost::posix_time::ptime timestamp_epoch_;
179  std::map<std::string, std::function<void(const std::string)>> handlers_;
181  boost::posix_time::ptime last_rb_;
183  boost::posix_time::ptime next_scan_;
192  std::string measurement_cmd_;
195 
196  void onRead(const boost::system::error_code& ec);
197  void processInput(
198  const std::string cmd,
199  const boost::posix_time::ptime& when);
200  void asyncRead();
201  void reset();
202  void reboot();
203  void booted();
204  void response(
205  const std::string echo,
206  const std::string status,
207  const std::string data = "");
208  void responseKeyValues(
209  const std::string echo,
210  const std::string status,
211  const KeyValues kv);
212  void send(
213  const std::string data,
214  const boost::posix_time::ptime& when);
215  void accept();
216  void accepted(
217  const boost::system::error_code& ec);
218  void nextScan();
219  void scan();
220  void sendScan();
221  void fifo(boost::asio::io_service& fifo);
222 
223  void handleII(const std::string cmd);
224  void handleVV(const std::string cmd);
225  void handlePP(const std::string cmd);
226  void handleTM(const std::string cmd);
227  void handleBM(const std::string cmd);
228  void handleQT(const std::string cmd);
229  void handleRS(const std::string cmd);
230  void handleRB(const std::string cmd);
231  void handleMX(const std::string cmd);
232  void handleUnknown(const std::string cmd);
233  void handleDisconnect();
234 
235  uint32_t timestamp(
236  const boost::posix_time::ptime& now = boost::posix_time::microsec_clock::universal_time());
237  bool validateExtraString(
238  const std::string& cmd,
239  const size_t expected_size);
240  double randomCommDelay();
241  void waitTick(const uint64_t n);
242 };
243 
244 } // namespace urg_sim
245 
246 #endif // URG_SIM_URG_SIM_H
urg_sim::URGSimulator::accepted
void accepted(const boost::system::error_code &ec)
Definition: urg_sim.cpp:597
urg_sim
Definition: encode.h:24
urg_sim::URGSimulator::Params
Definition: urg_sim.h:68
urg_sim::URGSimulator::socket_
boost::asio::ip::tcp::socket socket_
Definition: urg_sim.h:166
urg_sim::URGSimulator::setState
void setState(const SensorState s)
Definition: urg_sim.cpp:833
urg_sim::URGSimulator::waitTick
void waitTick(const uint64_t n)
Definition: urg_sim.cpp:851
urg_sim::URGSimulator::handleRB
void handleRB(const std::string cmd)
Definition: urg_sim.cpp:377
urg_sim::URGSimulator::randomCommDelay
double randomCommDelay()
Definition: urg_sim.cpp:845
urg_sim::URGSimulator
Definition: urg_sim.h:59
urg_sim::URGSimulator::kill
void kill()
Definition: urg_sim.cpp:825
urg_sim::URGSimulator::handleQT
void handleQT(const std::string cmd)
Definition: urg_sim.cpp:325
urg_sim::URGSimulator::output_fifo_
boost::asio::io_service output_fifo_
Definition: urg_sim.h:164
urg_sim::RawScanData::timestamp
uint32_t timestamp
Definition: urg_sim.h:42
urg_sim::URGSimulator::params_
const URGSimulator::Params params_
Definition: urg_sim.h:158
urg_sim::URGSimulator::measurement_mode_
MeasurementMode measurement_mode_
Definition: urg_sim.h:184
urg_sim::URGSimulator::MeasurementMode::RANGE_INTENSITY
@ RANGE_INTENSITY
urg_sim::URGSimulator::reboot
void reboot()
Definition: urg_sim.cpp:478
urg_sim::URGSimulator::input_buf_
boost::asio::streambuf input_buf_
Definition: urg_sim.h:167
urg_sim::URGSimulator::MeasurementMode::RANGE
@ RANGE
urg_sim::URGSimulator::measurement_end_step_
int measurement_end_step_
Definition: urg_sim.h:186
urg_sim::URGSimulator::SensorState
SensorState
Definition: urg_sim.h:82
urg_sim::URGSimulator::handleUnknown
void handleUnknown(const std::string cmd)
Definition: urg_sim.cpp:456
urg_sim::URGSimulator::last_raw_scan_
RawScanData::Ptr last_raw_scan_
Definition: urg_sim.h:182
urg_sim::URGSimulator::handleBM
void handleBM(const std::string cmd)
Definition: urg_sim.cpp:297
urg_sim::URGSimulator::asyncRead
void asyncRead()
Definition: urg_sim.cpp:54
urg_sim::URGSimulator::Params::clock_rate
double clock_rate
Definition: urg_sim.h:75
urg_sim::URGSimulator::mu_
std::mutex mu_
Definition: urg_sim.h:170
urg_sim::URGSimulator::handleII
void handleII(const std::string cmd)
Definition: urg_sim.cpp:110
urg_sim::URGSimulator::fifo
void fifo(boost::asio::io_service &fifo)
Definition: urg_sim.cpp:797
urg_sim::URGSimulator::Model::UTM
@ UTM
urg_sim::URGSimulator::nextScan
void nextScan()
Definition: urg_sim.cpp:621
urg_sim::URGSimulator::Model::UST_UUST2
@ UST_UUST2
urg_sim::URGSimulator::handleTM
void handleTM(const std::string cmd)
Definition: urg_sim.cpp:230
urg_sim::URGSimulator::validateExtraString
bool validateExtraString(const std::string &cmd, const size_t expected_size)
Definition: urg_sim.cpp:758
urg_sim::URGSimulator::Model::UST_UUST1
@ UST_UUST1
urg_sim::URGSimulator::SensorState::ERROR_DETECTED
@ ERROR_DETECTED
urg_sim::RawScanData::Ptr
std::shared_ptr< RawScanData > Ptr
Definition: urg_sim.h:47
urg_sim::URGSimulator::scan_timer_
boost::asio::deadline_timer scan_timer_
Definition: urg_sim.h:169
urg_sim::URGSimulator::getBootCnt
int getBootCnt()
Definition: urg_sim.cpp:839
urg_sim::URGSimulator::response
void response(const std::string echo, const std::string status, const std::string data="")
Definition: urg_sim.cpp:531
urg_sim::URGSimulator::measurement_skips_
int measurement_skips_
Definition: urg_sim.h:188
urg_sim::URGSimulator::firm_version_
std::string firm_version_
Definition: urg_sim.h:160
urg_sim::URGSimulator::measurement_extra_string_
std::string measurement_extra_string_
Definition: urg_sim.h:193
urg_sim::URGSimulator::io_service_
boost::asio::io_service io_service_
Definition: urg_sim.h:162
urg_sim::URGSimulator::handlePP
void handlePP(const std::string cmd)
Definition: urg_sim.cpp:206
urg_sim::URGSimulator::Params::model
Model model
Definition: urg_sim.h:70
urg_sim::URGSimulator::SensorState::TIME_ADJUSTMENT
@ TIME_ADJUSTMENT
urg_sim::URGSimulator::send
void send(const std::string data, const boost::posix_time::ptime &when)
Definition: urg_sim.cpp:563
urg_sim::URGSimulator::Params::comm_delay_sigma
double comm_delay_sigma
Definition: urg_sim.h:73
urg_sim::RawScanData::intensities
std::vector< uint32_t > intensities
Definition: urg_sim.h:45
urg_sim::URGSimulator::SensorState::SINGLE_SCAN
@ SINGLE_SCAN
urg_sim::URGSimulator::rand_engine_
std::default_random_engine rand_engine_
Definition: urg_sim.h:174
urg_sim::URGSimulator::MeasurementMode
MeasurementMode
Definition: urg_sim.h:91
urg_sim::URGSimulator::model_name_
std::string model_name_
Definition: urg_sim.h:159
urg_sim::URGSimulator::measurement_sent_
int measurement_sent_
Definition: urg_sim.h:191
params
std::vector< urg_sim::URGSimulator::Params > params({ { .model=urg_sim::URGSimulator::Model::UTM,.boot_duration=0.01,.comm_delay_base=0.0002,.comm_delay_sigma=0.0004,.scan_interval=0.02505,.clock_rate=1.0,.hex_ii_timestamp=false,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UTM,.boot_duration=0.01,.comm_delay_base=0.0002,.comm_delay_sigma=0.0004,.scan_interval=0.02505,.clock_rate=1.001,.hex_ii_timestamp=false,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UTM,.boot_duration=0.01,.comm_delay_base=0.0002,.comm_delay_sigma=0.0004,.scan_interval=0.02505,.clock_rate=0.999,.hex_ii_timestamp=false,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UST_UUST1,.boot_duration=0.01,.comm_delay_base=0.0005,.comm_delay_sigma=0.0005,.scan_interval=0.02505,.clock_rate=1.0,.hex_ii_timestamp=true,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UST_UUST1,.boot_duration=0.01,.comm_delay_base=0.0005,.comm_delay_sigma=0.0005,.scan_interval=0.02505,.clock_rate=1.001,.hex_ii_timestamp=true,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UST_UUST1,.boot_duration=0.01,.comm_delay_base=0.0005,.comm_delay_sigma=0.0005,.scan_interval=0.02505,.clock_rate=0.999,.hex_ii_timestamp=true,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UST_UUST2,.boot_duration=0.01,.comm_delay_base=0.0002,.comm_delay_sigma=0.0002,.scan_interval=0.02505,.clock_rate=1.0,.hex_ii_timestamp=true,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UST_UUST2,.boot_duration=0.01,.comm_delay_base=0.0002,.comm_delay_sigma=0.0002,.scan_interval=0.02505,.clock_rate=1.001,.hex_ii_timestamp=true,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, { .model=urg_sim::URGSimulator::Model::UST_UUST2,.boot_duration=0.01,.comm_delay_base=0.0002,.comm_delay_sigma=0.0002,.scan_interval=0.02505,.clock_rate=0.999,.hex_ii_timestamp=true,.angle_resolution=1440,.angle_min=0,.angle_max=1080,.angle_front=540, }, })
urg_sim::URGSimulator::accept
void accept()
Definition: urg_sim.cpp:586
urg_sim::URGSimulator::measurement_cnt_
int measurement_cnt_
Definition: urg_sim.h:190
urg_sim::URGSimulator::handleRS
void handleRS(const std::string cmd)
Definition: urg_sim.cpp:354
urg_sim::URGSimulator::raw_scan_data_cb_
RawScanDataCallback raw_scan_data_cb_
Definition: urg_sim.h:172
urg_sim::URGSimulator::measurement_scans_
int measurement_scans_
Definition: urg_sim.h:189
urg_sim::URGSimulator::booted
void booted()
Definition: urg_sim.cpp:508
urg_sim::URGSimulator::Params::scan_interval
double scan_interval
Definition: urg_sim.h:74
urg_sim::URGSimulator::getLocalEndpoint
boost::asio::ip::tcp::endpoint getLocalEndpoint() const
Definition: urg_sim.h:144
urg_sim::URGSimulator::SensorState::MULTI_SCAN
@ MULTI_SCAN
urg_sim::URGSimulator::killed_
std::atomic< bool > killed_
Definition: urg_sim.h:177
urg_sim::URGSimulator::Params::angle_resolution
int angle_resolution
Definition: urg_sim.h:77
urg_sim::URGSimulator::Model
Model
Definition: urg_sim.h:62
urg_sim::URGSimulator::Params::angle_max
int angle_max
Definition: urg_sim.h:79
urg_sim::URGSimulator::spin
void spin()
Definition: urg_sim.cpp:779
urg_sim::URGSimulator::boot_timer_
boost::asio::deadline_timer boot_timer_
Definition: urg_sim.h:168
urg_sim::URGSimulator::Params::comm_delay_base
double comm_delay_base
Definition: urg_sim.h:72
urg_sim::URGSimulator::processInput
void processInput(const std::string cmd, const boost::posix_time::ptime &when)
Definition: urg_sim.cpp:85
urg_sim::URGSimulator::URGSimulator
URGSimulator(const boost::asio::ip::tcp::endpoint &endpoint, const URGSimulator::Params &params, const RawScanDataCallback raw_scan_data_cb=nopRawScanDataCallback)
Definition: urg_sim.h:97
urg_sim::URGSimulator::responseKeyValues
void responseKeyValues(const std::string echo, const std::string status, const KeyValues kv)
Definition: urg_sim.cpp:549
urg_sim::URGSimulator::timestamp
uint32_t timestamp(const boost::posix_time::ptime &now=boost::posix_time::microsec_clock::universal_time())
Definition: urg_sim.cpp:580
urg_sim::RawScanData::full_time
boost::posix_time::ptime full_time
Definition: urg_sim.h:43
urg_sim::URGSimulator::last_rb_
boost::posix_time::ptime last_rb_
Definition: urg_sim.h:181
std
urg_sim::URGSimulator::handleVV
void handleVV(const std::string cmd)
Definition: urg_sim.cpp:189
urg_sim::RawScanDataCallback
std::function< void(const RawScanData::Ptr)> RawScanDataCallback
Definition: urg_sim.h:50
urg_sim::URGSimulator::timestamp_epoch_
boost::posix_time::ptime timestamp_epoch_
Definition: urg_sim.h:178
urg_sim::URGSimulator::measurement_grouping_step_
int measurement_grouping_step_
Definition: urg_sim.h:187
urg_sim::URGSimulator::SensorState::BOOTING
@ BOOTING
urg_sim::URGSimulator::boot_cnt_
int boot_cnt_
Definition: urg_sim.h:194
urg_sim::URGSimulator::SensorState::IDLE
@ IDLE
urg_sim::URGSimulator::handlers_
std::map< std::string, std::function< void(const std::string)> > handlers_
Definition: urg_sim.h:179
urg_sim::URGSimulator::Params::boot_duration
double boot_duration
Definition: urg_sim.h:71
urg_sim::URGSimulator::Params::hex_ii_timestamp
bool hex_ii_timestamp
Definition: urg_sim.h:76
urg_sim::RawScanData
Definition: urg_sim.h:40
urg_sim::URGSimulator::input_fifo_
boost::asio::io_service input_fifo_
Definition: urg_sim.h:163
urg_sim::URGSimulator::sendScan
void sendScan()
Definition: urg_sim.cpp:702
urg_sim::URGSimulator::handleMX
void handleMX(const std::string cmd)
Definition: urg_sim.cpp:401
urg_sim::URGSimulator::measurement_start_step_
int measurement_start_step_
Definition: urg_sim.h:185
urg_sim::URGSimulator::reset
void reset()
urg_sim::URGSimulator::scan
void scan()
Definition: urg_sim.cpp:633
urg_sim::URGSimulator::KeyValue
std::pair< std::string, std::string > KeyValue
Definition: urg_sim.h:155
urg_sim::URGSimulator::measurement_cmd_
std::string measurement_cmd_
Definition: urg_sim.h:192
urg_sim::URGSimulator::handleDisconnect
void handleDisconnect()
Definition: urg_sim.cpp:465
urg_sim::URGSimulator::Params::angle_front
int angle_front
Definition: urg_sim.h:80
urg_sim::URGSimulator::KeyValues
std::vector< KeyValue > KeyValues
Definition: urg_sim.h:156
urg_sim::RawScanData::ranges
std::vector< uint32_t > ranges
Definition: urg_sim.h:44
urg_sim::URGSimulator::next_scan_
boost::posix_time::ptime next_scan_
Definition: urg_sim.h:183
urg_sim::URGSimulator::sensor_state_
SensorState sensor_state_
Definition: urg_sim.h:180
urg_sim::URGSimulator::comm_delay_distribution_
std::normal_distribution< double > comm_delay_distribution_
Definition: urg_sim.h:175
urg_sim::URGSimulator::onRead
void onRead(const boost::system::error_code &ec)
Definition: urg_sim.cpp:62
urg_sim::URGSimulator::acceptor_
boost::asio::ip::tcp::acceptor acceptor_
Definition: urg_sim.h:165
urg_sim::URGSimulator::Params::angle_min
int angle_min
Definition: urg_sim.h:78


urg_stamped
Author(s): Atsushi Watanabe
autogenerated on Wed Dec 18 2024 03:10:57