urg_sim.cpp
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 #include <cstdint>
18 #include <iostream>
19 #include <mutex>
20 #include <sstream>
21 #include <string>
22 #include <thread>
23 #include <utility>
24 #include <vector>
25 
26 #include <boost/asio/error.hpp>
27 #include <boost/asio/ip/tcp.hpp>
28 #include <boost/asio/placeholders.hpp>
29 #include <boost/asio/read_until.hpp>
30 #include <boost/asio/write.hpp>
31 #include <boost/bind/bind.hpp>
32 #include <boost/date_time/posix_time/posix_time.hpp>
33 #include <boost/move/move.hpp>
34 #include <boost/system/error_code.hpp>
35 
36 #include <urg_sim/urg_sim.h>
37 #include <urg_sim/encode.h>
38 
39 namespace urg_sim
40 {
41 
42 namespace
43 {
44 // Common status code across the commands
45 const char* status_ok = "00";
46 const char* status_already = "02";
47 const char* status_error_command_not_defined = "0E";
48 const char* status_error_abnormal = "0L";
49 const char* status_error_denied = "10";
50 const char* status_error_command_short = "0C";
51 const char* status_error_command_long = "0D";
52 } // namespace
53 
55 {
56  boost::asio::async_read_until(
57  socket_, input_buf_, "\n",
58  boost::bind(
60 }
61 
62 void URGSimulator::onRead(const boost::system::error_code& ec)
63 {
64  if (ec)
65  {
66  std::cerr << "Connection closed: " << ec.message() << std::endl;
68  return;
69  }
70  const auto now = boost::posix_time::microsec_clock::universal_time();
71  const auto delay = boost::posix_time::microseconds(
72  static_cast<int64_t>(randomCommDelay() * 1e6));
73  const auto when = now + delay;
74 
75  std::istream stream(&input_buf_);
76  std::string line;
77  while (std::getline(stream, line))
78  {
79  input_fifo_.post(boost::bind(&URGSimulator::processInput, this, line, when));
80  }
81 
82  asyncRead();
83 }
84 
86  const std::string cmd,
87  const boost::posix_time::ptime& when)
88 {
89  // Find handler from command string
90  const std::string op = cmd.substr(0, 2);
91  const auto it_h = handlers_.find(op);
92  const auto h =
93  (it_h != handlers_.end()) ?
94  it_h->second :
95  std::bind(&URGSimulator::handleUnknown, this, std::placeholders::_1);
96 
97  boost::asio::deadline_timer wait(io_service_);
98  wait.expires_at(when);
99  wait.wait();
100 
102  {
103  // UST (UUST) series handle commands on 1ms tick
104  waitTick(1);
105  }
106 
107  h(cmd);
108 }
109 
110 void URGSimulator::handleII(const std::string cmd)
111 {
112  if (!validateExtraString(cmd, 2))
113  {
114  return;
115  }
116  const uint32_t stamp = timestamp();
117  std::string time;
119  {
120  std::stringstream ss;
121  ss << std::setfill('0') << std::setw(6) << std::hex << stamp;
122  time = ss.str();
123  }
124  else
125  {
126  time = encode::encode(
127  std::vector<uint32_t>(1, stamp), encode::EncodeType::CED4);
128  }
129  const int32_t rpm =
130  static_cast<int32_t>(60.0 / params_.scan_interval);
131 
132  std::string mesm;
133  std::string stat;
134  std::string lasr;
135  {
136  std::lock_guard<std::mutex> lock(mu_);
137 
138  switch (params_.model)
139  {
140  case Model::UTM:
141  switch (sensor_state_)
142  {
144  mesm = "001 Booting";
145  break;
147  mesm = "003 Single_scan";
148  break;
150  mesm = "004 Multi_scan";
151  break;
152  default:
153  mesm = "000 Idle";
154  break;
155  }
156  stat = "Stable 000 no error.";
157  break;
158  case Model::UST_UUST1:
159  case Model::UST_UUST2:
160  mesm = "Measuring by Sensitive Mode";
161  stat = "sensor is working normally";
162  break;
163  }
164  switch (sensor_state_)
165  {
168  lasr = "ON";
169  break;
170  default:
171  lasr = "OFF";
172  break;
173  }
174  }
175 
176  const KeyValues kvs =
177  {
178  {"MODL", model_name_},
179  {"LASR", lasr},
180  {"SCSP", std::to_string(rpm)},
181  {"MESM", mesm},
182  {"SBPS", "Ethernet 100 [Mbps]"},
183  {"TIME", time},
184  {"STAT", stat},
185  };
186  responseKeyValues(cmd, status_ok, kvs);
187 } // namespace urg_sim
188 
189 void URGSimulator::handleVV(const std::string cmd)
190 {
191  if (!validateExtraString(cmd, 2))
192  {
193  return;
194  }
195  const KeyValues kvs =
196  {
197  {"VEND", "Hokuyo Automatic Co., Ltd."},
198  {"PROD", model_name_},
199  {"FIRM", firm_version_},
200  {"PROT", "SCIP 2.2"},
201  {"SERI", "H0123456"},
202  };
203  responseKeyValues(cmd, status_ok, kvs);
204 }
205 
206 void URGSimulator::handlePP(const std::string cmd)
207 {
208  if (!validateExtraString(cmd, 2))
209  {
210  return;
211  }
212  const int32_t rpm =
213  static_cast<int32_t>(60.0 / params_.scan_interval);
214 
215  const KeyValues kvs =
216  {
217  {"MODL", model_name_},
218  {"DMIN", "23"},
219  {"DMAX", "60000"},
220  {"PROT", "SCIP 2.2"},
221  {"ARES", std::to_string(params_.angle_resolution)},
222  {"AMIN", std::to_string(params_.angle_min)},
223  {"AMAX", std::to_string(params_.angle_max)},
224  {"AFRT", std::to_string(params_.angle_front)},
225  {"SCAN", std::to_string(rpm)},
226  };
227  responseKeyValues(cmd, status_ok, kvs);
228 }
229 
230 void URGSimulator::handleTM(const std::string cmd)
231 {
232  if (!validateExtraString(cmd, 3))
233  {
234  return;
235  }
236 
237  std::lock_guard<std::mutex> lock(mu_);
238 
240  {
241  response(cmd, status_error_abnormal);
242  return;
243  }
244 
245  switch (cmd[2])
246  {
247  case '0':
248  switch (sensor_state_)
249  {
250  case SensorState::IDLE:
252  response(cmd, status_ok);
254  return;
256  response(cmd, "02");
257  return;
258  default:
259  response(cmd, status_error_denied);
260  return;
261  }
262  break;
263  case '1':
264  // Actual sensors return timestamp even without entering TIME_ADJUSTMENT state.
265  break;
266  case '2':
267  switch (sensor_state_)
268  {
270  response(cmd, status_ok);
272  return;
273  case SensorState::IDLE:
274  response(cmd, "03");
275  return;
276  default:
277  response(cmd, status_error_denied);
278  return;
279  }
280  break;
281  default:
282  response(cmd, "01");
283  return;
284  }
285  const uint32_t stamp = timestamp();
286  const std::string time = encode::encode(
287  std::vector<uint32_t>(1, stamp), encode::EncodeType::CED4);
288 
290  {
291  // UST (UUST) series doesn't send responses immediately but at the next 5ms tick
292  waitTick(5);
293  }
294  response(cmd, status_ok, encode::withChecksum(time) + "\n");
295 }
296 
297 void URGSimulator::handleBM(const std::string cmd)
298 {
299  if (!validateExtraString(cmd, 2))
300  {
301  return;
302  }
303 
304  std::lock_guard<std::mutex> lock(mu_);
305 
306  switch (sensor_state_)
307  {
309  response(cmd, status_error_abnormal);
310  return;
311  case SensorState::IDLE:
313  response(cmd, status_ok);
314  return;
317  response(cmd, status_already);
318  return;
319  default:
320  response(cmd, status_error_denied);
321  return;
322  }
323 }
324 
325 void URGSimulator::handleQT(const std::string cmd)
326 {
327  if (!validateExtraString(cmd, 2))
328  {
329  return;
330  }
331 
332  std::lock_guard<std::mutex> lock(mu_);
333 
334  switch (sensor_state_)
335  {
337  response(cmd, status_error_abnormal);
338  return;
340  response(cmd, status_ok);
341  return;
344  case SensorState::IDLE:
346  response(cmd, status_ok);
347  return;
348  default:
349  response(cmd, status_error_denied);
350  return;
351  }
352 }
353 
354 void URGSimulator::handleRS(const std::string cmd)
355 {
356  if (!validateExtraString(cmd, 2))
357  {
358  return;
359  }
360 
361  std::lock_guard<std::mutex> lock(mu_);
362 
364  {
365  response(cmd, status_error_abnormal);
366  return;
367  }
368  timestamp_epoch_ = boost::posix_time::microsec_clock::universal_time();
370  {
372  }
373 
374  response(cmd, status_ok);
375 }
376 
377 void URGSimulator::handleRB(const std::string cmd)
378 {
379  if (!validateExtraString(cmd, 2))
380  {
381  return;
382  }
383  // Two RB commands within one second triggers sensor reboot
384  const auto now = boost::posix_time::microsec_clock::universal_time();
385  if (last_rb_ == boost::posix_time::not_a_date_time ||
386  now - last_rb_ > boost::posix_time::seconds(1))
387  {
388  response(cmd, "01");
389  last_rb_ = now;
390  return;
391  }
392  response(cmd, status_ok);
393 
394  boot_timer_.expires_from_now(boost::posix_time::seconds(1));
395  boot_timer_.async_wait(
396  boost::bind(
398  this));
399 }
400 
401 void URGSimulator::handleMX(const std::string cmd)
402 {
403  if (!validateExtraString(cmd, 15))
404  {
405  return;
406  }
407 
408  std::lock_guard<std::mutex> lock(mu_);
409 
410  try
411  {
412  measurement_start_step_ = std::stoi(cmd.substr(2, 4));
413  measurement_end_step_ = std::stoi(cmd.substr(6, 4));
414  measurement_grouping_step_ = std::stoi(cmd.substr(10, 2));
415  measurement_skips_ = std::stoi(cmd.substr(12, 1));
416  measurement_scans_ = std::stoi(cmd.substr(13, 2));
417  }
418  catch (const std::invalid_argument& e)
419  {
420  response(cmd, "02");
421  return;
422  }
424  {
425  response(cmd, "05");
426  return;
427  }
430  {
431  response(cmd, "04");
432  return;
433  }
435  {
437  }
438  measurement_cnt_ = 0;
439  measurement_sent_ = 0;
440  measurement_cmd_ = cmd.substr(0, 13);
441  measurement_extra_string_ = cmd.substr(15);
442 
444  switch (cmd[1])
445  {
446  case 'D':
448  break;
449  case 'E':
451  break;
452  }
453  response(cmd, status_ok);
454 }
455 
456 void URGSimulator::handleUnknown(const std::string cmd)
457 {
458  if (cmd == "")
459  {
460  return;
461  }
462  response(cmd, status_error_command_not_defined);
463 }
464 
466 {
467  std::lock_guard<std::mutex> lock(mu_);
468 
471  {
473  }
474  socket_.close();
475  accept();
476 }
477 
479 {
480  std::cerr << "Booting" << std::endl;
481  {
482  std::lock_guard<std::mutex> lock(mu_);
484  }
485 
486  input_fifo_.stop();
487  output_fifo_.stop();
488  boot_timer_.cancel();
489  scan_timer_.cancel();
490 
491  const auto delay = boost::posix_time::microseconds(
492  static_cast<int64_t>(params_.boot_duration * 1e6));
493  boot_timer_.expires_from_now(delay);
494  boot_timer_.async_wait(
495  boost::bind(
497  this));
498  timestamp_epoch_ = boost::posix_time::microsec_clock::universal_time();
499 
500  if (socket_.is_open())
501  {
502  std::cerr << "Closing" << std::endl;
503  socket_.close();
504  }
505  accept();
506 }
507 
509 {
510  std::cerr << "Booted" << std::endl;
511  {
512  std::lock_guard<std::mutex> lock(mu_);
514  boot_cnt_++;
515  }
516 
517  switch (params_.model)
518  {
519  case Model::UST_UUST1:
520  case Model::UST_UUST2:
521  asyncRead();
522  break;
523  default:
524  break;
525  }
526 
527  next_scan_ = boost::posix_time::microsec_clock::universal_time();
528  nextScan();
529 }
530 
532  const std::string echo,
533  const std::string status,
534  const std::string data)
535 {
536  const auto now = boost::posix_time::microsec_clock::universal_time();
537  const auto delay = boost::posix_time::microseconds(
538  static_cast<int64_t>(randomCommDelay() * 1e6));
539  const auto when = now + delay;
540 
541  const std::string text =
542  echo + "\n" +
543  encode::withChecksum(status) + "\n" +
544  data + "\n";
545 
546  output_fifo_.post(boost::bind(&URGSimulator::send, this, text, when));
547 }
548 
550  const std::string echo,
551  const std::string status,
552  const std::vector<std::pair<std::string, std::string>> kvs)
553 {
554  std::stringstream ss;
555  for (const auto& kv : kvs)
556  {
557  const std::string line = kv.first + ":" + kv.second;
558  ss << line << ";" << encode::checksum(line) << "\n";
559  }
560  response(echo, status, ss.str());
561 }
562 
564  const std::string data,
565  const boost::posix_time::ptime& when)
566 {
567  boost::asio::deadline_timer wait(io_service_);
568  wait.expires_at(when);
569  wait.wait();
570 
571  boost::system::error_code ec;
572  boost::asio::write(socket_, boost::asio::buffer(data), ec);
573  if (ec)
574  {
575  std::cerr << "Send failed: " << ec.message() << std::endl;
576  return;
577  }
578 }
579 
580 uint32_t URGSimulator::timestamp(const boost::posix_time::ptime& now)
581 {
582  const uint32_t diff = params_.clock_rate * (now - timestamp_epoch_).total_microseconds() / 1000.0;
583  return diff & 0xFFFFFF;
584 }
585 
587 {
588  std::cerr << "Accepting" << std::endl;
589  acceptor_.async_accept(
590  socket_,
591  boost::bind(
593  this,
595 }
596 
598  const boost::system::error_code& ec)
599 {
600  if (ec)
601  {
602  std::cerr << "Failed to accept: " << ec.message() << std::endl;
603  accept();
604  return;
605  }
606  std::cerr << "Accepted connection from "
607  << socket_.remote_endpoint() << std::endl;
608  socket_.set_option(boost::asio::ip::tcp::no_delay(true));
609 
610  {
611  std::lock_guard<std::mutex> lock(mu_);
612 
613  if (params_.model == Model::UTM ||
615  {
616  asyncRead();
617  }
618  }
619 }
620 
622 {
623  next_scan_ +=
624  boost::posix_time::microseconds(
625  static_cast<int64_t>(params_.scan_interval * 1e6));
626  scan_timer_.expires_at(next_scan_);
627  scan_timer_.async_wait(
628  boost::bind(
630  this));
631 }
632 
634 {
635  {
636  std::lock_guard<std::mutex> lock(mu_);
637 
639  {
640  return;
641  }
642 
643  switch (sensor_state_)
644  {
647  break;
648  default:
649  nextScan();
650  return;
651  }
652  }
653 
654  const int num_points = params_.angle_max - params_.angle_min + 1;
655  RawScanData::Ptr raw_scan(new RawScanData);
656  raw_scan->timestamp = timestamp(next_scan_);
657  raw_scan->full_time = next_scan_;
658  raw_scan->ranges.resize(num_points);
659  raw_scan->intensities.resize(num_points);
660  raw_scan_data_cb_(raw_scan);
661  last_raw_scan_ = raw_scan;
662 
663  const double busy_seconds =
665  static_cast<double>(params_.angle_max) /
666  static_cast<double>(params_.angle_resolution);
667  boost::asio::deadline_timer scan_wait(io_service_);
668  scan_wait.expires_at(
669  next_scan_ +
670  boost::posix_time::microseconds(
671  static_cast<int64_t>(busy_seconds * 1e6)));
672  scan_wait.wait();
673 
674  {
675  std::lock_guard<std::mutex> lock(mu_);
676 
678  {
681  {
682  sendScan();
683  measurement_cnt_ = 0;
685  if (measurement_scans_ != 0 &&
687  {
689  }
690  else if (measurement_scans_ == 0 &&
691  measurement_sent_ >= 100)
692  {
693  measurement_sent_ = 0;
694  }
695  }
696  }
697  }
698 
699  nextScan();
700 }
701 
703 {
704  std::vector<uint32_t> data;
706  {
707  data.push_back(last_raw_scan_->ranges[i]);
709  {
710  data.push_back(last_raw_scan_->intensities[i]);
711  }
712  }
713 
714  std::stringstream ss;
715 
716  const std::string time = encode::encode(
717  std::vector<uint32_t>(1, last_raw_scan_->timestamp),
719  ss << encode::withChecksum(time) + "\n";
720 
721  const std::string encoded = encode::encode(data, encode::EncodeType::CED3);
722  for (size_t i = 0; i < encoded.size(); i += 64)
723  {
724  const std::string line = encoded.substr(i, 64);
725  ss << encode::withChecksum(line) << "\n";
726  }
727 
728  std::stringstream ss_echo;
729  ss_echo << measurement_cmd_;
730  if (measurement_scans_ == 0)
731  {
732  ss_echo << "00";
733  }
734  else
735  {
736  ss_echo
737  << std::setfill('0') << std::setw(2)
739  }
740  ss_echo << measurement_extra_string_;
741 
742  // UST series doesn't send responses immediately but at the next tick
743  switch (params_.model)
744  {
745  case Model::UST_UUST1:
746  waitTick(1); // 1ms tick on UUST1
747  break;
748  case Model::UST_UUST2:
749  waitTick(5); // 5ms tick on UUST2
750  break;
751  default:
752  break;
753  }
754 
755  response(ss_echo.str(), "99", ss.str());
756 }
757 
759  const std::string& cmd,
760  const size_t expected_size)
761 {
762  if (cmd.size() < expected_size)
763  {
764  response(cmd, status_error_command_short);
765  return false;
766  }
767  if (cmd.size() == expected_size)
768  {
769  return true;
770  }
771  if (cmd[expected_size] != ';')
772  {
773  response(cmd, status_error_command_long);
774  return false;
775  }
776  return true;
777 }
778 
780 {
781  reboot();
782 
783  std::thread th_input_queue(
784  std::bind(&URGSimulator::fifo, this, std::ref(input_fifo_)));
785  std::thread th_output_queue(
786  std::bind(&URGSimulator::fifo, this, std::ref(output_fifo_)));
787 
788  while (!killed_)
789  {
790  io_service_.run();
791  }
792 
793  th_input_queue.join();
794  th_output_queue.join();
795 }
796 
797 void URGSimulator::fifo(boost::asio::io_service& fifo)
798 {
799  boost::asio::deadline_timer keepalive_timer(fifo);
800  std::function<void(const boost::system::error_code& ec)> keepalive;
801 
802  keepalive = [&keepalive_timer, &keepalive](const boost::system::error_code& ec)
803  {
804  if (ec == boost::asio::error::operation_aborted)
805  {
806  return;
807  }
808  if (ec)
809  {
810  std::cerr << "fifo keepalive error: " << ec << std::endl;
811  return;
812  }
813  keepalive_timer.expires_from_now(boost::posix_time::hours(1));
814  keepalive_timer.async_wait(keepalive);
815  };
816 
817  while (!killed_)
818  {
819  keepalive(boost::system::error_code());
820  fifo.run();
821  fifo.reset();
822  }
823 }
824 
826 {
827  killed_ = true;
828  io_service_.stop();
829  input_fifo_.stop();
830  output_fifo_.stop();
831 }
832 
834 {
835  std::lock_guard<std::mutex> lock(mu_);
836  sensor_state_ = s;
837 }
838 
840 {
841  std::lock_guard<std::mutex> lock(mu_);
842  return boot_cnt_;
843 }
844 
846 {
847  // Communication delay must not be less than comm_delay_base.
849 }
850 
851 void URGSimulator::waitTick(const uint64_t n)
852 {
853  const auto now = boost::posix_time::microsec_clock::universal_time();
854  const double tick_ms = 1000 * n;
855  const uint64_t next_tick =
856  params_.clock_rate * (now - timestamp_epoch_).total_microseconds() / tick_ms;
857  const auto next_tick_system_microseconds =
858  static_cast<uint64_t>(next_tick * tick_ms / params_.clock_rate);
859  boost::asio::deadline_timer wait(io_service_);
860  wait.expires_at(
861  timestamp_epoch_ + boost::posix_time::microseconds(next_tick_system_microseconds));
862  wait.wait();
863 }
864 
865 } // namespace urg_sim
urg_sim::URGSimulator::accepted
void accepted(const boost::system::error_code &ec)
Definition: urg_sim.cpp:597
urg_sim::encode::encode
std::string encode(const std::vector< uint32_t > &v, const EncodeType ced)
Definition: encode.cpp:43
urg_sim
Definition: encode.h:24
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::kill
void kill()
Definition: urg_sim.cpp:825
urg_sim::URGSimulator::handleQT
void handleQT(const std::string cmd)
Definition: urg_sim.cpp:325
encode.h
urg_sim::URGSimulator::output_fifo_
boost::asio::io_service output_fifo_
Definition: urg_sim.h:164
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
s
XmlRpcServer s
urg_sim::encode::EncodeType::CED3
@ CED3
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::encode::checksum
std::string checksum(const std::string &a)
Definition: encode.cpp:28
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::SensorState::SINGLE_SCAN
@ SINGLE_SCAN
urg_sim::URGSimulator::rand_engine_
std::default_random_engine rand_engine_
Definition: urg_sim.h:174
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
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::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::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::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::URGSimulator::last_rb_
boost::posix_time::ptime last_rb_
Definition: urg_sim.h:181
urg_sim::URGSimulator::handleVV
void handleVV(const std::string cmd)
Definition: urg_sim.cpp:189
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.h
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::encode::EncodeType::CED4
@ CED4
urg_sim::URGSimulator::measurement_start_step_
int measurement_start_step_
Definition: urg_sim.h:185
urg_sim::URGSimulator::scan
void scan()
Definition: urg_sim.cpp:633
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
scip2::logger::error
std::ostream & error()
Definition: logger.cpp:105
urg_sim::URGSimulator::KeyValues
std::vector< KeyValue > KeyValues
Definition: urg_sim.h:156
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::encode::withChecksum
std::string withChecksum(const std::string &s)
Definition: encode.cpp:38
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