Пример #1
1
def talker():
	
	print 'in talker'
	pub = rospy.Publisher('GPS', NavSatFix)
	rospy.init_node('GPStalker')
	while not rospy.is_shutdown():
		#Assuming that parse will return these values
		time.sleep(1)
		parse()
		msg = NavSatFix()
		Fix = NavSatStatus()
		Fix.status = GPS.mode
		Fix.service = GPS.numSat
		
		msg.header.stamp = rospy.Time.now()
		msg.status = Fix
		msg.latitude = GPS.lat
		msg.longitude = GPS.lon
		msg.altitude = GPS.alt
		msg.position_covariance = (0, 0, 0, 0, 0, 0, 0, 0, 0)
		msg.position_covariance_type = 0
		#covariance_type = 0 unknown
		#                = 1 approximated
		#                = 2 diagonal known
		#                = 3 known
		pub.publish(msg)
Пример #2
0
def callback(sensorstr):
	data = sensorstr.data
	if data[0] == 'Z':
		data = data.replace("Z","").replace("\n","").replace("\r","")
		data_list = data.split(',')
		if len(data_list) == 4:
			try:
				##data_list structure: lat, lon, heading, vel 
				float_list = [float(i) for i in data_list]
				poseGPS = NavSatFix()
				poseGPS.header.frame_id = "world"
				poseGPS.header.stamp = rospy.Time.now()
				poseGPS.status.status = 0
				poseGPS.status.service = 1
				poseGPS.latitude = float_list[0]
				poseGPS.longitude = float_list[1]
				poseGPS.altitude = 0.0
				poseGPS.position_covariance = [3.24, 0, 0, 0, 3,24, 0, 0, 0, 0]
				poseGPS.position_covariance_type = 2
				try: 
					pubGPS.publish(poseGPS)
					log = "GPS Pose Data: %f %f Publish at Time: %s" % (float_list[0], float_list[1], rospy.get_time())
				except: 
					log = "poseGPS Publisher Error"

			except: 
				log = "GPS Data Error! Data :  %s" % data
				rospy.loginfo(log)
		rospy.loginfo(log)
Пример #3
0
def talker():
    pub = rospy.Publisher('gps/fix', NavSatFix, queue_size=10)
    rospy.init_node('fake_gps', anonymous=True)

    pub2 = rospy.Publisher('vel', Twist, queue_size=10)

    rate = rospy.Rate(2)  # 10hz
    loc_index = 0
    while not rospy.is_shutdown():
        #print(loc_index)
        fake_localization = NavSatFix()
        fake_vel = Twist()
        #fake_vel.frame_id = "/gps"
        #fake_localization.header.stamp = time.time()
        fake_localization.header.frame_id = '/gps'
        fake_localization.status.status = 1
        fake_localization.status.service = 1
        #print(gps_localizations[loc_index][0], gps_localizations[loc_index][1])
        fake_localization.latitude = gps_localizations[loc_index][0]
        fake_localization.longitude = gps_localizations[loc_index][1]
        print(fake_localization.latitude, fake_localization.longitude)
        fake_localization.altitude = 0.0
        fake_localization.position_covariance = [
            1.3224999999999998, 0.0, 0.0, 0.0, 1.3224999999999998, 0.0, 0.0,
            0.0, 5.289999999999999
        ]
        fake_localization.position_covariance_type = 1
        #fake_vel.header.frame_id = "/gps"
        pub.publish(fake_localization)
        pub2.publish(fake_vel)
        if (loc_index == len(gps_localizations) - 1):
            loc_index = 0
        else:
            loc_index = loc_index + 1
        rate.sleep()
	def callback(self):
		
		#Publish data at 1 Hz
		rate = rospy.Rate(1)
		
		#Define the RTKRCV server ports corresponding to each of the processing
		#Modes
		port = 5801
		
		sock = socket.socket()
		host = socket.gethostname()
		sock.connect((host, port))
		
		#WGS84 Parameters
		e2 = 6.69437999014e-3
		a = 6378137.0
		
		#At a rate of 1 hz, create an rtklib message for each socket and publish
		#the data over 
		while not rospy.is_shutdown():
		
			#Create and RTKLIB and a NavSatFix data structure
			rtk = rtklib()
			navsat = NavSatFix()
					
			#Set the data structure header time to the current system time
			navsat.header.stamp = rospy.Time.now()
			rtk.header.stamp = rospy.Time.now()	
					
			#Get the position message from the RTKRCV server
			msgStr = socket.recv(1024)
				
			#Split the message
			msg = msgStr.split()
					
			#Save the latitude, longitude and ellipsoid height
			navsat.latitude = float(msg[2])
			navsat.longitude = float(msg[3])
			navsat.altitude = float(msg[4])
					
			#Save the position covariance
			navsat.position_covariance = [float(msg[7]),float(msg[10]),float(msg[12]),float(msg[10]),float(msg[8]),float(msg[11]),float(msg[12]),float(msg[11]),float(msg[9])]
			navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_KNOWN
					
			#Compute the radius of curvature in the 
			N = 1.0*a/np.sqrt(1-e2*(np.sin(float(msg[2])*np.pi/180.0)**2))
					
			#Compute and store the ECEF position
			rtk.x =  (N+float(msg[4]))*np.cos(float(msg[2])*np.pi/180.0)*np.cos(float(msg[3])*np.pi/180.0)
			rtk.y = (N+float(msg[4]))*np.cos(float(msg[2])*np.pi/180.0)*np.sin(float(msg[3])*np.pi/180.0)
			rtk.z = (N*(1-e2)+float(msg[4]))*np.sin(float(msg[2])*np.pi/180.0)
			rtk.delay = float(msg[13])
			rtk.ftest = float(msg[14])
					
			#Store the NavSatFix data
			rtk.state = navsat
				
			pubs[i].publish(rtk)
				
			rate.sleep()
Пример #5
0
def publish_navsatfix(msg, num):

    global i_navsatfix

    if msg.name() != 'NAV_HPPOSLLH':
        print "error: invalid type of message!!!!"
        return

    navsatfix = NavSatFix()
    navsatfix.header.stamp = rospy.Time.now()
    if num == 1:
        navsatfix.header.frame_id = "/left_gnss"

    elif num == 2:
        navsatfix.header.frame_id = "/right_gnss"

    navsatfix.header.seq = i_navsatfix[num - 1]
    navsatfix.latitude = msg.Latitude * 1e-7 + msg.latHp * 1e-9
    navsatfix.longitude = msg.Longitude * 1e-7 + msg.lonHp * 1e-9
    navsatfix.altitude = msg.height * 1e-3 + msg.heightHp * 1e-4
    navsatfix.position_covariance = [(msg.hAcc * 1e-4) / math.sqrt(2.), 0, 0,
                                     0, (msg.hAcc * 1e-4) / math.sqrt(2.), 0,
                                     0, 0, (msg.vAcc * 1e-4)]
    navsatfix.status.status = fix_status[num - 1]

    if num == 1:
        pub_leftnavsatfix.publish(navsatfix)

    elif num == 2:
        pub_rightnavsatfix.publish(navsatfix)

    i_navsatfix[num - 1] += 1
Пример #6
0
def make_fix(t, data, args):
    fix = NavSatFix()
    fix.header.stamp = t
    fix.header.frame_id = args.frame_id
    if data.Q in (1, 2, 4):
        # Fix, Float, GPS
        fix.status.status = NavSatStatus.STATUS_GBAS_FIX
    elif data.Q == 3:
        # SBAS
        fix.status.status = NavSatStatus.STATUS_SBAS_FIX
    elif data.Q == 5:
        # Single
        fix.status.status = NavSatStatus.STATUS_FIX
    else:
        fix.status.status = NavSatStatus.STATUS_NO_FIX
    fix.latitude = data.lat
    fix.longitude = data.lon
    fix.altitude = data.height
    fix.position_covariance = [
        covariance(data.sde),
        covariance(data.sdne),
        covariance(data.sdeu),
        covariance(data.sdne),
        covariance(data.sdn),
        covariance(data.sdun),
        covariance(data.sdeu),
        covariance(data.sdun),
        covariance(data.sdu),
    ]
    fix.position_covariance_type = NavSatFix.COVARIANCE_TYPE_KNOWN

    return fix
def main():

    rospy.init_node('SensorLocalisationReciever', anonymous=True)

    print("Running SensorLocalisationReciever")
    # ser = serial.Serial(rospy.get_param('~sensorserialport','/dev/ttyACM0'))

    imu_data = Imu()

    gps_data = NavSatFix()

    imu_data.header.frame_id = 'base_link'
    gps_data.header.frame_id = 'map'

    rate = rospy.Rate(rospy.get_param("~rate", 100))

    imu_pub = rospy.Publisher('/imu/data', Imu, queue_size=10)
    gps_pub = rospy.Publisher('/gps/fix', NavSatFix, queue_size=10)

    while not rospy.is_shutdown():
        # print(x,y)

        # data = ser.readline()

        # if data[0]=='#':
        # data = data[1:]
        # linear,angular = data.split('/')[0],data.split('/')[1]

        linear = [float(x) for x in linear.split(' ')]
        angular = [float(x) for x in angular.split(' ')]

        imu_data.orientation.x = 1  ##angular[3]
        imu_data.orientation.y = 1  ## angular[4]
        imu_data.orientation.z = 1  ##angular[5]

        imu_data.linear_acceleration.x = 1  # linear[6]
        imu_data.linear_acceleration.y = 1  # linear[7]
        imu_data.linear_acceleration.z = 1  #linear[8]

        imu_data.angular_velocity_covariance = [
            1.0, 0, 0, 0, 1.0, 0, 0, 0, 1.0
        ]
        imu_data.linear_acceleration_covariance = [
            1.0, 0, 0, 0, 1.0, 0, 0, 0, 1.0
        ]

        gps_data.latitude = 1  # linear[0]
        gps_data.longitude = 1  #linear[1]
        gps_data.position_covariance = [1.0, 0, 0, 0, 1.0, 0, 0, 0, 1.0]
        gps_data.position_covariance_type = 3
        gps_data.header.stamp = imu_data.header.stamp = rospy.Time.now()

        imu_pub.publish(imu_data)
        gps_pub.publish(gps_data)
        print(linear)

        # print(angular)

        rate.sleep()
