9 from std_msgs.msg
import Header
10 from nmea_msgs.msg
import Sentence
11 from sensor_msgs.msg
import NavSatFix
12 from sensor_msgs.msg
import NavSatStatus
18 _MAVROS_MSGS_NAME =
"mavros_msgs"
19 _RTCM_MSGS_NAME =
"rtcm_msgs"
20 have_mavros_msgs =
False
21 have_rtcm_msgs =
False
22 if importlib.util.find_spec(_MAVROS_MSGS_NAME)
is not None:
23 have_mavros_msgs =
True
24 from mavros_msgs.msg
import RTCM
as mavros_msgs_RTCM
25 if importlib.util.find_spec(_RTCM_MSGS_NAME)
is not None:
27 from rtcm_msgs.msg
import Message
as rtcm_msgs_RTCM
33 self.
_debug = json.loads(os.environ[
"NTRIP_CLIENT_DEBUG"].lower())
39 rospy.init_node(name, anonymous=
True, log_level=rospy.DEBUG)
41 rospy.init_node(name, anonymous=
True)
47 rtcm_message_package = rospy.get_param(
'~rtcm_message_package', _MAVROS_MSGS_NAME)
48 if rtcm_message_package == _MAVROS_MSGS_NAME:
53 rospy.logfatal(
'The requested RTCM package {} is a valid option, but we were unable to import it. Please make sure you have it installed'.format(rtcm_message_package))
54 elif rtcm_message_package == _RTCM_MSGS_NAME:
59 rospy.logfatal(
'The requested RTCM package {} is a valid option, but we were unable to import it. Please make sure you have it installed'.format(rtcm_message_package))
61 rospy.logfatal(
'The RTCM package {} is not a valid option. Please choose between the following packages {}'.format(rtcm_message_package, str.join([_MAVROS_MSGS_NAME, _RTCM_MSGS_NAME])))
70 logwarn=rospy.logwarn,
71 loginfo=rospy.loginfo,
72 logdebug=rospy.logdebug
83 rospy.on_shutdown(self.
stop)
87 rospy.logerr(
'Unable to connect to NTRIP server')
102 rospy.loginfo(
'Stopping RTCM publisher')
106 rospy.loginfo(
'Disconnecting NTRIP client')
111 self.
_client.send_nmea(nmea.sentence)
115 timestamp_secs = fix.header.stamp.secs + fix.header.stamp.nsecs * 1e-9
116 timestamp = datetime.datetime.fromtimestamp(timestamp_secs)
117 time = timestamp.time()
121 millisecond = int(time.microsecond * 1e-4)
122 nmea_utc = f
"{hour:02}{minute:02}{second:02}.{millisecond:02}"
125 nmea_lat_direction =
"N"
126 nmea_lon_direction =
"E"
128 nmea_lat_direction =
"S"
129 if fix.longitude < 0:
130 nmea_lon_direction =
"W"
133 nmea_lat = NMEAParser.lat_dd_to_dmm(fix.latitude)
134 nmea_lon = NMEAParser.lon_dd_to_dmm(fix.longitude)
137 status = fix.status.status
138 if status == NavSatStatus.STATUS_FIX:
140 elif status == NavSatStatus.STATUS_SBAS_FIX:
142 elif status == NavSatStatus.STATUS_GBAS_FIX:
148 nmea_sentence_no_checksum = f
"$GPGGA,{nmea_utc},{nmea_lat},{nmea_lat_direction},{nmea_lon},{nmea_lon_direction},{nmea_status},05,1.0,100.0,M,-32.0,M,,0000"
149 nmea_checksum = NMEAParser.checksum(nmea_sentence_no_checksum)
150 nmea_sentence = f
"{nmea_sentence_no_checksum}*{nmea_checksum:x}\r\n"
153 self.
_client.send_nmea(nmea_sentence)
157 for raw_rtcm
in self.
_client.recv_rtcm():
161 return mavros_msgs_RTCM(
163 stamp=rospy.Time.now(),
170 return rtcm_msgs_RTCM(
172 stamp=rospy.Time.now(),