subscribers.py
Go to the documentation of this file.
1 from nav_msgs.msg import Odometry
2 from sensor_msgs.msg import Imu, MagneticField, NavSatFix
3 from microstrain_inertial_msgs.msg import GNSSAidingStatus, GNSSFixInfo, GNSSDualAntennaStatus, FilterStatus, RTKStatusV1, RTKStatus, FilterAidingMeasurementSummary
4 
5 from .constants import _DEFAULT_VAL, _DEFAULT_STR
6 from .constants import _UNIT_DEGREES, _UNIT_GS, _UNIT_GUASSIAN, _UNIT_METERS, _UNIT_RADIANS, _UNIT_METERS_PER_SEC, _UNIT_RADIANS_PER_SEC
7 from .constants import _ICON_GREY_UNCHECKED_MEDIUM, _ICON_YELLOW_UNCHECKED_MEDIUM, _ICON_YELLOW_CHECKED_MEDIUM, _ICON_GREEN_UNCHECKED_MEDIUM,_ICON_GREEN_CHECKED_MEDIUM, _ICON_TEAL_UNCHECKED_MEDIUM, _ICON_TEAL_CHECKED_MEDIUM, _ICON_BLUE_UNCHECKED_MEDIUM, _ICON_BLUE_CHECKED_MEDIUM, _ICON_RED_UNCHECKED_MEDIUM, _ICON_RED_CHECKED_MEDIUM
8 from .common import SubscriberMonitor
9 
10 
12 
13  def __init__(self, node, node_name, topic_name):
14  super(GNSSAidingStatusMonitor, self).__init__(node, node_name, topic_name, GNSSAidingStatus)
15 
16  @property
17  def tight_coupling(self):
18  return self._get_val(self._current_message.tight_coupling)
19 
20  @property
22  return self._get_val(self._current_message.differential_corrections)
23 
24  @property
25  def integer_fix(self):
26  return self._get_val(self._current_message.integer_fix)
27 
28  @property
29  def position_fix(self):
30  return self._get_val(self._current_message.has_position_fix)
31 
32  @property
35 
36  @property
39 
40  @property
41  def integer_fix_string(self):
43 
44  @property
47 
48 
50 
51  def __init__(self, node, node_name, topic_name):
52  super(GNSSFixInfoMonitor, self).__init__(node, node_name, topic_name, GNSSFixInfo)
53 
54  @property
55  def fix_type(self):
56  return self._get_val(self._current_message.fix_type)
57 
58  @property
59  def num_sv(self):
60  return self._get_val(self._current_message.num_sv)
61 
62  @property
63  def fix_type_string(self):
64  fix_type = self.fix_type
65  if fix_type is not _DEFAULT_VAL:
66  if fix_type == GNSSFixInfo.FIX_3D:
67  return "3D Fix (%d)" % fix_type
68  elif fix_type == GNSSFixInfo.FIX_2D:
69  return "2D Fix (%d)" % fix_type
70  elif fix_type == GNSSFixInfo.FIX_TIME_ONLY:
71  return "Time Only (%d)" % fix_type
72  elif fix_type == GNSSFixInfo.FIX_NONE:
73  return "None (%d)" % fix_type
74  elif fix_type == GNSSFixInfo.FIX_INVALID:
75  return "Invalid Fix (%d)" % fix_type
76  elif fix_type == GNSSFixInfo.FIX_RTK_FLOAT:
77  return "RTK Float (%d)" % fix_type
78  elif fix_type == GNSSFixInfo.FIX_RTK_FIXED:
79  return "RTK Fixed (%d)" % fix_type
80  else:
81  return "Invalid (%d)" % fix_type
82  else:
83  return _DEFAULT_STR
84 
85  @property
86  def num_sv_string(self):
87  return self._get_string(self.num_sv)
88 
90 
91  def __init__(self, node, node_name, topic_name, device_report_monitor):
92  super(FilterStatusMonitor, self).__init__(node, node_name, topic_name, FilterStatus)
93 
94  # Save a copy of the device report monitor
95  self._device_report_monitor = device_report_monitor
96 
97  @property
98  def filter_state(self):
99  return self._get_val(self._current_message.filter_state)
100 
101  @property
102  def status_flags(self):
103  return self._get_val(self._current_message.status_flags)
104 
105  @property
107  filter_state = self.filter_state
108  if filter_state is not _DEFAULT_VAL:
109  # Different status codes between GQ7 and GX5
110  if self._device_report_monitor.is_gq7:
111  if filter_state == 1:
112  return "GQ7 Init (%d)" % filter_state
113  elif filter_state == 2:
114  return "GQ7 Vertical Gyro (%d)" % filter_state
115  elif filter_state == 3:
116  return "GQ7 AHRS (%d)" % filter_state
117  elif filter_state == 4:
118  return "GQ7 Full Nav (%d)" % filter_state
119  else:
120  return "GQ7 Invalid (%d)" % filter_state
121  elif self._device_report_monitor.is_gx5:
122  if filter_state == 0:
123  return "GX5 Startup (%d)" % filter_state
124  elif filter_state == 1:
125  return "GX5 Initialization (%d)" % filter_state
126  elif filter_state == 2:
127  return "GX5 Running, Solution Valid (%d)" % filter_state
128  elif filter_state == 3:
129  return "GX5 Running, Solution Error (%d)" % filter_state
130  else:
131  return "Unknown Device (%d)" % filter_state
132  else:
133  return _DEFAULT_STR
134 
135  @property
137  filter_state_string = self.filter_state_string
138  if filter_state_string is not _DEFAULT_STR:
139  # Trim some characters off of the string
140  return filter_state_string[4:-4]
141  else:
142  return filter_state_string
143 
144  @property
146  status_flags = self.status_flags
147  if status_flags is not _DEFAULT_VAL:
148  status_str = ""
149  if self._device_report_monitor.is_gq7:
150  # Filter condition
151  if status_flags & 0b11 == 1:
152  status_str += "Stable,"
153  elif status_flags & 0b11 == 2:
154  status_str += "Converging,"
155  elif status_flags & 0b11 == 3:
156  status_str += "Unstable/Recovering,"
157 
158  # Estimate Warnings
159  if status_flags & 0b100 != 0:
160  status_str += "Roll/Pitch Warning,"
161  if status_flags & 0b1000 != 0:
162  status_str += "Heading Warning,"
163  if status_flags & 0b10000 != 0:
164  status_str += "Position Warning,"
165  if status_flags & 0b100000 != 0:
166  status_str += "Velocity Warning,"
167  if status_flags & 0b1000000 != 0:
168  status_str += "IMU Bias Warning,"
169  if status_flags & 0b10000000 != 0:
170  status_str += "GNSS Clock Warning,"
171  if status_flags & 0b100000000 != 0:
172  status_str += "Antenna Lever Arm Warning,"
173  if status_flags & 0b1000000000 != 0:
174  status_str += "Mounting Transform Warning,"
175 
176  # Solution Error
177  if status_flags & 0b1111000000000000 != 0:
178  status_str += "Solution Error,"
179  elif self._device_report_monitor.is_gx5:
180  # GX5 needs the filter state to make sense of the status flags
181  filter_state = self.filter_state
182  if filter_state is not _DEFAULT_VAL:
183  # Initialization flags
184  if filter_state == 1:
185  if status_flags & 0b1000000000000 != 0:
186  status_str += "Attutude not initialized,"
187  if status_flags & 0b10000000000000 != 0:
188  status_str += "Position & Velocity not initialized,"
189 
190  # Running with error flags
191  elif filter_state in (2, 3):
192  if status_flags & 0b1 != 0:
193  status_str += "IMU unavailable,"
194  if status_flags & 0b10 != 0:
195  status_str += "GNSS,"
196  if status_flags & 0b1000 != 0:
197  status_str += "Matrix Singularity in calculation,"
198  if status_flags & 0b10000 != 0:
199  status_str += "Position covariance high warning,"
200  if status_flags & 0b100000 != 0:
201  status_str += "Velocity covariance high warning,"
202  if status_flags & 0b1000000 != 0:
203  status_str += "Attitude covariance high warning,"
204  if status_flags & 0b10000000 != 0:
205  status_str += "NAN in solution,"
206  if status_flags & 0b100000000 != 0:
207  status_str += "Gyro bias estimate high warning,"
208  if status_flags & 0b1000000000 != 0:
209  status_str += "Accel bias estimate high warning,"
210  if status_flags & 0b10000000000 != 0:
211  status_str += "Gyro scale factor estimate high warning,"
212  if status_flags & 0b100000000000 != 0:
213  status_str += "Accel scale factor estimate high warning,"
214  if status_flags & 0b1000000000000 != 0:
215  status_str += "Mag bias estimate high warning,"
216  if status_flags & 0b10000000000000 != 0:
217  status_str += "GNSS antenna offset correction estimate high warning,"
218  if status_flags & 0b100000000000000 != 0:
219  status_str += "Hard Iron offset estimate high warning,"
220  if status_flags & 0b1000000000000000 != 0:
221  status_str += "Soft iron correction estimate high warning,"
222  if not status_str:
223  status_str = "None,"
224 
225  # No flags if any other case
226  else:
227  status_str = "None,"
228  else:
229  status_str = "Unknown Filter State,"
230  else:
231  status_str = "Uknown Device,"
232 
233  # Trim the last comma and return
234  if status_str:
235  return "%s (%d)" % (status_str[:-1], status_flags)
236  else:
237  return "Unknown Status Flags (%d)" % status_flags
238  else:
239  return _DEFAULT_STR
240 
241 
243 
244  _MIN_COVARIANCE_SIZE = 36
245 
246  def __init__(self, node, node_name, topic_name, llh=True):
247  super(OdomMonitor, self).__init__(node, node_name, topic_name, Odometry, callback=self._callback)
248 
249  # Use different units if we are using LLH versus ECEF
250  if llh:
251  self._xy_units = _UNIT_DEGREES
252  else:
253  self._xy_units = _UNIT_METERS
254 
255  # Initialize some member variables
256  self._current_roll = _DEFAULT_VAL
257  self._current_pitch = _DEFAULT_VAL
258  self._current_yaw = _DEFAULT_VAL
259 
260  def _callback(self, status_message):
261  quaternion = [self._current_message.pose.pose.orientation.x, self._current_message.pose.pose.orientation.y, self._current_message.pose.pose.orientation.z, self._current_message.pose.pose.orientation.w]
262  self._current_roll, self._current_pitch, self._current_yaw = self._euler_from_quaternion(quaternion)
263  super(OdomMonitor, self)._default_callback(status_message)
264 
265  @property
266  def position_x(self):
267  return self._get_val(self._current_message.pose.pose.position.x)
268 
269  @property
270  def position_y(self):
271  return self._get_val(self._current_message.pose.pose.position.y)
272 
273  @property
274  def position_z(self):
275  return self._get_val(self._current_message.pose.pose.position.z)
276 
277  @property
279  if len(self._current_message.pose.covariance) >= self._MIN_COVARIANCE_SIZE:
280  return self._get_val(self._current_message.pose.covariance[0])
281  else:
282  return _DEFAULT_VAL
283 
284  @property
286  if len(self._current_message.pose.covariance) >= self._MIN_COVARIANCE_SIZE:
287  return self._get_val(self._current_message.pose.covariance[7])
288  else:
289  return _DEFAULT_VAL
290 
291  @property
293  if len(self._current_message.pose.covariance) >= self._MIN_COVARIANCE_SIZE:
294  return self._get_val(self._current_message.pose.covariance[14])
295  else:
296  return _DEFAULT_VAL
297 
298  @property
299  def orientation_x(self):
300  return self._get_val(self._current_roll)
301 
302  @property
303  def orientation_y(self):
304  return self._get_val(self._current_pitch)
305 
306  @property
307  def orientation_z(self):
308  return self._get_val(self._current_yaw)
309 
310  @property
312  if len(self._current_message.pose.covariance) >= self._MIN_COVARIANCE_SIZE:
313  return self._get_val(self._current_message.pose.covariance[21])
314  else:
315  return _DEFAULT_VAL
316 
317  @property
319  if len(self._current_message.pose.covariance) >= self._MIN_COVARIANCE_SIZE:
320  return self._get_val(self._current_message.pose.covariance[28])
321  else:
322  return _DEFAULT_VAL
323 
324  @property
326  if len(self._current_message.pose.covariance) >= self._MIN_COVARIANCE_SIZE:
327  return self._get_val(self._current_message.pose.covariance[35])
328  else:
329  return _DEFAULT_VAL
330 
331  @property
332  def velocity_x(self):
333  return self._get_val(self._current_message.twist.twist.linear.x)
334 
335  @property
336  def velocity_y(self):
337  return self._get_val(self._current_message.twist.twist.linear.y)
338 
339  @property
340  def velocity_z(self):
341  return self._get_val(self._current_message.twist.twist.linear.z)
342 
343  @property
345  if len(self._current_message.twist.covariance) >= self._MIN_COVARIANCE_SIZE:
346  return self._get_val(self._current_message.twist.covariance[0])
347  else:
348  return _DEFAULT_VAL
349 
350  @property
352  if len(self._current_message.twist.covariance) >= self._MIN_COVARIANCE_SIZE:
353  return self._get_val(self._current_message.twist.covariance[7])
354  else:
355  return _DEFAULT_VAL
356 
357  @property
359  if len(self._current_message.twist.covariance) >= self._MIN_COVARIANCE_SIZE:
360  return self._get_val(self._current_message.twist.covariance[14])
361  else:
362  return _DEFAULT_VAL
363 
364  @property
365  def position_x_string(self):
366  return self._get_string_units(self.position_x, self._xy_units)
367 
368  @property
369  def position_y_string(self):
370  return self._get_string_units(self.position_y, self._xy_units)
371 
372  @property
373  def position_z_string(self):
374  return self._get_string_units(self.position_x, _UNIT_METERS)
375 
376  @property
378  return self._get_string_units(self.position_uncertainty_x, _UNIT_METERS)
379 
380  @property
382  return self._get_string_units(self.position_uncertainty_y, _UNIT_METERS)
383 
384  @property
386  return self._get_string_units(self.position_uncertainty_z, _UNIT_METERS)
387 
388  @property
390  return self._get_string_units(self.orientation_x, _UNIT_RADIANS)
391 
392  @property
394  return self._get_string_units(self.orientation_y, _UNIT_RADIANS)
395 
396  @property
398  return self._get_string_units(self.orientation_z, _UNIT_RADIANS)
399 
400  @property
402  return self._get_string_units(self.orientation_uncertainty_x, _UNIT_RADIANS)
403 
404  @property
406  return self._get_string_units(self.orientation_uncertainty_y, _UNIT_RADIANS)
407 
408  @property
410  return self._get_string_units(self.orientation_uncertainty_z, _UNIT_RADIANS)
411 
412  @property
413  def velocity_x_string(self):
414  return self._get_string_units(self.velocity_x, _UNIT_METERS_PER_SEC)
415 
416  @property
417  def velocity_y_string(self):
418  return self._get_string_units(self.velocity_y, _UNIT_METERS_PER_SEC)
419 
420  @property
421  def velocity_z_string(self):
422  return self._get_string_units(self.velocity_z, _UNIT_METERS_PER_SEC)
423 
424  @property
426  return self._get_string_units(self.velocity_uncertainty_x, _UNIT_METERS_PER_SEC)
427 
428  @property
430  return self._get_string_units(self.velocity_uncertainty_y, _UNIT_METERS_PER_SEC)
431 
432  @property
434  return self._get_string_units(self.velocity_uncertainty_z, _UNIT_METERS_PER_SEC)
435 
436 
438 
439  def __init__(self, node, node_name, topic_name):
440  super(GNSSDualAntennaStatusMonitor, self).__init__(node, node_name, topic_name, GNSSDualAntennaStatus)
441 
442  @property
443  def fix_type(self):
444  return self._get_val(self._current_message.fix_type)
445 
446  @property
447  def heading(self):
448  return self._get_val(self._current_message.heading)
449 
450  @property
452  return self._get_val(self._current_message.heading_uncertainty)
453 
454  @property
455  def rec_1_data_valid(self):
456  return bool(self._get_val(self._current_message.rcv_1_valid))
457 
458  @property
459  def rec_2_data_valid(self):
460  return bool(self._get_val(self._current_message.rcv_2_valid))
461 
462  @property
464  return bool(self._get_val(self._current_message.antenna_offsets_valid))
465 
466  @property
467  def fix_type_string(self):
468  fix_type = self.fix_type
469  if fix_type is not _DEFAULT_VAL:
470  if fix_type == 0:
471  return "None (%d)" % fix_type
472  elif fix_type == 1:
473  return "Float (%d)" % fix_type
474  elif fix_type == 2:
475  return "Fixed (%d)" % fix_type
476  else:
477  return _DEFAULT_STR
478  else:
479  return _DEFAULT_STR
480 
481  @property
482  def heading_string(self):
483  return self._get_string_units(self.heading, _UNIT_RADIANS)
484 
485  @property
487  return self._get_string_units(self.heading_uncertainty, _UNIT_RADIANS)
488 
489  @property
492 
493  @property
496 
497  @property
500 
501 
503 
504  def __init__(self, node, node_name, topic_name):
505  super(ImuMonitor, self).__init__(node, node_name, topic_name, Imu)
506 
507  @property
508  def accel_x(self):
509  return self._get_val(self._current_message.linear_acceleration.x)
510 
511  @property
512  def accel_y(self):
513  return self._get_val(self._current_message.linear_acceleration.y)
514 
515  @property
516  def accel_z(self):
517  return self._get_val(self._current_message.linear_acceleration.z)
518 
519  @property
520  def vel_x(self):
521  return self._get_val(self._current_message.angular_velocity.x)
522 
523  @property
524  def vel_y(self):
525  return self._get_val(self._current_message.angular_velocity.y)
526 
527  @property
528  def vel_z(self):
529  return self._get_val(self._current_message.angular_velocity.z)
530 
531  @property
532  def accel_x_string(self):
533  return self._get_string_units(self.accel_x, _UNIT_GS)
534 
535  @property
536  def accel_y_string(self):
537  return self._get_string_units(self.accel_y, _UNIT_GS)
538 
539  @property
540  def accel_z_string(self):
541  return self._get_string_units(self.accel_z, _UNIT_GS)
542 
543  @property
544  def vel_x_string(self):
545  return self._get_string_units(self.vel_x, _UNIT_RADIANS_PER_SEC)
546 
547  @property
548  def vel_y_string(self):
549  return self._get_string_units(self.vel_y, _UNIT_RADIANS_PER_SEC)
550 
551  @property
552  def vel_z_string(self):
553  return self._get_string_units(self.vel_z, _UNIT_RADIANS_PER_SEC)
554 
555 
557 
558  def __init__(self, node, node_name, topic_name):
559  super(MagMonitor, self).__init__(node, node_name, topic_name, MagneticField)
560 
561  @property
562  def x(self):
563  return self._get_val(self._current_message.magnetic_field.x)
564 
565  @property
566  def y(self):
567  return self._get_val(self._current_message.magnetic_field.y)
568 
569  @property
570  def z(self):
571  return self._get_val(self._current_message.magnetic_field.z)
572 
573  @property
574  def x_string(self):
575  return self._get_string_units(self.x, _UNIT_GUASSIAN)
576 
577  @property
578  def y_string(self):
579  return self._get_string_units(self.y, _UNIT_GUASSIAN)
580 
581  @property
582  def z_string(self):
583  return self._get_string_units(self.z, _UNIT_GUASSIAN)
584 
585 
587 
588  _MIN_COVARIANCE_SIZE = 9
589 
590  def __init__(self, node, node_name, topic_name):
591  super(NavSatFixMonitor, self).__init__(node, node_name, topic_name, NavSatFix)
592 
593  @property
595  if len(self._current_message.position_covariance) >= self._MIN_COVARIANCE_SIZE:
596  return self._get_val(self._current_message.position_covariance[0])
597  else:
598  return _DEFAULT_VAL
599 
600  @property
602  return self._get_string_units(self.position_uncertainty, _UNIT_METERS)
603 
604 
606 
607  def __init__(self, node, node_name, topic_name, message_type):
608  super(RTKMonitorBase, self).__init__(node, node_name, topic_name, message_type)
609 
610  @property
611  def gps_received(self):
612  epoch_status = self._current_message.epoch_status
613  if epoch_status is not _DEFAULT_VAL:
614  return epoch_status & 0b100 != 0
615  else:
616  return _DEFAULT_VAL
617 
618  @property
619  def glonass_received(self):
620  epoch_status = self._current_message.epoch_status
621  if epoch_status is not _DEFAULT_VAL:
622  return epoch_status & 0b1000 != 0
623  else:
624  return _DEFAULT_VAL
625 
626  @property
627  def galileo_received(self):
628  epoch_status = self._current_message.epoch_status
629  if epoch_status is not _DEFAULT_VAL:
630  return epoch_status & 0b10000 != 0
631  else:
632  return _DEFAULT_VAL
633 
634  @property
635  def beidou_received(self):
636  epoch_status = self._current_message.epoch_status
637  if epoch_status is not _DEFAULT_VAL:
638  return epoch_status & 0b100000 != 0
639  else:
640  return _DEFAULT_VAL
641 
642  @property
643  def version(self):
644  return self._get_val(self._current_message.dongle_version)
645 
646  @property
647  def raw_status_flags(self):
648  return self._get_val(self._current_message.raw_status_flags)
649 
650  @property
651  def signal_quality(self):
652  return self._get_val(self._current_message.dongle_signal_quality)
653 
654  @property
657 
658  @property
661 
662  @property
665 
666  @property
669 
670  @property
671  def version_string(self):
672  return self._get_string(self.version)
673 
674  @property
676  return self._get_string_hex(self.raw_status_flags)
677 
678  @property
680  return self._get_string(self.signal_quality)
681 
682  @property
683  def rtk_led_string(self):
684  pass
685 
686 
687 class RTKMonitor(RTKMonitorBase):
688 
689  def __init__(self, node, node_name, topic_name):
690  super(RTKMonitor, self).__init__(node, node_name, topic_name, RTKStatus)
691 
692  @property
693  def modem_state(self):
694  return self._get_val(self._current_message.dongle_modem_state)
695 
696  @property
697  def connection_type(self):
698  return self._get_val(self._current_message.dongle_connection_type)
699 
700  @property
701  def rssi(self):
702  rssi = self._current_message.dongle_rssi
703  if rssi is not _DEFAULT_VAL:
704  return -rssi
705  else:
706  return _DEFAULT_VAL
707 
708  @property
710  tower_change_indicator = self._current_message.dongle_tower_change_indicator
711  if tower_change_indicator is not _DEFAULT_VAL:
712  return tower_change_indicator
713  else:
714  return _DEFAULT_VAL
715 
716  @property
717  def nmea_timeout(self):
718  nmea_timeout = self._current_message.dongle_nmea_timeout
719  if nmea_timeout is not _DEFAULT_VAL:
720  return nmea_timeout
721  else:
722  return _DEFAULT_VAL
723 
724  @property
725  def server_timeout(self):
726  server_timeout = self._current_message.dongle_server_timeout
727  if server_timeout is not _DEFAULT_VAL:
728  return server_timeout
729  else:
730  return _DEFAULT_VAL
731 
732  @property
733  def rtcm_timeout(self):
734  rtcm_timeout = self._current_message.dongle_rtcm_timeout
735  if rtcm_timeout is not _DEFAULT_VAL:
736  return rtcm_timeout
737  else:
738  return _DEFAULT_VAL
739 
740  @property
741  def out_of_range(self):
742  out_of_range = self._current_message.dongle_out_of_range
743  if out_of_range is not _DEFAULT_VAL:
744  return out_of_range
745  else:
746  return _DEFAULT_VAL
747 
748  @property
750  corrections_unavailable = self._current_message.dongle_corrections_unavailable
751  if corrections_unavailable is not _DEFAULT_VAL:
752  return corrections_unavailable
753  else:
754  return _DEFAULT_VAL
755 
756  @property
758  modem_state = self.modem_state
759  if modem_state is not _DEFAULT_VAL:
760  if modem_state == self._current_message.MODEM_STATE_OFF:
761  return "Off (%d)" % modem_state
762  elif modem_state == self._current_message.MODEM_STATE_NO_NETWORK:
763  return "No Network (%d)" % modem_state
764  elif modem_state == self._current_message.MODEM_STATE_NETWORK_CONNECTED:
765  return "Connected (%d)" % modem_state
766  elif modem_state == self._current_message.MODEM_STATE_CONFIGURING_DATA_CONTEXT:
767  return "Configuring Data Context (%d)" % modem_state
768  elif modem_state == self._current_message.MODEM_STATE_ACTIVATING_DATA_CONTEXT:
769  return "Activating Data Context (%d)" % modem_state
770  elif modem_state == self._current_message.MODEM_STATE_CONFIGURING_SOCKET:
771  return "Configuring Socket (%d)" % modem_state
772  elif modem_state == self._current_message.MODEM_STATE_WAITING_ON_SERVER_HANDSHAKE:
773  return "Waiting on Server Handshake (%d)" % modem_state
774  elif modem_state == self._current_message.MODEM_STATE_CONNECTED_AND_IDLE:
775  return "Connected & Idle (%d)" % modem_state
776  elif modem_state == self._current_message.MODEM_STATE_CONNECTED_AND_STREAMING:
777  return "Connected & Streaming (%d)" % modem_state
778  else:
779  return "Invalid (%d)" % modem_state
780  else:
781  return _DEFAULT_STR
782 
783  @property
785  connection_type = self.connection_type
786  if connection_type is not _DEFAULT_VAL:
787  if connection_type == self._current_message.CONNECTION_TYPE_NO_CONNECTION:
788  return "No Connection (%d)" % connection_type
789  elif connection_type == self._current_message.CONNECTION_TYPE_CONNECTION_2G:
790  return "2G (%d)" % connection_type
791  elif connection_type == self._current_message.CONNECTION_TYPE_CONNECTION_3G:
792  return "3G (%d)" % connection_type
793  elif connection_type == self._current_message.CONNECTION_TYPE_CONNECTION_4G:
794  return "4G (%d)" % connection_type
795  elif connection_type == self._current_message.CONNECTION_TYPE_CONNECTION_5G:
796  return "5G (%d)" % connection_type
797  else:
798  return "Invalid (%d)" % connection_type
799  else:
800  return _DEFAULT_STR
801 
802  @property
803  def rssi_string(self):
804  return self._get_string(self.rssi)
805 
806  @property
808  return self._get_string(self.tower_change_indicator)
809 
810  @property
812  return self._get_boolean_string(self.nmea_timeout)
813 
814  @property
816  return self._get_boolean_string(self.server_timeout)
817 
818  @property
820  return self._get_boolean_string(self.rtcm_timeout)
821 
822  @property
824  return self._get_boolean_string(self.out_of_range)
825 
826  @property
829 
830  @property
831  def rtk_led_string(self):
832  modem_state = self.modem_state
833  if modem_state is not _DEFAULT_VAL:
834  if modem_state == self._current_message.MODEM_STATE_NO_NETWORK:
835  return _ICON_YELLOW_UNCHECKED_MEDIUM
836  elif modem_state == self._current_message.MODEM_STATE_NETWORK_CONNECTED:
837  return _ICON_GREEN_CHECKED_MEDIUM
838  elif modem_state == self._current_message.MODEM_STATE_CONFIGURING_DATA_CONTEXT:
839  return _ICON_GREEN_CHECKED_MEDIUM
840  elif modem_state == self._current_message.MODEM_STATE_ACTIVATING_DATA_CONTEXT:
841  return _ICON_GREEN_CHECKED_MEDIUM
842  elif modem_state == self._current_message.MODEM_STATE_CONFIGURING_SOCKET:
843  return _ICON_GREEN_CHECKED_MEDIUM
844  elif modem_state == self._current_message.MODEM_STATE_WAITING_ON_SERVER_HANDSHAKE:
845  return _ICON_GREEN_CHECKED_MEDIUM
846  elif modem_state == self._current_message.MODEM_STATE_CONNECTED_AND_IDLE:
847  return _ICON_BLUE_CHECKED_MEDIUM
848  elif modem_state == self._current_message.MODEM_STATE_CONNECTED_AND_STREAMING:
849  return _ICON_BLUE_CHECKED_MEDIUM
850  else:
851  return _ICON_GREY_UNCHECKED_MEDIUM
852 
853 
855 
856  def __init__(self, node, node_name, topic_name):
857  super(RTKMonitorV1, self).__init__(node, node_name, topic_name, RTKStatusV1)
858 
859  @property
860  def controller_state(self):
861  return self._get_val(self._current_message.dongle_controller_state)
862 
863  @property
864  def controller_status(self):
865  return self._get_val(self._current_message.dongle_controller_status)
866 
867  @property
868  def platform_state(self):
869  return self._get_val(self._current_message.dongle_platform_state)
870 
871  @property
872  def platform_status(self):
873  return self._get_val(self._current_message.dongle_platform_status)
874 
875  @property
876  def reset_reason(self):
877  return self._get_val(self._current_message.dongle_reset_reason)
878 
879  @property
881  controller_state = self.controller_state
882  if controller_state is not _DEFAULT_VAL:
883  if controller_state == 0:
884  return "Idle (%d)" % controller_state
885  elif controller_state == 4:
886  return "Active (%d)" % controller_state
887  else:
888  return "Invalid (%d)" % controller_state
889  else:
890  return _DEFAULT_STR
891 
892  @property
894  controller_status = self.controller_status
895  if controller_status is not _DEFAULT_VAL:
896  if controller_status == 0:
897  return "Controller OK (%d)" % controller_status
898  elif controller_status == 1:
899  return "Awaiting NMEA (%d)" % controller_status
900  elif controller_status == 2:
901  return "RTK Timed Out (%d)" % controller_status
902  elif controller_status == 3:
903  return "RTK Unavailable (%d)" % controller_status
904  elif controller_status == 7:
905  return "Invalid Configuration (%d)" % controller_status
906  else:
907  return "Invalid (%d)" % controller_status
908  else:
909  return _DEFAULT_STR
910 
911  @property
913  platform_state = self.platform_state
914  if platform_state is not _DEFAULT_VAL:
915  if platform_state == 0:
916  return "Modem Powered Down (%d)" % platform_state
917  elif platform_state == 1:
918  return "Modem Powering Up (%d)" % platform_state
919  elif platform_state == 2:
920  return "Configuring Modem (%d)" % platform_state
921  elif platform_state == 3:
922  return "Modem Powering Down (%d)" % platform_state
923  elif platform_state == 4:
924  return "Modem Ready (%d)" % platform_state
925  elif platform_state == 5:
926  return "Connecting to Network (%d)" % platform_state
927  elif platform_state == 6:
928  return "Disconnecting from Network (%d)" % platform_state
929  elif platform_state == 7:
930  return "Connected to Network (%d)" % platform_state
931  elif platform_state == 8:
932  return "Connecting to RTK Service (%d)" % platform_state
933  elif platform_state == 9 or platform_state == 10:
934  return "Unable to Connect to RTK Service (%d)" % platform_state
935  elif platform_state == 11:
936  return "Disconnecting From RTK Service (%d)" % platform_state
937  elif platform_state == 12:
938  return "Connected to RTK Service (%d)" % platform_state
939  elif platform_state == 13 or platform_state == 14:
940  return "Device Error (%d)"
941  else:
942  return "Invalid (%d)" % platform_state
943  else:
944  return _DEFAULT_STR
945 
946  @property
948  platform_status = self.platform_status
949  if platform_status is not _DEFAULT_VAL:
950  if platform_status == 0:
951  return "Platform OK (%d)" % platform_status
952  elif platform_status == 4:
953  return "RTK Service Connection Broken (%d)" % platform_status
954  elif platform_status == 6:
955  return "Cell Connection Dropped (%d)" % platform_status
956  elif platform_status == 7:
957  return "Modem Error (%d)" % platform_status
958  else:
959  return "Invalid (%d)" % platform_status
960  else:
961  return _DEFAULT_STR
962 
963  @property
965  reset_reason = self.reset_reason
966  if reset_reason is not _DEFAULT_VAL:
967  if reset_reason == 0:
968  return "Power On (%d)" % reset_reason
969  elif reset_reason == 1:
970  return "Unknown (%d)" % reset_reason
971  elif reset_reason == 2:
972  return "Software Reset (%d)" % reset_reason
973  elif reset_reason == 3:
974  return "Hardware Error Reset (%d)" % reset_reason
975  else:
976  return "Invalid (%d)"
977  else:
978  return _DEFAULT_STR
979 
980  @property
981  def rtk_led_string(self):
982  platform_state = self.platform_state
983  if platform_state is not _DEFAULT_VAL:
984  if platform_state == 0:
985  return _ICON_GREY_UNCHECKED_MEDIUM
986  elif platform_state in (1, 2, 4, 5):
987  return _ICON_GREEN_UNCHECKED_MEDIUM
988  elif platform_state in (3, 6):
989  return _ICON_GREEN_CHECKED_MEDIUM
990  elif platform_state in (7, 8, 11, 12):
991  low_signal_quality = self.signal_quality is _DEFAULT_VAL or self.signal_quality < 5
992  out_of_range = self.controller_status is _DEFAULT_VAL or self.controller_status == 3
993  if low_signal_quality:
994  return _ICON_TEAL_CHECKED_MEDIUM if out_of_range else _ICON_TEAL_UNCHECKED_MEDIUM
995  else:
996  return _ICON_BLUE_CHECKED_MEDIUM if out_of_range else _ICON_BLUE_UNCHECKED_MEDIUM
997  elif platform_state in (9, 10):
998  return _ICON_RED_UNCHECKED_MEDIUM
999  elif platform_state in (13, 14):
1000  return _ICON_RED_CHECKED_MEDIUM
1001  else:
1002  return _ICON_GREY_UNCHECKED_MEDIUM
1003  else:
1004  return _ICON_GREY_UNCHECKED_MEDIUM
1005 
1006 
1008 
1009  def __init__(self, node, node_name, topic_name):
1010  super(FilterAidingMeasurementSummaryMonitor, self).__init__(node, node_name, topic_name, FilterAidingMeasurementSummary)
1011 
1012  @property
1013  def gnss1_enabled(self):
1014  return self._get_val(self._current_message.gnss1.enabled)
1015 
1016  @property
1017  def gnss1_used(self):
1018  return self._get_val(self._current_message.gnss1.used)
1019 
1020  @property
1021  def gnss2_enabled(self):
1022  return self._get_val(self._current_message.gnss2.enabled)
1023 
1024  @property
1025  def gnss2_used(self):
1026  return self._get_val(self._current_message.gnss2.used)
1027 
1028  @property
1030  return self._get_val(self._current_message.dual_antenna.enabled)
1031 
1032  @property
1034  return self._get_val(self._current_message.dual_antenna.used)
1035 
1036  @property
1037  def heading_enabled(self):
1038  return self._get_val(self._current_message.heading.enabled)
1039 
1040  @property
1041  def heading_used(self):
1042  return self._get_val(self._current_message.heading.used)
1043 
1044  @property
1045  def pressure_enabled(self):
1046  return self._get_val(self._current_message.pressure.enabled)
1047 
1048  @property
1049  def pressure_used(self):
1050  return self._get_val(self._current_message.pressure.used)
1051 
1052  @property
1054  return self._get_val(self._current_message.magnetometer.enabled)
1055 
1056  @property
1058  return self._get_val(self._current_message.magnetometer.used)
1059 
1060  @property
1061  def speed_enabled(self):
1062  return self._get_val(self._current_message.speed.enabled)
1063 
1064  @property
1065  def speed_used(self):
1066  return self._get_val(self._current_message.speed.used)
1067 
1068  @property
1071 
1072  @property
1074  return self._get_small_boolean_icon_string(self.gnss1_used)
1075 
1076  @property
1079 
1080  @property
1082  return self._get_small_boolean_icon_string(self.gnss2_used)
1083 
1084  @property
1087 
1088  @property
1091 
1092  @property
1095 
1096  @property
1099 
1100  @property
1103 
1104  @property
1107 
1108  @property
1111 
1112  @property
1115 
1116  @property
1119 
1120  @property
1122  return self._get_small_boolean_icon_string(self.speed_used)
1123 
1124 
1126  def __init__(self, filter_status_monitor, gnss_1_aiding_status_monitor, gnss_2_aiding_status_monitor):
1127  # This monitor is a little different in that it checks other monitors, so just save the other monitors
1128  self._filter_status_monitor = filter_status_monitor
1129  self._gnss_1_aiding_status_monitor = gnss_1_aiding_status_monitor
1130  self._gnss_2_aiding_status_monitor = gnss_2_aiding_status_monitor
1131 
1132  @property
1133  def gq7_led_icon(self):
1134  filter_state = self._filter_status_monitor.filter_state
1135  if filter_state is not _DEFAULT_VAL:
1136  if filter_state == 1:
1137  return _ICON_YELLOW_CHECKED_MEDIUM
1138  elif filter_state == 2 or filter_state == 3:
1139  return _ICON_YELLOW_UNCHECKED_MEDIUM
1140  elif filter_state == 4:
1141  gnss_1_differential = self._gnss_1_aiding_status_monitor.differential_corrections
1142  gnss_2_differential = self._gnss_2_aiding_status_monitor.differential_corrections
1143  if (gnss_1_differential is not _DEFAULT_VAL and gnss_1_differential) or (gnss_2_differential is not _DEFAULT_VAL and gnss_2_differential):
1144  return _ICON_BLUE_CHECKED_MEDIUM
1145  else:
1146  return _ICON_GREEN_CHECKED_MEDIUM
1147  else:
1148  return _ICON_GREY_UNCHECKED_MEDIUM
def __init__(self, node, node_name, topic_name, device_report_monitor)
Definition: subscribers.py:91
def __init__(self, filter_status_monitor, gnss_1_aiding_status_monitor, gnss_2_aiding_status_monitor)
def __init__(self, node, node_name, topic_name)
Definition: subscribers.py:51
def _get_string_units(self, val, units, default_val=_DEFAULT_VAL, default_str=_DEFAULT_STR)
Definition: common.py:127
def __init__(self, node, node_name, topic_name, llh=True)
Definition: subscribers.py:246
def __init__(self, node, node_name, topic_name)
Definition: subscribers.py:689
def __init__(self, node, node_name, topic_name)
Definition: subscribers.py:504
def _get_string(self, val, default_val=_DEFAULT_VAL, default_str=_DEFAULT_STR)
Definition: common.py:121
def _get_boolean_string(self, val, default_val=_DEFAULT_VAL)
Definition: common.py:148
def _get_string_hex(self, val, default_val=_DEFAULT_VAL, default_str=_DEFAULT_STR)
Definition: common.py:133
def __init__(self, node, node_name, topic_name)
Definition: subscribers.py:558
def __init__(self, node, node_name, topic_name)
Definition: subscribers.py:856
def __init__(self, node, node_name, topic_name)
Definition: subscribers.py:590
def __init__(self, node, node_name, topic_name, message_type)
Definition: subscribers.py:607
def _get_val(self, val, default=_DEFAULT_VAL)
Definition: common.py:115
def _euler_from_quaternion(self, quaternion)
Definition: common.py:87
def _get_small_boolean_icon_string(self, val, default_val=_DEFAULT_VAL)
Definition: common.py:139


microstrain_inertial_rqt
Author(s): Parker Hannifin Corp
autogenerated on Wed Mar 22 2023 02:35:20