Пример #8
0
def callback_gps(data):
    gps_data = NavSatFix()
    gps_data.header.frame_id = "map"
    gps_data.latitude = data.x
    gps_data.longitude = data.y
    gps_data.position_covariance = [1e-3, 0, 0, 0, 1e-3, 0, 0, 0, 1e-3]
    gps_data.position_covariance_type = 3
    gps_data.header.stamp = rospy.Time.now()
    pub_gps.publish(gps_data)
Пример #9
0
def ExtFix2Fix(data):
    fix = NavSatFix()
    fix.header = data.header
    fix.status.status = data.status.status
    fix.status.service = data.status.position_source
    fix.latitude = data.latitude
    fix.longitude = data.longitude
    fix.altitude = data.altitude
    fix.position_covariance = data.position_covariance
    fix.position_covariance_type = data.position_covariance_type
    return fix
def ExtFix2Fix(data):
    fix = NavSatFix()
    fix.header = data.header
    fix.status.status = data.status.status
    fix.status.service = data.status.position_source
    fix.latitude = data.latitude
    fix.longitude = data.longitude
    fix.altitude = data.altitude
    fix.position_covariance = data.position_covariance
    fix.position_covariance_type = data.position_covariance_type
    return fix
 def publish_llh_msg(self, msg, **metadata):
     llh_msg = NavSatFix()
     llh_msg.latitude = msg.lat
     llh_msg.longitude = msg.lon
     llh_msg.altitude = msg.height
     llh_msg.position_covariance_type = 2
     llh_msg.position_covariance = [9, 0, 0, 0, 9, 0, 0, 0, 9]
     # Publish ROS messages
     self.pub_llh.publish(llh_msg)
     self.pub_llh_n_sats.publish(Int32(msg.n_sats))
     self.pub_llh_fix_mode.publish(Int32(msg.flags))
	def callback(self):
		
		rate = rospy.Rate(10)
		ports = [5801,5802,5803]
		sockets = []
		pubs = [self.static_pub, self.rtkStatic_pub, self.rtkDynamic_pub]
		
		for i in ports:
			
			sock = socket.socket()
			host = socket.gethostname()
			sock.connect((host, i))
			sockets.append(sock)
			
			e2 = 6.69437999014e-3
			a = 6378137.0
			
		while not rospy.is_shutdown():
			
			for i in range(len(sockets)):
				
				
				navsat = NavSatFix()
				ecef_xyz = Point()
				ecef_pose = Pose()
				#ecef_stampedPose = PoseStamped()
				
				navsat.header.stamp = rospy.Time.now()
					
				#Get the position message from the RTKRCV server
				msgStr = sockets[i].recv(1024)
			
				#Split the message
				msg = msgStr.split()
				
				navsat.latitude = float(msg[2])
				navsat.longitude = float(msg[3])
				navsat.altitude = float(msg[4])
				navsat.position_covariance = [float(msg[7]),float(msg[10]),float(msg[12]),float(msg[10]),float(msg[8]),float(msg[11]),float(msg[12]),float(msg[11]),float(msg[9])]
				navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_KNOWN
				
				N = 1.0*a/np.sqrt(1-e2*(np.sin(float(msg[2])*np.pi/180.0)**2))
				
				ecef_xyz.x = (N+float(msg[4]))*np.cos(float(msg[2])*np.pi/180.0)*np.cos(float(msg[3])*np.pi/180.0)
				ecef_xyz.y = (N+float(msg[4]))*np.cos(float(msg[2])*np.pi/180.0)*np.sin(float(msg[3])*np.pi/180.0)
				ecef_xyz.z = (N*(1-e2)+float(msg[4]))*np.sin(float(msg[2])*np.pi/180.0)
				
				ecef_pose.position = ecef_xyz
				#ecef_stampedPose.pose = ecef_pose
				
				pubs[i].publish(navsat)
				
			rate.sleep()
Пример #13
0
	def callback(self):
		
		rate = rospy.Rate(10)
		ports = [5801,5802,5803]
		sockets = []
		pubs = [self.static_pub, self.rtkStatic_pub, self.rtkDynamic_pub]
		
		for i in ports:
			
			sock = socket.socket()
			host = socket.gethostname()
			sock.connect((host, i))
			sockets.append(sock)
			
			e2 = 6.69437999014e-3
			a = 6378137.0
			
		while not rospy.is_shutdown():
			
			for i in range(len(sockets)):
				
				navsat = NavSatFix()
				ecef_xyz = Point()
				ecef_pose = Pose()
				#ecef_stampedPose = PoseStamped()
				
				navsat.header.stamp = rospy.Time.now()
					
				#Get the position message from the RTKRCV server
				msgStr = sockets[i].recv(1024)
			
				#Split the message
				msg = msgStr.split()
				
				navsat.latitude = float(msg[2])
				navsat.longitude = float(msg[3])
				navsat.altitude = float(msg[4])
				navsat.position_covariance = [float(msg[7]),float(msg[10]),float(msg[12]),float(msg[10]),float(msg[8]),float(msg[11]),float(msg[12]),float(msg[11]),float(msg[9])]
				navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_KNOWN
				
				N = 1.0*a/np.sqrt(1-e2*(np.sin(float(msg[2])*np.pi/180.0)**2))
				
				ecef_xyz.x = (N+float(msg[4]))*np.cos(float(msg[2])*np.pi/180.0)*np.cos(float(msg[3])*np.pi/180.0)
				ecef_xyz.y = (N+float(msg[4]))*np.cos(float(msg[2])*np.pi/180.0)*np.sin(float(msg[3])*np.pi/180.0)
				ecef_xyz.z = (N*(1-e2)+float(msg[4]))*np.sin(float(msg[2])*np.pi/180.0)
				
				ecef_pose.position = ecef_xyz
				#ecef_stampedPose.pose = ecef_pose
				
				pubs[i].publish(navsat)
				
			rate.sleep()
Пример #14
0
def msg_dict_to_NavSatFix(msg_dict):
    msg = NavSatFix()
    msg.header = Header()
    msg.header.stamp = rospy.Time.now()
    msg.header.frame_id = msg_dict['header']['frame_id']
    msg.latitude = msg_dict['latitude']
    msg.longitude = msg_dict['longitude']
    msg.altitude = msg_dict['altitude']
    msg.status.status = msg_dict['status']['status']
    msg.status.service = msg_dict['status']['service']
    msg.position_covariance = msg_dict['position_covariance']
    msg.position_covariance_type = msg_dict['position_covariance_type']
    return msg
Пример #15
0
    def publishCurLatLon(self):
        msg = NavSatFix()
        msg.header.stamp = rospy.Time(self.curTime)
        msg.latitude = self.curLat
        msg.longitude = self.curLon
        # very small error for now
        msg.position_covariance = [0] * 9
        msg.position_covariance[0] = 5**2
        msg.position_covariance[3] = 5**2
        rospy.loginfo("Publishing position %f, %f at time %f", self.curLat,
                      self.curLon, self.curTime)

        self.fixPub.publish(msg)
Пример #16
0
def main():
    pub = rospy.Publisher("goal_coords", NavSatFix, queue_size=10)
    rospy.init_node("goal_pub", anonymous=False)
    r = rospy.Rate(1)
    while not rospy.is_shutdown():
        msg = NavSatFix()
        msg.header.frame_id = "gps_frame"
        msg.longitude = 100
        msg.latitude = 100
        msg.position_covariance = [1, 0, 0, 0, 1, 0, 0, 0, 1]
        pub.publish(msg)
        r.sleep()
        print(msg)
def talker():
    pub = rospy.Publisher('andro2linux_gps', NavSatFix, queue_size=10)
    rospy.init_node('andro2linux_gps_publisher', anonymous=True)

    # socket type (UDP = SOCK_DGRAM, TCP = SOCK_STREAM)
    s = socket(AF_INET, SOCK_DGRAM)

    # port setup
    s.bind(('', ECHO_PORT))

    # ready!
    print('udp echo server ready')

    # infinite loop
    while 1:
        # Waiting for client
        data, addr = s.recvfrom(BUFSIZE)

        # extract the information from fused provided
        splitted_data = str(data).split("\n")
        provider = splitted_data[0].split()[1]
        if provider == 'fused':
            gpsmsg = NavSatFix()
            gpsmsg.header.stamp = rospy.Time.now()
            gpsmsg.header.frame_id = "gps"

            #print(splitted_data)
            longitude = float(splitted_data[1].split()[1])
            latitude = float(splitted_data[2].split()[1])
            altitude = float(splitted_data[3].split()[1])
            accuracy = float(splitted_data[4].split()[1])
            variance = accuracy * accuracy
            hasspeed = splitted_data[5].split()[1] == 'true'

            gpsmsg.latitude = latitude
            gpsmsg.longitude = longitude
            gpsmsg.altitude = altitude
            gpsmsg.position_covariance_type = NavSatFix.COVARIANCE_TYPE_APPROXIMATED
            gpsmsg.position_covariance = (variance, 0, 0, 0, variance, 0, 0, 0,
                                          variance)

            print(gpsmsg)
            print("------------------------")

            # publish
            pub.publish(gpsmsg)
            if rospy.is_shutdown():
                break

        # send back to client
        s.sendto(data, addr)
Пример #18
0
 def set_destination(self, destination):
     msg = NavSatFix()
     msg.header.stamp = rospy.get_rostime()
     msg.header.frame_id = "utm"
     msg.latitude = float(destination['latitude'])
     msg.longitude = float(destination['longitude'])
     msg.altitude = 0
     msg.status.status = NavSatStatus.STATUS_GBAS_FIX
     msg.status.service = 0
     msg.position_covariance = [0] * 9
     msg.position_covariance_type = NavSatFix.COVARIANCE_TYPE_UNKNOWN
     self._goalfixpub.publish(msg)
     ret = {'method': "set_destination", 'msg': "set"}
     return ret
Пример #19
0
def gpsCallback(data):
    gps = NavSatFix()
    gps.header.seq = data.header.seq
    gps.header.stamp = data.header.stamp
    if (gps.header.stamp.secs % 10 != 4):
        gps.header.frame_id = "gps3_Link"
        gps.status = data.status
        gps.latitude = data.latitude
        gps.longitude = data.longitude
        gps.altitude = data.altitude
        gps.position_covariance = data.position_covariance
        gps.position_covariance_type = data.position_covariance_type
        pub = rospy.Publisher('/gps_filtered', NavSatFix, queue_size=10)
        rate = rospy.Rate(5)  # Hz
        pub.publish(gps)
        rate.sleep()
    else:
        gps.header.frame_id = "false_Link"
        gps.status = data.status
        gps.latitude = 0
        gps.longitude = 0
        gps.altitude = 0
        gps.position_covariance = data.position_covariance
        gps.position_covariance_type = data.position_covariance_type
Пример #20
0
def publish_gps(event):
    global origin_lat, origin_lon, first
    #It may take a second or two to get good data
    #print gpsd.fix.latitude,', ',gpsd.fix.longitude,'  Time: ',gpsd.utc

    # os.system('clear')

    # print
    # print ' GPS reading'
    # print '----------------------------------------'
    # print 'latitude    ' , gpsd.fix.latitude
    # print 'longitude   ' , gpsd.fix.longitude
    # print 'time utc    ' , gpsd.utc,' + ', gpsd.fix.time
    # print 'altitude (m)' , gpsd.fix.altitude
    # print 'epx         ' , gpsd.fix.epx
    # print 'epv         ' , gpsd.fix.epv
    # print 'ept         ' , gpsd.fix.ept
    # print 'speed (m/s) ' , gpsd.fix.speed
    # print 'climb       ' , gpsd.fix.climb
    # print 'track       ' , gpsd.fix.track
    # print 'mode        ' , gpsd.fix.mode
    # print
    # print 'sats        ' , gpsd.satellites

    navsat = NavSatFix()
    header = Header()
    header.stamp = rospy.Time.now()
    header.frame_id = "base_link"
    navsat.header = header
    navsat_status = NavSatStatus()
    navsat_status.status = 0
    navsat_status.service = 1
    navsat.status = navsat_status
    navsat.latitude = gpsd.fix.latitude
    navsat.longitude = gpsd.fix.longitude
    navsat.altitude = gpsd.fix.altitude
    navsat.position_covariance_type = 2
    navsat.position_covariance = [2.5, 0, 0,
                                  0, 2.5, 0,
                                  0, 0, 2.5]

    if not origin_lat and not origin_lon:
      origin_lat = gpsd.fix.latitude
      origin_lon = gpsd.fix.longitude

    # print ('Odometry: ')
    # print (x, y)
    pub_navsat.publish(navsat)
def save_gps_bag(frame_id, seq, seconds, nanoseconds, status, service, latitude, longitude, altitude, position_covariance, position_covariance_type):
  ros_gps = NavSatFix()

  ros_gps.header.seq = seq
  ros_gps.header.stamp.secs = seconds
  ros_gps.header.stamp.nsecs = nanoseconds
  ros_gps.header.frame_id = frame_id
  gps_GGA_topic = "/gps/fix"
  ros_gps.status.status = status
  ros_gps.status.service = service
  ros_gps.latitude = latitude
  ros_gps.longitude = longitude
  ros_gps.altitude = altitude
  ros_gps.position_covariance = position_covariance
  ros_gps.position_covariance_type = position_covariance_type
  bag.write(gps_GGA_topic, ros_gps, ros_gps.header.stamp)
Пример #22
0
    def ubicacion(self):
        rospy.init_node("GPS_DATA")
        pub1 = rospy.Publisher('/gps/odom', Odometry, queue_size=10)
        pub2 = rospy.Publisher('/gps/data', NavSatFix, queue_size=10)
        pub3 = rospy.Publisher('/gps/str', String, queue_size=10)
        gps = serial.Serial(self.port, baudrate=self.baud, timeout=0.1)
        if gps.isOpen():
            rate = rospy.Rate(100)  # 100hz
            while not rospy.is_shutdown():
                try:
                    self.GPS_read(gps)
                    self.LLH2GPS(self.Latitude, self.Longitude)
                except:
                    pass
                # PUBLISH DATA
                gps_msg = NavSatFix()
                gps_msg.header.stamp = rospy.get_rostime()
                gps_msg.header.frame_id = "gps_data"
                gps_msg.status.status = -1
                if self.quality == 1:
                    gps_msg.status.status = 0
                elif self.quality == 4:
                    gps_msg.status.status = 2
                elif self.quality == 5:
                    gps_msg.status.status = 1
                gps_msg.latitude = self.Latitude
                gps_msg.longitude = self.Longitude
                gps_msg.altitude = self.altitude
                gps_msg.position_covariance = np.array([
                    self.eLat, 0.0, 0.0, 0.0, self.eLon, 0.0, 0.0, 0.0,
                    self.eAlt
                ])

                gps_odm = Odometry()
                gps_odm.header.stamp = rospy.get_rostime()
                gps_odm.header.frame_id = "gps_odom_data"
                gps_odm.child_frame_id = "UTM_coordenates"
                gps_odm.pose.pose.position.x = self.x
                gps_odm.pose.pose.position.y = self.y
                gps_odm.pose.pose.position.z = self.altitude
                gps_odm.pose.pose.orientation.z = self.COG
                gps_odm.twist.twist.linear.x = self.speed_m_s

                pub1.publish(gps_odm)
                pub2.publish(gps_msg)
                pub3.publish(self.line)
                rate.sleep()
Пример #23
0
def do_fix():

    global path, gps_err_x, gps_err_y

    rate = rospy.Rate(1)

    while not rospy.is_shutdown():

        gps_err_x, gps_err_y = random.choice(GPS_ERR_V,
                                             p=GPS_ERR_P[param_gps_err],
                                             size=(2))
        gps_err = sqrt(gps_err_x**2 + gps_err_y**2)

        with lock:
            now = rospy.Time.now()

            x, y = pos_x + gps_err_x, pos_y + gps_err_y

            m = NavSatFix()
            m.header.stamp = now
            m.header.frame_id = base_frame
            m.status.status = 0
            m.status.service = 1
            m.latitude, m.longitude = utm.to_latlon(x, y, 30, northern=True)
            m.altitude = 0
            m.position_covariance = [(2 * gps_err)**2, 0.0, 0.0, 0.0,
                                     (2 * gps_err)**2, 0.0, 0.0, 0.0, 10.0]
            m.position_covariance_type = 3

            n = PoseStamped()
            n.header.stamp = now
            n.header.frame_id = map_frame
            n.pose.position = Point(x - pos_x0, y - pos_y0, 0)
            q = quaternion_from_euler(0, 0, orientation)
            n.pose.orientation = Quaternion(*q)

            path.poses.append(n)
            path.poses = path.poses[-param_path_length:]
            path.header.stamp = now

        if param_publish_fix:
            pub_fix.publish(m)
        if param_publish_path:
            pub_path.publish(path)
        rate.sleep()
Пример #24
0
def main():
    ser = serial.Serial(port, 9600)
    pub_nfs = rospy.Publisher('gps_nfs', NavSatFix, queue_size=10)
    pub_odo = rospy.Publisher('gps_odo', Odometry, queue_size=10)
    rospy.init_node('internal_gps', anonymous=True)
    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        gpsdat = ser.readline()
        if gpsdat[0:6] == "$GPGGA":
            msg = pynmea2.parse(gpsdat)
            r_msg = NavSatFix()
            r_msg.latitude = msg.latitude
            r_msg.longitude = msg.longitude
            r_msg.altitude = msg.altitude
            c = msg.gps_qual
            r_msg.position_covariance = \
                    [c,0,0, 0,c,0, 0,0,c]
            pub_nfs.publish(r_msg)
            o_msg = Odometry()
            o_msg.header.frame_id = "gps_frame"
            o_msg.pose.pose.position.x = msg.latitude
            o_msg.pose.pose.position.y = msg.longitude
            o_msg.pose.pose.position.z = msg.altitude
            o_msg.pose.pose.orientation.x = 1
            o_msg.pose.pose.orientation.y = 0
            o_msg.pose.pose.orientation.z = 0
            o_msg.pose.pose.orientation.w = 0
            h = 99999
            o_msg.pose.covariance = [
                c, 0, 0, 0, 0, 0, 0, c, 0, 0, 0, 0, 0, 0, c, 0, 0, 0, 0, 0, 0,
                h, 0, 0, 0, 0, 0, 0, h, 0, 0, 0, 0, 0, 0, h
            ]
            o_msg.twist.twist.linear.x = 0
            o_msg.twist.twist.linear.y = 0
            o_msg.twist.twist.linear.z = 0
            o_msg.twist.twist.angular.x = 0
            o_msg.twist.twist.angular.y = 0
            o_msg.twist.twist.angular.z = 0
            o_msg.twist.covariance = [
                h, 0, 0, 0, 0, 0, 0, h, 0, 0, 0, 0, 0, 0, h, 0, 0, 0, 0, 0, 0,
                h, 0, 0, 0, 0, 0, 0, h, 0, 0, 0, 0, 0, 0, h
            ]
            print(r_msg)
            pub_odo.publish(o_msg)
Пример #25
0
    def publish(self):
        header = Header()
        header.stamp = rospy.Time.now()

        navStatus = NavSatStatus()
        navStatus.status = (self.fixStatus - 1)
        navStatus.service = (0b1111)

        gpsMsg = NavSatFix()
        gpsMsg.header = header
        gpsMsg.status = navStatus
        gpsMsg.latitude = self.lat
        gpsMsg.longitude = self.long
        gpsMsg.altitude = self.alt
        gpsMsg.position_covariance = self.covariance
        gpsMsg.position_covariance_type = self.covariance_type

        self.navSatPub.publish(gpsMsg)
        self.headingPub.publish(self.heading)
Пример #26
0
 def parse_gps(self, data):
     # {
     #   u'status':
     #   {
     #       u'pDOP': 99.99,
     #       u'positionLatLonAlt': [u'0.000000000', u'0.000000000', u'0.000000000'],
     #       u'satellites_dB': u'15,',
     #       u'gga': u'',
     #       u'vAcc': 3750111.232,
     #       u'position': [u'6378137.0000', u'0.0000', u'0.0000'],
     #       u'estAccuracy': 4294967.295, u'heading': 0,
     #       u'headingAccuracy': 180,
     #       u'hAcc': 4294967.295
     #   },
     #   u'ts': 77168472,
     #   u'general':
     #   {
     #       u'gpsFix': u'no fix/invalid',
     #       u'mode': u'rover'
     #   }
     # }
     fix = NavSatFix()
     fix.header.stamp = rospy.Time.now()
     fix.header.frame_id = self.frame
     fix.status.service = NavSatStatus.SERVICE_GPS
     fix.position_covariance = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
     fix.position_covariance_type = NavSatFix.COVARIANCE_TYPE_APPROXIMATED
     try:
         fix.latitude = float(data['status']['positionLatLonAlt'][0])
         fix.longitude = float(data['status']['positionLatLonAlt'][1])
         fix.altitude = float(data['status']['positionLatLonAlt'][2])
         fix.position_covariance[0] = float(data['status']['hAcc'])
         fix.position_covariance[4] = float(data['status']['hAcc'])
         fix.position_covariance[8] = float(data['status']['vAcc'])
         if data['general']['gpsFix'] == 'no fix/invalid':
             fix.status.status = NavSatStatus.STATUS_NO_FIX
         else:
             fix.status.status = NavSatStatus.STATUS_FIX
     except KeyError as e:
         rospy.logwarn('Unable to GNSS parse message ' + str(e))
         print(data)
     else:
         self.nav_sat_fix_pub.publish(fix)
Пример #27
0
def parse_novatelGPS(gpsString):
    # ----- parse the data string from fields to variables -----
    solutionStatus = gpsString[0]  # Solution status
    positionType = gpsString[1]  # Position type
    latitude = gpsString[2]  # Latitude
    longitude = gpsString[3]  # Longitude
    heightMSL = gpsString[4]  # Height above mean sea level
    undulation = gpsString[5]  # Undulation
    datumID = gpsString[6]  # Datum ID
    latitudeDev = gpsString[7]  # Latitude standard deviation
    longitudeDev = gpsString[8]  # Longitude standard deviation
    heightDev = gpsString[9]  # Height standard deviation
    baseStationID = gpsString[10]  # Base station ID
    differentialAge = gpsString[11]  # Differential age
    solutionAge = gpsString[12]  # Solution age in seconds
    observationsTracked = gpsString[13]  # Number of observations tracked
    usedL1Ranges = gpsString[
        14]  # Number of satellite solutions used in computation
    aboveMaskL1Ranges = gpsString[
        15]  # Number of GPS and GLONASS L1 ranges above the RTK mask angle
    aboveMaskL2Ranges = gpsString[
        16]  # Number of GPS and GLONASS L2 ranges above the RTK mask angle
    # ----- Format the gps data into ros msg -----
    fix_msg = NavSatFix()
    fix_msg.header.stamp = rospy.get_rostime()
    fix_msg.header.frame_id = 'cns5000_frame'
    fix_msg.latitude = float(latitude)
    fix_msg.longitude = float(longitude)
    fix_msg.altitude = float(heightMSL)
    fix_msg.position_covariance = [
        0.01, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 999.0
    ]
    fix_msg.position_covariance_type = 1

    #fix_msg.position_covariance_type = 0
    #fix_msg.position_covariance = 0
    #fix_msg.status = 0 # Fix
    # TODO add a check for a valid position. Currently all data is marked as valid
    # TODO use the checksum to check the message
    #fix_msg.status = -1 # No Fix
    #print "Solution Status:", solutionStatus
    return fix_msg
Пример #28
0
    def publish_gps_point(self, latitude, longitude, height, variance, status,
                          pub_navsatfix, pub_pose, pub_point, pub_transform):
        # Navsatfix message.
        navsatfix_msg = NavSatFix()
        navsatfix_msg.header.stamp = rospy.Time.now()
        navsatfix_msg.header.frame_id = self.navsatfix_frame_id
        navsatfix_msg.position_covariance_type = NavSatFix.COVARIANCE_TYPE_APPROXIMATED
        navsatfix_msg.status.service = NavSatStatus.SERVICE_GPS
        navsatfix_msg.latitude = latitude
        navsatfix_msg.longitude = longitude
        navsatfix_msg.altitude = height
        navsatfix_msg.status.status = status
        navsatfix_msg.position_covariance = [
            variance[0], 0, 0, 0, variance[1], 0, 0, 0, variance[2]
        ]
        # Local Enu coordinate.
        (east, north, up) = self.geodetic_to_enu(latitude, longitude, height)

        # Pose message.
        pose_msg = PoseWithCovarianceStamped()
        pose_msg.header.stamp = navsatfix_msg.header.stamp
        pose_msg.header.frame_id = self.enu_frame_id
        pose_msg.pose = self.enu_to_pose_msg(east, north, up, variance)

        # Point message.
        point_msg = PointStamped()
        point_msg.header.stamp = navsatfix_msg.header.stamp
        point_msg.header.frame_id = self.enu_frame_id
        point_msg.point = self.enu_to_point_msg(east, north, up)

        # Transform message.
        transform_msg = TransformStamped()
        transform_msg.header.stamp = navsatfix_msg.header.stamp
        transform_msg.header.frame_id = self.enu_frame_id
        transform_msg.child_frame_id = self.transform_child_frame_id
        transform_msg.transform = self.enu_to_transform_msg(east, north, up)

        # Publish.
        pub_navsatfix.publish(navsatfix_msg)
        pub_pose.publish(pose_msg)
        pub_point.publish(point_msg)
        pub_transform.publish(transform_msg)
Пример #29
0
def gps2navsat(filename, bag):
    with open(filename, 'r') as file:
        try:
            while True:
                data = struct.unpack('qddd', file.read(8 * 4))
                time = data[0]
                local = data[1:]
                lat_lon_el_theta = struct.unpack('dddd', file.read(8 * 4))
                gps_cov = struct.unpack('dddddddddddddddd', file.read(8 * 16))

                if abs(lat_lon_el_theta[0]) < 1e-1:
                    continue

                navsat = NavSatFix()
                navsat.header.frame_id = 'gps'
                navsat.header.stamp = rospy.Time.from_sec(time * 1e-6)
                navsat.status.status = NavSatStatus.STATUS_FIX
                navsat.status.service = NavSatStatus.SERVICE_GPS

                navsat.latitude = lat_lon_el_theta[0]
                navsat.longitude = lat_lon_el_theta[1]
                navsat.altitude = lat_lon_el_theta[2]

                navsat.position_covariance = numpy.array(gps_cov).reshape(
                    4, 4)[:3, :3].flatten().tolist()
                navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_KNOWN

                bag.write('/gps/fix', navsat, navsat.header.stamp)

                geopoint = GeoPointStamped()
                geopoint.header = navsat.header
                geopoint.position.latitude = lat_lon_el_theta[0]
                geopoint.position.longitude = lat_lon_el_theta[1]
                geopoint.position.altitude = lat_lon_el_theta[2]

                bag.write('/gps/geopoint', geopoint, geopoint.header.stamp)

        except:
            print 'done'
Пример #30
0
def gps2navsat(filename, bag):
	with open(filename, 'r') as file:
		try:
			while True:
				data = struct.unpack('qddd', file.read(8*4))
				time = data[0]
				local = data[1:]
				lat_lon_el_theta = struct.unpack('dddd', file.read(8*4))
				gps_cov = struct.unpack('dddddddddddddddd', file.read(8*16))

				if abs(lat_lon_el_theta[0]) < 1e-1:
					continue

				navsat = NavSatFix()
				navsat.header.frame_id = 'gps'
				navsat.header.stamp = rospy.Time.from_sec(time * 1e-6)
				navsat.status.status = NavSatStatus.STATUS_FIX
				navsat.status.service = NavSatStatus.SERVICE_GPS

				navsat.latitude = lat_lon_el_theta[0]
				navsat.longitude = lat_lon_el_theta[1]
				navsat.altitude = lat_lon_el_theta[2]

				navsat.position_covariance = numpy.array(gps_cov).reshape(4, 4)[:3, :3].flatten().tolist()
				navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_KNOWN

				bag.write('/gps/fix', navsat, navsat.header.stamp)

				geopoint = GeoPointStamped()
				geopoint.header = navsat.header
				geopoint.position.latitude = lat_lon_el_theta[0]
				geopoint.position.longitude = lat_lon_el_theta[1]
				geopoint.position.altitude = lat_lon_el_theta[2]

				bag.write('/gps/geopoint', geopoint, geopoint.header.stamp)

		except:
			print 'done'
Пример #31
0
def talker():
    # Subscribe to Vicon messages
    viconTopic = rospy.get_param('topic')
    rospy.Subscriber(viconTopic, TransformStamped, callback)

    # Start a publisher for the GPS messages
    pub = rospy.Publisher('GPS/position', NavSatFix) # FIXME

    # Start the node
    rospy.init_node('talker')

    
    # Populate the NavSatFix message from the parameter server
    statusMsg = NavSatStatus()
    statusMsg.status = rospy.get_param('status', -1)
    statusMsg.service = rospy.get_param('service', 1)

    fixMsg = NavSatFix()
    fixMsg.header.stamp = rospy.Time.now()
    fixMsg.header.frame_id = "/world"

    fixMsg.status = statusMsg
    fixMsg.position_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]
    #position could be modified with some gaussian noise added to it and then calculate the covariance matrix.
    fixMsg.position_covariance_type = rospy.get_param('position_covariance_type', 0); 

    while not rospy.is_shutdown():
        
        [fixMsg.longitude, fixMsg.latitude, fixMsg.altitude] = c.xyz2gps([parentFrameLong, parentFrameLat, parentFrameAlt], latestViconMsg.transform.translation.x, latestViconMsg.transform.translation.y, latestViconMsg.transform.translation.z, parentFrameAngle)

        statusMsg.status = rospy.get_param('status', statusMsg.status)
        statusMsg.service = rospy.get_param('service', statusMsg.service)
        # put the sigma and calculate the cov matrix here

        #rospy.loginfo([fixMsg.longitude, fixMsg.latitude, fixMsg.altitude]) 
        pub.publish(fixMsg)
        rospy.sleep(0.1)
def gpsfix_to_navsatfix(gpsfix_msg):
    # Convert gps_common/GPSFix messages to sensor_msgs/NavSatFix messages
    navsat_msg = NavSatFix()
    navsat_msg.header = gpsfix_msg.header

    # Caution: GPSFix has defined some additional status constants, which are
    # not defined in NavSatFix.
    navsat_msg.status.status = gpsfix_msg.status.status

    navsat_msg.status.service = 0
    if gpsfix_msg.status.position_source & GPSStatus.SOURCE_GPS:
        navsat_msg.status.service = \
            navsat_msg.status.service | NavSatStatus.SERVICE_GPS
    if gpsfix_msg.status.orientation_source & GPSStatus.SOURCE_MAGNETIC:
        navsat_msg.status.service = \
            navsat_msg.status.service | NavSatStatus.SERVICE_COMPASS

    navsat_msg.latitude = gpsfix_msg.latitude
    navsat_msg.longitude = gpsfix_msg.longitude
    navsat_msg.altitude = gpsfix_msg.altitude
    navsat_msg.position_covariance = gpsfix_msg.position_covariance
    navsat_msg.position_covariance_type = gpsfix_msg.position_covariance_type

    return navsat_msg
Пример #33
0
    def navigation_handler(self, data):
        """ Rebroadcasts navigation data in the following formats:
        1) /odom => /base footprint transform (if enabled, as per REP 105)
        2) Odometry message, with parent/child IDs as in #1
        3) NavSatFix message, for systems which are knowledgeable about GPS stuff
        4) IMU messages
        """
        rospy.logdebug("Navigation received")
        # If we don't have a fix, don't publish anything...
        if self.nav_status.status == NavSatStatus.STATUS_NO_FIX:
            return

        # UTM conversion
        easting, northing = data.bestxyz.easting, data.bestxyz.northing

        # Initialize starting point if we haven't yet
        # TODO: Do we want to follow UTexas' lead and reinit to a nonzero point within the same UTM grid?
        # TODO: check INSPVAX sol stat for valid position before accepting
        if not self.init and self.zero_start:
            self.origin.x = easting
            self.origin.y = northing
            self.init = True

        # Publish origin reference for others to know about
        p = Pose()
        p.position.x = self.origin.x
        p.position.y = self.origin.y
        self.pub_origin.publish(p)

        # IMU
        # TODO: Work out these covariances properly. Logs provide covariances in local frame, not body
        imu = Imu()
        imu.header.stamp == rospy.Time.now()
        imu.header.frame_id = self.base_frame

        # Orientation
        # orient=PyKDL.Rotation.RPY(RAD(data.roll),RAD(data.pitch),RAD(data.heading)).GetQuaternion()
        # imu.orientation = Quaternion(*orient)
        imu.orientation.x = data.inspvax.pitch
        imu.orientation.y = data.inspvax.roll
        imu.orientation.z = data.inspvax.azimuth
        imu.orientation.w = 0
        IMU_ORIENT_COVAR[0] = POW(2, data.inspvax.pitch_std)
        IMU_ORIENT_COVAR[4] = POW(2, data.inspvax.roll_std)
        IMU_ORIENT_COVAR[8] = POW(2, data.inspvax.azimuth_std)
        imu.orientation_covariance = IMU_ORIENT_COVAR

        # Angular rates (rad/s)
        # corrimudata log provides instantaneous rates so multiply by IMU rate in Hz
        imu.angular_velocity.x = data.corrimudata.pitch_rate * self.imu_rate
        imu.angular_velocity.y = data.corrimudata.roll_rate * self.imu_rate
        imu.angular_velocity.z = data.corrimudata.yaw_rate * self.imu_rate
        imu.angular_velocity_covariance = IMU_VEL_COVAR

        # Linear acceleration (m/s^2)
        imu.linear_acceleration.x = data.corrimudata.x_accel * self.imu_rate
        imu.linear_acceleration.y = data.corrimudata.y_accel * self.imu_rate
        imu.linear_acceleration.z = data.corrimudata.z_accel * self.imu_rate
        imu.linear_acceleration_covariance = IMU_ACCEL_COVAR

        self.pub_imu.publish(imu)

        # Odometry
        # TODO: Work out these covariances properly
        odom = Odometry()
        odom.header.stamp = rospy.Time.now()
        odom.header.frame_id = self.odom_frame
        odom.child_frame_id  = self.base_frame
        odom.pose.pose.position.x = easting  - self.origin.x
        odom.pose.pose.position.y = northing - self.origin.y
        odom.pose.pose.position.z = data.inspvax.altitude
        #odom.pose.pose.orientation = Quaternion(*orient)
        odom.pose.pose.orientation = imu.orientation
        POSE_COVAR[21] = IMU_ORIENT_COVAR[0]
        POSE_COVAR[28] = IMU_ORIENT_COVAR[4]
        POSE_COVAR[35] = IMU_ORIENT_COVAR[8]
        odom.pose.covariance = POSE_COVAR

        # Twist is relative to vehicle frame
        odom.twist.twist.linear.x = data.bestxyz.velx
        odom.twist.twist.linear.y = data.bestxyz.vely
        odom.twist.twist.linear.z = data.bestxyz.velz
        TWIST_COVAR[0]  = pow(2,data.bestxyz.velx_std)
        TWIST_COVAR[7]  = pow(2,data.bestxyz.vely_std)
        TWIST_COVAR[14] = pow(2,data.bestxyz.velz_std)
        odom.twist.twist.angular = imu.angular_velocity
        odom.twist.covariance = TWIST_COVAR

        self.pub_odom.publish(odom)

        #
        # Odometry transform (if required)
        #
        if self.publish_tf:
            self.tf_broadcast.sendTransform(
                (odom.pose.pose.position.x, odom.pose.pose.position.y,
                 odom.pose.pose.position.z), odom.pose.pose.orientation, #Quaternion(*orient),
                 odom.header.stamp,odom.child_frame_id, odom.frame_id)

        #
        # NavSatFix
        # TODO: Work out these covariances properly from DOP
        #
        navsat = NavSatFix()
        navsat.header.stamp = rospy.Time.now()
        navsat.header.frame_id = self.odom_frame
        navsat.status = self.nav_status

        # position, in degrees
        navsat.latitude  = data.bestpos.latitude
        navsat.longitude = data.bestpos.longitude
        navsat.altitude  = data.bestpos.altitude
        NAVSAT_COVAR[0] = pow(2, data.bestpos.lat_std) # in meters
        NAVSAT_COVAR[4] = pow(2, data.bestpos.lon_std)
        NAVSAT_COVAR[8] = pow(2, data.bestpos.hgt_std)

        navsat.position_covariance = NAVSAT_COVAR
        navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_DIAGONAL_KNOWN

        self.pub_navsatfix.publish(navsat)
Пример #34
0
def my_handler(channel, data):
    global seq
    fix_pub = rospy.Publisher('fix', NavSatFix, queue_size=10)
    odom_pub = rospy.Publisher('odom', Odometry, queue_size=10)
    imu_pub = rospy.Publisher('imu/data', Imu, queue_size=10)
    use_odom = True
    use_fix = True
    use_imu = True

    gps_frame = "novatel"
    headermsg = Header()
    headermsg.seq = seq + 1
    headermsg.stamp = rospy.Time.now()
    headermsg.frame_id = gps_frame

    msg = auv_acfr_nav_t.decode(data)
    if use_fix == True:
        rospy.logdebug("Publising gps info")
        fixmsg = NavSatFix()
        fixmsg.header = headermsg
        fixmsg.latitude = math.radians(msg.latitude)
        fixmsg.longitude = math.radians(msg.longitude)
        fixmsg.altitude = msg.altitude
        fixmsg.position_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]
        fixmsg.position_covariance_type = 0
        fix_pub.publish(fixmsg)

    if use_imu == True:
        rospy.logdebug("Publishing imu")
        imumsg = Imu()
        q = quaternion_from_euler(
            msg.pitch, msg.roll,
            -np.unwrap(msg.heading - np.pi / 2))  # TODO check this
        imumsg.orientation.x = q[0]
        imumsg.orientation.y = q[1]
        imumsg.orientation.z = q[2]
        imumsg.orientation.w = q[3]

        imumsg.angular_velocity.x = msg.pitchRate
        imumsg.angular_velocity.y = msg.rollRate
        imumsg.angular_velocity.z = -msg.headingRate

        imu_pub.publish(imumsg)
    if use_odom == True:
        br = tf.TransformBroadcaster()
        q = quaternion_from_euler(
            msg.pitch, msg.roll,
            -np.unwrap(msg.heading - np.pi / 2))  # TODO check this

        rospy.logdebug("Publishing odom")
        odommsg = Odometry()
        odommsg.header = headermsg
        odommsg.header.frame_id = "odom"

        #TODO, USE TRANSFORM
        odommsg.child_frame_id = "base_link"
        odommsg.pose.pose.position.x = msg.y
        odommsg.pose.pose.position.y = msg.x
        odommsg.pose.pose.position.z = -msg.altitude
        odommsg.pose.pose.orientation.x = q[0]
        odommsg.pose.pose.orientation.y = q[1]
        odommsg.pose.pose.orientation.z = q[2]
        odommsg.pose.pose.orientation.w = q[3]

        odommsg.twist.twist.linear.x = msg.vy
        odommsg.twist.twist.linear.y = msg.vx
        odommsg.twist.twist.linear.z = -msg.vz
        odommsg.twist.twist.angular.x = msg.pitchRate
        odommsg.twist.twist.angular.y = msg.rollRate
        odommsg.twist.twist.angular.z = -msg.headingRate

        odom_pub.publish(odommsg)
        br.sendTransform((msg.y, msg.x, 0),
                         tf.transformations.quaternion_from_euler(
                             msg.pitch, msg.roll,
                             -np.unwrap(msg.heading - np.pi / 2)),
                         rospy.Time.now(), "base_link", "odom")
Пример #35
0
def talker():
    global global_g, deg_rad, Heading_HPD

    ser.flush()

    pub_m = rospy.Publisher('/imu/data_raw', Imu, queue_size=100)
    pub = rospy.Publisher('comb', comb, queue_size=100)
    pub_n = rospy.Publisher('comb_now', comb, queue_size=100)
    pub_g = rospy.Publisher('gps', comb, queue_size=100)
    pub_o = rospy.Publisher('/gps/fix', NavSatFix, queue_size=100)

    rospy.init_node('comb_node', anonymous=True)
    rate = rospy.Rate(100)  # 10hz

    imuMsg = Imu()
    combMsg = comb()
    gpsMsg = comb()
    gpsmeanMsg = NavSatFix()

    seq = 0

    while not rospy.is_shutdown():
        # $GTIMU,GPSWeek,GPSTime,GyroX,GyroY,GyroZ,AccX,AccY,AccZ,Tpr*cs<CR><LF>

        if ser.read() != '$':
            continue
        line0 = ser.readline()
        print line0
        cs = line0[-4:-2]
        print cs
        for s_tmp in line0[6:-8]:
            if s_tmp.isalpha():
                continue
        try:
            cs1 = int(cs, 16)
        except:
            continue
        cs2 = checksum(line0)
        print("cs1,cs2", cs1, cs2)
        if cs1 != cs2:
            continue
        if line0[0:5] == "GTIMU":
            line = line0.replace("GTIMU,", "")
            line = line.replace("\r\n", "")
            if "\x00" in line:
                continue
            if not string.find('*', line):
                continue
            line = line.replace("*", ",")

            words = string.split(line, ",")
            if len(words) != 10:
                continue

            GyroX = string.atof(words[2])
            GyroY = string.atof(words[3])
            GyroZ = string.atof(words[4])
            AccX = string.atof(words[5])
            AccY = string.atof(words[6])
            AccZ = string.atof(words[7])

            imuMsg.linear_acceleration.x = AccX * global_g
            imuMsg.linear_acceleration.y = AccY * global_g
            imuMsg.linear_acceleration.z = AccZ * global_g

            imuMsg.linear_acceleration_covariance[0] = 0.0001
            imuMsg.linear_acceleration_covariance[4] = 0.0001
            imuMsg.linear_acceleration_covariance[8] = 0.0001

            imuMsg.angular_velocity.x = GyroX * deg_rad
            imuMsg.angular_velocity.y = GyroY * deg_rad
            imuMsg.angular_velocity.z = GyroZ * deg_rad

            imuMsg.angular_velocity_covariance[0] = 0.0001
            imuMsg.angular_velocity_covariance[4] = 0.0001
            imuMsg.angular_velocity_covariance[8] = 0.0001

            q = quaternion_from_euler(0, 0, 0)
            imuMsg.orientation.x = q[0]
            imuMsg.orientation.y = q[1]
            imuMsg.orientation.z = q[2]
            imuMsg.orientation.w = q[3]
            imuMsg.header.stamp = rospy.Time.now()
            imuMsg.header.frame_id = 'imu'
            imuMsg.header.seq = seq

            seq = seq + 1
            pub_m.publish(imuMsg)
            rate.sleep()

        elif line0[0:5] == "GPFPD":
            line = line0.replace("GPFPD,", "")
            line = line.replace("\r\n", "")
            if ("\x00" in line):
                continue
            if (not string.find('*', line)):
                continue
            line = line.replace("*", ",")

            words = string.split(line, ",")
            if len(words) != 16:
                continue

            GPSWeek = string.atoi(words[0])
            GPSTime = string.atof(words[1])
            Heading = string.atof(words[2])
            Pitch = string.atof(words[3])
            Roll = string.atof(words[4])
            Latitude = string.atof(words[5])
            Longitude = string.atof(words[6])
            Altitude = string.atof(words[7])
            Ve = string.atof(words[8])
            Vn = string.atof(words[9])
            Vu = string.atof(words[10])
            Baseline = string.atof(words[11])
            NSV1 = string.atoi(words[12])
            NSV2 = string.atoi(words[13])
            Status = words[14]

            if Status == '03':
                Vne = math.sqrt(Vn * Vn + Ve * Ve)
                if (Vne > 0.3 and Ve < 0):
                    Heading = math.acos(Vn / Vne)
                else:
                    Heading = 2 * 3.141592658 - math.acos(Vn / Vne)

            combMsg.GPSWeek = GPSWeek
            combMsg.GPSTime = GPSTime
            combMsg.Heading = Heading
            combMsg.Pitch = Pitch
            combMsg.Roll = Roll
            combMsg.Latitude = Latitude
            combMsg.Longitude = Longitude
            combMsg.Altitude = Altitude
            combMsg.Ve = Ve
            combMsg.Vn = Vn
            combMsg.Vu = Vu
            combMsg.Baseline = Baseline
            combMsg.NSV1 = NSV1
            combMsg.NSV2 = NSV2
            combMsg.Status = Status
            combMsg.header.stamp = rospy.Time.now()
            combMsg.header.frame_id = 'gps'
            combMsg.header.seq = seq

            pub_n.publish(combMsg)
            print("pub comb_now")

            if Status == '03' or Status == '04' or Status == '05' or Status == '08' or Status == '0B':
                pub.publish(combMsg)
                print("pub comb")

            seq += 1
            rate.sleep()

            #$GPHPD, GPSWeek, GPSTime, Heading, Pitch, Track, Latitude, Longitude, Altitude, Ve , Vn, Vu,Baseline, NSV1, NSV2*cs<CR><LF>
        elif line0[0:5] == "GPHPD":
            line = line0.replace("GPHPD,", "")
            line = line.replace("\r\n", "")
            if ("\x00" in line):
                continue
            if (not string.find('*', line)):
                continue
            line = line.replace("*", ",")

            words = string.split(line, ",")
            if len(words) != 16:
                continue

            Status = words[14]

            GPSWeek = string.atoi(words[0])
            GPSTime = string.atof(words[1])
            Heading_HPD = string.atof(words[2])
            Heading_HPD = 360 - Heading_HPD
            Pitch = string.atof(words[3])
            Track = string.atof(words[4])
            Latitude = string.atof(words[5])
            Longitude = string.atof(words[6])
            Altitude = string.atof(words[7])
            Ve = string.atof(words[8])
            Vn = string.atof(words[9])
            Vu = string.atof(words[10])
            Baseline = string.atof(words[11])
            NSV1 = string.atoi(words[12])
            NSV2 = string.atoi(words[13])

            gpsMsg.GPSWeek = GPSWeek
            gpsMsg.GPSTime = GPSTime
            gpsMsg.Heading = Heading_HPD
            gpsMsg.Pitch = Pitch
            gpsMsg.Roll = Track
            gpsMsg.Latitude = Latitude
            gpsMsg.Longitude = Longitude
            gpsMsg.Altitude = Altitude
            gpsMsg.Ve = Ve
            gpsMsg.Vn = Vn
            gpsMsg.Vu = Vu
            gpsMsg.Baseline = Baseline
            gpsMsg.NSV1 = NSV1
            gpsMsg.NSV2 = NSV2
            gpsMsg.Status = Status
            gpsMsg.header.stamp = rospy.Time.now()
            gpsMsg.header.frame_id = 'gps'
            gpsMsg.header.seq = seq

            pub_g.publish(gpsMsg)
            print("pub gps")

            gpsmeanMsg.header.stamp = rospy.Time.now()
            gpsmeanMsg.header.frame_id = 'gps'
            gpsmeanMsg.header.seq = seq
            if Status == '05':
                gpsmeanMsg.status.status = 2
                covariance_xyz = 0.05**2
            elif Status == '03':
                gpsmeanMsg.status.status = 0
                covariance_xyz = 5**2
            else:
                gpsmeanMsg.status.status = -1
                covariance_xyz = 99999

            gpsmeanMsg.status.service = 1
            gpsmeanMsg.latitude = Latitude
            gpsmeanMsg.longitude = Longitude
            gpsmeanMsg.altitude = Latitude
            gpsmeanMsg.position_covariance = [
                covariance_xyz, 0, 0, 0, covariance_xyz, 0, 0, 0,
                covariance_xyz
            ]
            gpsmeanMsg.position_covariance_type = 3

            pub_o.publish(gpsmeanMsg)
            print("pub gps_mean")
            # try:
            #     utm_pos = geodesy.utm.fromLatLong(inspvax.latitude, inspvax.longitude)
            # except ValueError:
            #     # Probably coordinates out of range for UTM conversion.
            #     return
            #
            # gpsmeanMsg.pose.pose.position.x = utm_pos.easting
            # gpsmeanMsg.pose.pose.position.y = utm_pos.northing
            # gpsmeanMsg.pose.pose.position.z = Altitude
            # gpsmeanMsg.pose.pose.orientation.x = 1
            # gpsmeanMsg.pose.pose.orientation.y = 0
            # gpsmeanMsg.pose.pose.orientation.z = 0
            # gpsmeanMsg.pose.pose.orientation.w = 0
            # gpsmeanMsg.pose.covariance = {
            #                         2, 0, 0, 0, 0, 0,
            #                         0, 2, 0, 0, 0, 0,
            #                         0, 0, 25, 0, 0, 0,
            #                         0, 0, 0, 99999, 0, 0,
            #                         0, 0, 0, 0, 99999, 0,
            #                         0, 0, 0, 0, 0, 99999}
            #
            # gpsmeanMsg.header.frame_id = 'base_footprint'
            # gpsmeanMsg.header.stamp = gps_time
            #
            # if Status == '0A' or Status == '0B':
            #     pub_o.publish(gpsmeanMsg)
            #     print("pub gps_mean")

            seq += 1
            rate.sleep()
        else:
            continue
Пример #36
0
def talker():
	pubGPS = rospy.Publisher('poseGPS', NavSatFix, queue_size=1000)
	pubIMU = rospy.Publisher('imuBoat', Imu, queue_size=1000)
	pubTwist = rospy.Publisher('twistGPS', TwistWithCovarianceStamped, queue_size=1000)
	rospy.init_node('imugpspublisher', anonymous=True)
	rate = rospy.Rate(100) # 100hz
	while not rospy.is_shutdown():
		data = ser.readline()
		if data[0] == 'Z':
			data = data.replace("Z","").replace("\n","").replace("\r","")
			data_list = data.split(',')
			if len(data_list) == 4:
				try:
					##data_list structure: lat, lon, heading, vel 
					float_list = [float(i) for i in data_list]
					poseGPS = NavSatFix()
					poseGPS.header.frame_id = "world"
					poseGPS.header.stamp = rospy.Time.now()
					poseGPS.status.status = 0
					poseGPS.status.service = 1
					poseGPS.latitude = float_list[0]
					poseGPS.longitude = float_list[1]
					poseGPS.altitude = 0.0
					poseGPS.position_covariance = [3.24, 0, 0, 0, 3,24, 0, 0, 0, 0]
					poseGPS.position_covariance_type = 2
					pubGPS.publish(poseGPS)
					twistGPS = TwistWithCovarianceStamped()
					twistGPS.header = poseGPS.header
					twistGPS.twist.twist.linear.x = float_list[3]*knots*math.cos(latest_yaw)
					twistGPS.twist.twist.linear.y = float_list[3]*knots*math.sin(latest_yaw)
					twistGPS.twist.twist.linear.z = 0.0
					##angular data not used here
					twistGPS.twist.covariance = [0.01, 0.01, 0, 0, 0, 0]
					pubTwist.publish(twistGPS)
					log = "GPS Data: %f %f %f %f Publish at Time: %s" % (float_list[0], float_list[1], float_list[2], float_list[3], rospy.get_time())
				except: log = "GPS Data Error! Data :  %s" % data
			else:
				log = "GPS Data Error! Data :  %s" % data
			rospy.loginfo(log)
		elif data[0] == 'Y':
			data = data.replace("Y","").replace("\n","").replace("\r","")
			data_list = data.split(',')
			if len(data_list) == 9:
				try:
					##data_list structure: accel, magni, gyro
					float_list = [float(i) for i in data_list]
					imuData = Imu()
					imuData.header.frame_id = "base_link"
					imuData.header.stamp = rospy.Time.now()
					latest_yaw = float_list[3]
					##data form in yaw, pitch, roll
					quat = tf.transformations.quaternion_from_euler(float_list[3], float_list[4], float_list[5], 'rzyx')
					imuData.orientation.x = quat[0]
					imuData.orientation.y = quat[1]
					imuData.orientation.z = quat[2]
					imuData.orientation.w = quat[3]
					imuData.angular_velocity.x = math.radians(float_list[6]*gyro_scale)
					imuData.angular_velocity.y = math.radians(-float_list[7]*gyro_scale)
					imuData.angular_velocity.z = math.radians(-float_list[8]*gyro_scale)
					imuData.linear_acceleration.x = float_list[0]*accel_scale
					imuData.linear_acceleration.y = -float_list[1]*accel_scale
					imuData.linear_acceleration.z = -float_list[2]*accel_scale
					imuData.orientation_covariance = [1.5838e-6, 0, 0, 0, 1.49402e-6, 0, 0, 0, 1.88934e-6]
					imuData.angular_velocity_covariance = [7.84113e-7, 0, 0, 0, 5.89609e-7, 0, 0, 0, 6.20293e-7]
					imuData.linear_acceleration_covariance = [9.8492e-4, 0, 0, 0, 7.10809e-4, 0, 0, 0, 1.42516e-3]
					pubIMU.publish(imuData)
					log = "IMU Data: %f %f %f %f %f %f %f %f %f Publish at Time: %s" \
					% (imuData.linear_acceleration.x, imuData.linear_acceleration.y, imuData.linear_acceleration.z,
						float_list[3], float_list[4], float_list[5],
						imuData.angular_velocity.x, imuData.angular_velocity.y, imuData.angular_velocity.z, rospy.get_time())
				except: log = "IMU Data Error! Data :  %s" % data
			else: log = "Data Error! Data :  %s" % data
			rospy.loginfo(log)
		else:
			log = "Data Error or Message: %s" % data
			rospy.loginfo(log)
		rate.sleep()
Пример #37
0
    def code(self):
        micro = 1000000
        acc_l = False
        gyro = False
        orien = False
        quat = Quaternion()
        imuMsg = Imu()
        gpsMsg = NavSatFix()
        magMsg = MagneticField()
        #rate = rospy.Rate(1000)
        last = rospy.Time.now().to_sec()
        imuMsg.orientation_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]
        imuMsg.angular_velocity_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0.02]
        imuMsg.linear_acceleration_covariance = [
            0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2
        ]
        gpsMsg.position_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]
        while not rospy.is_shutdown():
            data_pix = ser1.read()
            if data_pix == ">":
                data_pix = ser1.readline()
                data_list = data_pix.split(",")
                #a=len(data_list)
                #print(a)
                #print(data_list)
                tipo = float(data_list[0])
                xx = float(data_list[2])
                yy = float(data_list[3])
                zz = float(data_list[4])
                if tipo == 1:  #ACCELEROMETER  (m/s^2 - X,Y,Z)
                    acc = True
                elif tipo == 2:  #MAGNETIC_FIELD (uT - X,Y,Z)
                    mag = True
                    magMsg.header.stamp = rospy.Time.now()
                    magMsg.header.frame_id = 'base_link'
                    magMsg.magnetic_field.x = xx / micro
                    magMsg.magnetic_field.y = yy / micro
                    magMsg.magnetic_field.z = zz / micro
                    self.pub_mag.publish(magMsg)
                elif tipo == 3:  #ORIENTATION (Yaw, Pitch, Roll)
                    orien = True
                    # orientation to ENU Right Hand
                    roll = -zz  #*3.14159/180
                    pitch = yy  #*3.18159/180
                    yaw = -xx + 90  #*3.14159/180
                    if yaw < -180:
                        yaw = yaw + 360
                    #q=tf.transformations.quaternion_from_euler(roll*3.14159/180,pitch*3.18159/180,yaw*3.14159/180)
                    #imuMsg.orientation = Quaternion(*q)
                    imuMsg.orientation.x = roll  #magnetometer
                    imuMsg.orientation.y = pitch
                    imuMsg.orientation.z = yaw
                    imuMsg.orientation.w = 0
                    #q=tf.transformations.quaternion_from_euler(zz*3.14159/180,yy*3.18159/180,xx*3.14159/180)'''
                    #quat.x = q[0] #magnetometer
                    #quat.y = q[1]
                    #quat.z = q[2]
                    #quat.w = q[3]
                elif tipo == 4:  #GYROSCOPE (rad/sec - X,Y,Z)
                    gyro = True
                    imuMsg.angular_velocity.x = xx  #gyro
                    imuMsg.angular_velocity.y = yy
                    imuMsg.angular_velocity.z = zz
                elif tipo == 5:  #LIGHT (SI lux)
                    lux = True
                elif tipo == 6:  #PRESSURE (hPa millibar)
                    press = True
                elif tipo == 7:  #DEVICE TEMPERATURE (C)
                    temp = True
                elif tipo == 8:  #PROXIMITY (Centimeters or 1,0)
                    prox = True
                elif tipo == 9:  #GRAVITY (m/s^2 - X,Y,Z)
                    grav = True
                elif tipo == 10:  #LINEAR_ACCELERATION (m/s^2 - X,Y,Z)
                    acc_l = True
                    imuMsg.linear_acceleration.x = xx  # tripe axis accelerator meter
                    imuMsg.linear_acceleration.y = yy
                    imuMsg.linear_acceleration.z = zz
                elif tipo == 11:  #ROTATION_VECTOR (Degrees - X,Y,Z)
                    rot = True
                elif tipo == 12:  #RELATIVE_HUMIDITY (%)
                    hum = True
                elif tipo == 13:  #AMBIENT_TEMPERATURE (C)
                    amb_temp = True
                elif tipo == 14:  #MAGNETIC_FIELD_UNCALIBRATED (uT - X,Y,Z)
                    mag_u = True
                elif tipo == 15:  #GAME_ROTATION_VECTOR (Degrees - X,Y,Z)
                    game_rot = True
                elif tipo == 16:  #GYROSCOPE_UNCALIBRATED (rad/sec - X,Y,Z)
                    gyro_u = True
                elif tipo == 17:  #SIGNIFICANT_MOTION (1,0)
                    sig_mot = True
                elif tipo == 97:  #AUDIO (Vol.)}
                    audio = True
                elif tipo == 98:  #GPS1 (Lat., Long., Alt.)
                    gps1 = True
                    gpsMsg.header.stamp = rospy.Time.now()
                    gpsMsg.header.frame_id = 'base_link'
                    gpsMsg.latitude = xx
                    gpsMsg.longitude = yy
                    gpsMsg.altitude = zz
                    gpsMsg.position_covariance_type = 0
                    gpsMsg.status.service = NavSatStatus.SERVICE_GPS
                    gpsMsg.status.status = NavSatStatus.STATUS_SBAS_FIX  #SOLO SAT--STATUS_GBAS_FIX ANTENA TIERRA
                    self.pub_navsatfix.publish(gpsMsg)
                elif tipo == 99:  #GPS2 (Bearing, Speed, Date/Time)
                    gps2 = True
                #print('tipo=',tipo,'x=',xx,'y=',yy,'z=',zz,rospy.Time.now().to_sec()-last)
                #rate.sleep()
                ## until the msg is complete
            if orien == True and acc_l == True and gyro == True:

                imuMsg.header.stamp = rospy.Time.now()
                imuMsg.header.frame_id = 'base_link'
                self.pub_imu.publish(imuMsg)
                acc_l = False
                gyro = False
                orien = False
Пример #38
0
def _publish_navsatfix(pub, msg):
    """
    Converts a MSG_POS_LLH SBP message to a NavSatFix message and publishes
    it on the provided publisher pub. Most of this code is borrowed from 
    https://github.com/ethz-asl/ethz_piksi_ros/tree/master/piksi_multi_rtk_ros
    """

    # Copyright (c) 2017, Autonomous Systems Lab & Robotic Systems Lab,
    # ETH Zurich
    # All rights reserved.

    # Redistribution and use in source and binary forms, with or without
    # modification, are permitted provided that the following conditions are
    # met:

    # 1. Redistributions of source code must retain the above copyright
    # notice, this list of conditions and the following disclaimer.

    # 2. Redistributions in binary form must reproduce the above copyright
    # notice, this list of conditions and the following disclaimer in the
    # documentation and/or other materials provided with the distribution.

    # 3. Neither the name of the Autonomous Systems Lab, ETH Zurich nor the
    # names of its contributors may be used to endorse or promote products
    # derived from this software without specific prior written permission.

    # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
    # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    # Convert standard deviation in mm to variance in m^2
    h_var = (msg.h_accuracy / 1000)**2
    v_var = (msg.h_accuracy / 1000)**2

    # Lower 3 bits define fix mode.
    fix_mode = msg.flags & 0b111

    if fix_mode == 0:  # Invalid mode
        navsat_status = NavSatStatus.STATUS_NO_FIX
    elif fix_mode == 1:
        navsat_status = NavSatStatus.STATUS_FIX
    elif fix_mode == 2:  # Not implemented
        navsat_status = NavSatStatus.STATUS_NO_FIX
    elif fix_mode == 3:
        navsat_status = NavSatStatus.STATUS_GBAS_FIX
    elif fix_mode == 4:
        navsat_status = NavSatStatus.STATUS_GBAS_FIX
    elif fix_mode == 5:  # Not implemented
        navsat_status = NavSatStatus.STATUS_NO_FIX
    elif fix_mode == 6:
        navsat_status = NavSatStatus.STATUS_SBAS_FIX
    else:  # Undefined modes
        navsat_status = NavSatStatus.STATUS_NO_FIX

    # Again, (almost) all copied from
    # http://github.com/ethz-asl/ethz_piksi_ros/tree/master/piksi_multi_rtk_ros
    navsatfix = NavSatFix()
    navsatfix.header.stamp = rospy.Time.now()
    navsatfix.header.frame_id = 'gps'
    navsatfix.position_covariance_type = NavSatFix.COVARIANCE_TYPE_APPROXIMATED
    navsatfix.status.service = NavSatStatus.SERVICE_GPS
    navsatfix.latitude = msg.lat
    navsatfix.longitude = msg.lon
    navsatfix.altitude = msg.height
    navsatfix.status.status = navsat_status
    navsatfix.position_covariance = [
        h_var,
        0,
        0,  # This I came up with
        0,
        h_var,
        0,  # myself. ethz_piksi_ros
        0,
        0,
        v_var
    ]  # uses a constant cov-matrix

    # Publish to ROS topic
    pub.publish(navsatfix)
Пример #39
0
    def navigation_handler(self, data):
        """ Rebroadcasts navigation data in the following formats:
        1) /odom => /base footprint transform (if enabled, as per REP 105)
        2) Odometry message, with parent/child IDs as in #1
        3) NavSatFix message, for systems which are knowledgeable about GPS stuff
        4) IMU messages
        """
        rospy.logdebug("Navigation received")
        # If we don't have a fix, don't publish anything...
        if self.nav_status.status == NavSatStatus.STATUS_NO_FIX:
            return
        
        orient = PyKDL.Rotation.RPY(RAD(data.roll), RAD(data.pitch), RAD(data.heading)).GetQuaternion()

        # UTM conversion
        (zone, easting, northing) = LLtoUTM(23, data.latitude, data.longitude)
        # Initialize starting point if we haven't yet
        # TODO: Do we want to follow UTexas' lead and reinit to a nonzero point within the same UTM grid?
        if not self.init and self.zero_start:
            self.origin.x = easting
            self.origin.y = northing
            self.init = True

        # Publish origin reference for others to know about
        p = Pose()
        p.position.x = self.origin.x
        p.position.y = self.origin.y
        self.pub_origin.publish(p)

        #
        # Odometry 
        # TODO: Work out these covariances properly from DOP
        #
        odom = Odometry()
        odom.header.stamp = rospy.Time.now()
        odom.header.frame_id = self.odom_frame
        odom.child_frame_id = self.base_frame
        odom.pose.pose.position.x = easting - self.origin.x
        odom.pose.pose.position.y = northing - self.origin.y
        odom.pose.pose.position.z = data.altitude
        odom.pose.pose.orientation = Quaternion(*orient)
        odom.pose.covariance = POSE_COVAR
        # Twist is relative to /vehicle frame
        odom.twist.twist.linear.x = data.speed
        odom.twist.twist.linear.y = 0
        odom.twist.twist.linear.z = -data.down_vel
        odom.twist.twist.angular.x = RAD(data.ang_rate_long)
        odom.twist.twist.angular.y = RAD(-data.ang_rate_trans)
        odom.twist.twist.angular.z = RAD(-data.ang_rate_down)
        odom.twist.covariance = TWIST_COVAR

        self.pub_odom.publish(odom)

        #
        # Odometry transform (if required)
        #
        if self.publish_tf:
            self.tf_broadcast.sendTransform(
                (odom.pose.pose.position.x, odom.pose.pose.position.y,
                 odom.pose.pose.position.z), Quaternion(*orient),
                 odom.header.stamp,odom.child_frame_id, odom.frame_id)

        # 
        # NavSatFix
        # TODO: Work out these covariances properly from DOP
        #
        navsat = NavSatFix()
        navsat.header.stamp = rospy.Time.now()
        navsat.header.frame_id = self.odom_frame
        navsat.status = self.nav_status

        navsat.latitude = data.latitude
        navsat.longitude = data.longitude
        navsat.altitude = data.altitude

        navsat.position_covariance = NAVSAT_COVAR
        navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_UNKNOWN
        
        self.pub_navsatfix.publish(navsat)
        
        #
        # IMU
        # TODO: Work out these covariances properly
        #
        imu = Imu()
        imu.header.stamp == rospy.Time.now()
        imu.header.frame_id = self.base_frame
      
        # Orientation
        imu.orientation = Quaternion(*orient)
        imu.orientation_covariance = IMU_ORIENT_COVAR
 
        # Angular rates
        imu.angular_velocity.x = RAD(data.ang_rate_long)
        imu.angular_velocity.y = RAD(-data.ang_rate_trans)
        imu.angular_velocity.y = RAD(-data.ang_rate_down)
        imu.angular_velocity_covariance = IMU_VEL_COVAR

        # Linear acceleration
        imu.linear_acceleration.x = data.long_accel
        imu.linear_acceleration.y = data.trans_accel
        imu.linear_acceleration.z = data.down_accel
        imu.linear_acceleration_covariance = IMU_ACCEL_COVAR

        self.pub_imu.publish(imu)
        
         
        pass
Пример #40
0
    def navigation_handler(self, data):
        """ Rebroadcasts navigation data in the following formats:
        1) /odom => /base footprint transform (if enabled, as per REP 105)
        2) Odometry message, with parent/child IDs as in #1
        3) NavSatFix message, for systems which are knowledgeable about GPS stuff
        4) IMU messages
        """
        rospy.logdebug("Navigation received")
        # If we don't have a fix, don't publish anything...
        # if self.nav_status.status == NavSatStatus.STATUS_NO_FIX:
        #     print 'no fix'
        #     return

        # Changing from NED from the Applanix to ENU in ROS
        # Roll is still roll, since it's WRT to the x axis of the vehicle
        # Pitch is -ve since axis goes the other way (+y to right vs left)
        # Yaw (or heading) in Applanix is clockwise starting with North
        # In ROS it's counterclockwise startin with East
        time_stat = TimeSync()
        time_stat.ros_time = rospy.Time.now()
        time_stat.gps_time = data.td
        self.pub_time.publish(time_stat)
        t1 = time_stat.ros_time.secs + time_stat.ros_time.nsecs / 1E9
        t2 = time_stat.gps_time.time1
        # print '{0:6f}'.format(t1 - t2)
        orient = PyKDL.Rotation.RPY(RAD(data.roll), RAD(-data.pitch),
                                    RAD(90 - data.heading)).GetQuaternion()

        # UTM conversion
        utm_pos = geodesy.utm.fromLatLong(data.latitude, data.longitude)
        # Initialize starting point if we haven't yet
        if not self.init and self.zero_start:
            self.origin.x = utm_pos.easting
            self.origin.y = utm_pos.northing
            self.origin.z = data.altitude
            self.init = True
            origin_param = {
                "east": self.origin.x,
                "north": self.origin.y,
                "alt": self.origin.z,
            }
            rospy.set_param('/gps_origin', origin_param)

        # Publish origin reference for others to know about
        p = Pose()
        p.position.x = self.origin.x
        p.position.y = self.origin.y
        p.position.z = self.origin.z
        self.pub_origin.publish(p)

        #
        # Odometry
        # TODO: Work out these covariances properly from DOP
        #
        odom = Odometry()
        odom.header.stamp = rospy.Time.now()
        odom.header.frame_id = self.odom_frame
        odom.child_frame_id = self.base_frame
        odom.pose.pose.position.x = utm_pos.easting - self.origin.x
        odom.pose.pose.position.y = utm_pos.northing - self.origin.y
        odom.pose.pose.position.z = data.altitude - self.origin.z
        odom.pose.pose.orientation = Quaternion(*orient)
        odom.pose.covariance = POSE_COVAR

        # Twist is relative to /reference frame or /vehicle frame and
        # NED to ENU conversion is needed here too
        odom.twist.twist.linear.x = data.east_vel
        odom.twist.twist.linear.y = data.north_vel
        odom.twist.twist.linear.z = -data.down_vel
        odom.twist.twist.angular.x = RAD(data.ang_rate_long)
        odom.twist.twist.angular.y = RAD(-data.ang_rate_trans)
        odom.twist.twist.angular.z = RAD(-data.ang_rate_down)
        odom.twist.covariance = TWIST_COVAR

        self.pub_odom.publish(odom)

        t_tf = odom.pose.pose.position.x, odom.pose.pose.position.y, odom.pose.pose.position.z
        q_tf = Quaternion(*orient).x, Quaternion(*orient).y, Quaternion(
            *orient).z, Quaternion(*orient).w
        #
        # Odometry transform (if required)
        #
        if self.publish_tf:
            self.tf_broadcast.sendTransform(t_tf, q_tf, odom.header.stamp,
                                            odom.child_frame_id,
                                            odom.header.frame_id)

        #
        # NavSatFix
        # TODO: Work out these covariances properly from DOP
        #
        navsat = NavSatFix()
        navsat.header.stamp = rospy.Time.now()
        navsat.header.frame_id = self.odom_frame
        navsat.status = self.nav_status

        navsat.latitude = data.latitude
        navsat.longitude = data.longitude
        navsat.altitude = data.altitude

        navsat.position_covariance = NAVSAT_COVAR
        navsat.position_covariance_type = NavSatFix.COVARIANCE_TYPE_UNKNOWN

        self.pub_navsatfix.publish(navsat)

        #
        # IMU
        # TODO: Work out these covariances properly
        #
        imu = Imu()
        imu.header.stamp = rospy.Time.now()
        imu.header.frame_id = self.base_frame

        # Orientation
        imu.orientation = Quaternion(*orient)
        imu.orientation_covariance = IMU_ORIENT_COVAR

        # Angular rates
        imu.angular_velocity.x = RAD(data.ang_rate_long)
        imu.angular_velocity.y = RAD(-data.ang_rate_trans)
        imu.angular_velocity.z = RAD(-data.ang_rate_down)
        imu.angular_velocity_covariance = IMU_VEL_COVAR

        # Linear acceleration
        imu.linear_acceleration.x = data.long_accel
        imu.linear_acceleration.y = data.trans_accel
        imu.linear_acceleration.z = data.down_accel
        imu.linear_acceleration_covariance = IMU_ACCEL_COVAR

        self.pub_imu.publish(imu)

        pass