Exemplo n.º 1
0
    def _create_msg(self, data):
        """
        Messages published with ROS have axis from the robot frame : x forward, y ?, z up or down
        """
        msg1 = Imu()
        msg1_magfield = MagneticField()

        msg1.header.stamp = rospy.Time.now()
        msg1.header.frame_id = '/base_link'
        msg1_magfield.header.stamp = rospy.Time.now()
        msg1_magfield.header.frame_id = '/base_link'

        msg1.linear_acceleration.x = -data["IMU1"]["accel_y"]
        msg1.linear_acceleration.y = -data["IMU1"]["accel_z"]
        msg1.linear_acceleration.z = data["IMU1"]["accel_x"]
        msg1.linear_acceleration_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]

        msg1.angular_velocity.x = -data["IMU1"]["gyro_y"]
        msg1.angular_velocity.y = -data["IMU1"]["gyro_z"]
        msg1.angular_velocity.z = data["IMU1"]["gyro_x"]
        msg1.angular_velocity_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]

        msg1.orientation.w = 0
        msg1.orientation.x = 0
        msg1.orientation.y = 0
        msg1.orientation.z = 0
        msg1.orientation_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]

        msg1_magfield.magnetic_field.x = -data["IMU1"]["mag_y"]
        msg1_magfield.magnetic_field.y = -data["IMU1"]["mag_z"]
        msg1_magfield.magnetic_field.z = data["IMU1"]["mag_x"]

        msg2 = Imu()
        msg2_magfield = MagneticField()

        msg2.header.stamp = rospy.Time.now()
        msg2.header.frame_id = '/base_link'
        msg2_magfield.header.stamp = rospy.Time.now()
        msg2_magfield.header.frame_id = '/base_link'

        msg2.linear_acceleration.x = data["IMU2"]["accel_y"]
        msg2.linear_acceleration.y = data["IMU2"]["accel_z"]
        msg2.linear_acceleration.z = data["IMU2"]["accel_x"]
        msg2.linear_acceleration_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]

        msg2.angular_velocity.x = data["IMU2"]["gyro_y"]
        msg2.angular_velocity.y = data["IMU2"]["gyro_z"]
        msg2.angular_velocity.z = data["IMU2"]["gyro_x"]
        msg2.angular_velocity_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]

        msg2.orientation.w = 0
        msg2.orientation.x = 0
        msg2.orientation.y = 0
        msg2.orientation.z = 0
        msg2.orientation_covariance = [0, 0, 0, 0, 0, 0, 0, 0, 0]
        msg2_magfield.magnetic_field.x = data["IMU2"]["mag_y"]
        msg2_magfield.magnetic_field.y = data["IMU2"]["mag_z"]
        msg2_magfield.magnetic_field.z = data["IMU2"]["mag_x"]

        return msg1, msg1_magfield, msg2, msg2_magfield
Exemplo n.º 2
0
def write_ms25(ms25, i, bag):

    utime = ms25[i, 0]

    mag_x = ms25[i, 1]
    mag_y = ms25[i, 2]
    mag_z = ms25[i, 3]

    accel_x = ms25[i, 4]
    accel_y = ms25[i, 5]
    accel_z = ms25[i, 6]

    rot_r = ms25[i, 7]
    rot_p = ms25[i, 8]
    rot_h = ms25[i, 9]

    timestamp = microseconds_to_ros_timestamp(utime)

    rosimu = Imu()
    rosimu.header.stamp = timestamp
    rosimu.angular_velocity.x = float(rot_r)
    rosimu.angular_velocity.y = float(rot_p)
    rosimu.angular_velocity.z = float(rot_h)
    rosimu.linear_acceleration.x = float(accel_x)
    rosimu.linear_acceleration.y = float(accel_y)
    rosimu.linear_acceleration.z = float(accel_z)
    bag.write('/ms25_imu', rosimu, t=timestamp)

    rosmag = MagneticField()
    rosmag.header.stamp = timestamp
    rosmag.magnetic_field.x = mag_x
    rosmag.magnetic_field.y = mag_y
    rosmag.magnetic_field.z = mag_z
    bag.write('/ms25_mag', rosmag, t=timestamp)
Exemplo n.º 3
0
    def publish_data(self):

        data_pub = Imu()
        data_pub_mag = MagneticField()

        data_pub.header.stamp = rospy.get_rostime()
        data_pub_mag.header.stamp = rospy.get_rostime()

        #convert from g to m/s²
        data_pub.angular_velocity.x = gyro_xyz[0]* 0.0174532925  #gyros_x
        data_pub.angular_velocity.y = gyro_xyz[1]* 0.0174532925  #gyros_y
        data_pub.angular_velocity.z = gyro_xyz[2]* 0.0174532925  #gyros_z

        data_pub.angular_velocity_covariance[0] = 0

        #convert from deg/s to rad/s (pi/180 = 0.0174532925)
        data_pub.linear_acceleration.x = accel_xyz[0]*9.81 #accel_x
        data_pub.linear_acceleration.y = accel_xyz[1]*9.81#accel_y
        data_pub.linear_acceleration.z = accel_xyz[2]*9.81 #accel_z

        data_pub.linear_acceleration_covariance[0] = 0

        #convert from Guass to Tesla
        data_pub_mag.magnetic_field.x = magn_xyz[0]*0.0001 #accel_x
        data_pub_mag.magnetic_field.y = magn_xyz[1]*0.0001 #accel_y
        data_pub_mag.magnetic_field.z = magn_xyz[2]*0.0001 #accel_z

        data_pub_mag.magnetic_field_covariance[0] = 0 #variance unknown

        self.Imu_data_pub.publish(data_pub)
        self.Imu_data_mag.publish(data_pub_mag)
Exemplo n.º 4
0
def publisher():

    #    accel_x_sum = 0
    #    accel_y_sum = 0
    #    accel_z_sum = 0
    #    gyro_x_sum = 0
    #    gyro_y_sum = 0
    #    gyro_z_sum = 0
    #    for(int i = 0; i < 100; i++){
    #	accel = mpu9250.readAccel()
    #	gyro = mpu9250.readGyro()
    #	accel_x_sum += accel['y']
    #	accel_y_sum += accel['x']
    #	accel_z_sum += accel['z']
    #	gyro_x_sum += gyro['y']
    #	gyro_y_sum += gyro['x']
    #	gyro_z_sum += gyro['z']
    #    }
    #    accel_x_init = accel_x_sum / 100
    #    accel_y_init = accel_y_sum / 100
    #    accel_z_init = accel_z_sum / 100
    #    gyro_x_init = gyro_x_sum / 100
    #    gyro_y_init = gyro_y_sum / 100
    #    gyro_z_init = gyro_z_sum / 100

    pub_imu = rospy.Publisher('imu/data_raw', Imu, queue_size=5)
    pub_mag = rospy.Publisher('imu/mag', MagneticField, queue_size=5)
    rospy.init_node('imu_pub')
    imu = Imu()
    magnetic = MagneticField()

    mpu9250 = MPU9250()
    # change

    while not rospy.is_shutdown():

        accel = mpu9250.readAccel()
        gyro = mpu9250.readGyro()
        mag = mpu9250.readMagnet()

        imu.header.stamp = rospy.Time.now()
        imu.header.frame_id = 'base_link'
        imu.angular_velocity.x = (gyro['y']) * 0.07 * DPS_TO_RADS
        imu.angular_velocity.y = -(gyro['x']) * 0.07 * DPS_TO_RADS
        imu.angular_velocity.z = (gyro['z']) * 0.07 * DPS_TO_RADS

        imu.linear_acceleration.x = (accel['y']) * 9.8
        imu.linear_acceleration.y = -(accel['x']) * 9.8
        imu.linear_acceleration.z = (accel['z']) * 9.8
        #imu.linear_acceleration.x = 0

        magnetic.header.stamp = rospy.Time.now()
        magnetic.header.frame_id = 'base_link'
        magnetic.magnetic_field.x = mag['y']
        magnetic.magnetic_field.y = -mag['x']
        magnetic.magnetic_field.z = mag['z']

        pub_imu.publish(imu)
        pub_mag.publish(magnetic)
        rospy.sleep(0.01)
Exemplo n.º 5
0
    def publish_sensor_data(self, sensor_data):
        acc = np.array(sensor_data.acceleration.data) / 1000.0 * g
        ang_vel = np.array(sensor_data.angular_vel.data) / 180.0 * np.pi
        # ang_vel = rotate_v(ang_vel.tolist(), self.rotation)

        msg = Imu()
        msg.header.frame_id = self.base_frame_id
        msg.header.stamp = rospy.Time.now()
        msg.linear_acceleration = Vector3(*acc)
        # It happens that sensor_data.quaterion and pose.quaternion are NOT in the same frame
        q = sensor_data.quaternion.data
        q = [q[1], q[2], q[3], q[0]]
        msg.orientation = Quaternion(*q)
        # msg.orientation = Quaternion(*self.orientation)

        msg.angular_velocity = Vector3(*ang_vel)

        msg.linear_acceleration_covariance = self.linear_acceleration_cov
        msg.orientation_covariance = self.orientation_cov
        msg.angular_velocity_covariance = self.angular_velocity_cov
        self.imu_pub.publish(msg)

        mag = np.array(sensor_data.magnetic.data) * 1e-6
        m_msg = MagneticField()
        m_msg.header = msg.header
        m_msg.magnetic_field = Vector3(*mag)
        m_msg.magnetic_field_covariance = self.magnetic_field_cov
        self.mag_pub.publish(m_msg)
Exemplo n.º 6
0
    def publish(self, event):
        compass_accel = self.compass_accel.read()
        compass = compass_accel[1]
        Racc = compass_accel[0]
        gyro = self.gyro.read()
        GyroRate = gyro[0]

        GyroRate = [x * self.DEG_TO_RAD for x in GyroRate]

        #initial
        A_odd = [0, 0]
        AvgRate = [0, 0]
        A = [0, 0]
        Rgyro = [0, 0, 0]
        # normalized

        Racc_lengh = math.sqrt(Racc[0]**2 + Racc[1]**2 + Racc[2]**2)
        Racc_normalized = [x / Racc_lengh for x in Racc]
        A_odd[0] = math.atan2(self.Rest[1], self.Rest[2])
        A_odd[1] = math.atan2(self.Rest[0], self.Rest[2])

        for i in range(2):
            AvgRate[i] = (GyroRate[i] + self.GyroRate_odd[i]) / 2
            A[i] = A_odd[i] + AvgRate[i] * self.T

        Rgyro[0] = math.sin(A[1]) / math.sqrt(1 + ((math.cos(A[1]))**2) *
                                              ((math.tan(A[0]))**2))
        Rgyro[1] = math.sin(A[0]) / math.sqrt(1 + ((math.cos(A[0]))**2) *
                                              ((math.tan(A[1]))**2))

        if self.Rest[2] > 0:
            RzGyro_sign = 1
        else:
            RzGyro_sign = -1

        Rgyro[2] = RzGyro_sign * math.sqrt(1 - Rgyro[0]**2 - Rgyro[1]**2)

        for i in range(3):
            self.Rest[i] = (Racc_normalized[i] +
                            Rgyro[i] * self.wGyro) / (1 + self.wGyro)

        position_msg = Imu()

        position_msg.linear_acceleration.x = self.Rest[0]
        position_msg.linear_acceleration.y = self.Rest[1]
        position_msg.linear_acceleration.z = self.Rest[2]

        position_msg.header.frame_id = "cheng"
        self.pub_position.publish(position_msg)

        self.GyroRate_odd = GyroRate

        # Put together a magnetometer message
        mag_msg = MagneticField()
        mag_msg.header.stamp = rospy.Time.now()
        mag_msg.magnetic_field.x = compass[0]
        mag_msg.magnetic_field.y = compass[1]
        mag_msg.magnetic_field.z = compass[2]

        self.pub_mag.publish(mag_msg)
Exemplo n.º 7
0
def main():
	rospy.init_node('HMR2300_Publisher', anonymous = True)
	Mag_pub = rospy.Publisher('/imu/mag', MagneticField, queue_size=10)

	rate = rospy.Rate(2)

	mag_msg = MagneticField()
	mag_msg.header = Header()
	mag_msg.header.frame_id = '/Magnet'

	while not rospy.is_shutdown():	
		Yaw, Mag_X, Mag_Y, Mag_Z, secs, nsecs = receive()
		
		mag_msg.header.stamp.secs = secs
		mag_msg.header.stamp.nsecs = nsecs

		mag_msg.magnetic_field.x = 0
		mag_msg.magnetic_field.y = 0
		mag_msg.magnetic_field.z = Yaw

		mag_msg.magnetic_field_covariance[0] = Mag_X
		mag_msg.magnetic_field_covariance[1] = Mag_Y
		mag_msg.magnetic_field_covariance[2] = Mag_Z

		Mag_pub.publish(mag_msg)
		
		#print mag_msg

		rate.sleep()

	rospy.spin()
Exemplo n.º 8
0
    def __init__(self):
        self.dynamic_pub = rospy.Publisher("/imu/mag",
                                           MagneticField,
                                           queue_size=1)
        self.mag_vals_pub = rospy.Publisher("/comp_mag_values",
                                            mag_values,
                                            queue_size=1)

        magval = mag_values()

        rospy.Subscriber("/imu/mag_raw", MagneticField, self.min_max)

        self.corrected = [0, 0, 0]
        self.x_out = 0
        self.y_out = 0
        self.z_out = 0

        rate = rospy.Rate(60)

        while not rospy.is_shutdown():

            mag = MagneticField(header=Header(stamp=rospy.Time.now(),
                                              frame_id='base_link'),
                                magnetic_field=Vector3(self.corrected[0],
                                                       self.corrected[1],
                                                       self.corrected[2]),
                                magnetic_field_covariance=[
                                    0.000, 0.0, 0.0, 0.0, 0.000, 0.0, 0.0, 0.0,
                                    0.000
                                ])

            self.dynamic_pub.publish(mag)
            rate.sleep()
    def __init__(self):
        self.accel_mps2 = [0.0] * 3
        self.gyro_rps = [0.0] * 3
        self.mag_T = [0.0] * 3
        self.rpy_rad = [0.0] * 3
        self.timestamp_sec = 0.0
        self.linear_accel_covariance = 0.098 * 0.098
        self.angular_velocity_covariance = 0.012 * 0.012
        self.orientation_covariance = 0.035 * 0.035
        self.magnetic_field_covariance = 0.000002 * 0.000002

        self.publish_data = False
        self._MsgData = Imu()
        self._MsgPub = rospy.Publisher('/segway/feedback/imu',
                                       Imu,
                                       queue_size=10)
        self._MsgData.header.frame_id = 'imu_frame'
        self._seq = 0

        self._MagMsgData = MagneticField()
        self._MagMsgPub = rospy.Publisher('/segway/feedback/mag_feild',
                                          MagneticField,
                                          queue_size=10)
        self._MagMsgData.header.frame_id = 'imu_frame'
        self._Magseq = 0
Exemplo n.º 10
0
	def Broadcast_imu_raw(self,lineParts):
		partsCount = len(lineParts)

		if (partsCount == 11): # $IMUR,timestamp,ax,ay,az,gx,gy,gz,mx,my,mz
			pass
		try:
			time_now = rospy.Time.now()
			frame_id = "imu_base"
			acc_avel_raw = Imu()
			mag_raw = MagneticField()
			acc_avel_raw.header.stamp = time_now
			acc_avel_raw.header.frame_id = frame_id
			mag_raw.header.stamp = time_now
			mag_raw.header.frame_id = frame_id
			#acc_avel_raw.arduinoTime = int(lineParts[1])
			
			# shpuld be in m/s^2
			acc_avel_raw.linear_acceleration.x = float(lineParts[2])*9.81
			acc_avel_raw.linear_acceleration.y = float(lineParts[3])*9.81
			acc_avel_raw.linear_acceleration.z = float(lineParts[4])*9.81
			# should be in rad/sec
			acc_avel_raw.angular_velocity.x = math.radians(float(lineParts[5]))
			acc_avel_raw.angular_velocity.y = math.radians(float(lineParts[6]))
			acc_avel_raw.angular_velocity.z = math.radians(float(lineParts[7]))
			# shloud be in Teslas
			# if MPU9250 is used, magnetometer orientation mismatch should be corrected to maintain x from acc and gyro as forward
			mag_raw.magnetic_field.x = float(lineParts[9])e-7 # x of acc corresponds to y of mag
			mag_raw.magnetic_field.y = float(lineParts[8])e-7 # y of acc correspond to x of mag
			mag_raw.magnetic_field.z = -float(lineParts[10])e-7 # z of acc is opposite to z of mag

			self._acc_vel_pub.publish(acc_avel_raw)
			self._mag_pub.publish(mag_raw)
		except:
			rospy.logwarn("Unexpected error:" + str(sys.exc_info()[0]))	
Exemplo n.º 11
0
    def publishMag(self, mag, time):
        '''!
            Publica os dados de campo magnetico

            @param accel: float[3] - leituras do magnetometro
            @param time: float - momento em que a leitura foi realizada
        '''

        msg = MagneticField()

        msg.magnetic_field.x = mag[0] * 0.000001
        msg.magnetic_field.y = mag[1] * 0.000001
        msg.magnetic_field.z = mag[2] * 0.000001

        msg.magnetic_field_covariance = np.zeros((3, 3), dtype=np.float64)

        frameId = self.get_parameter(
            "frame_id").get_parameter_value().string_value
        msg.header.frame_id = frameId

        timeSec = float(time) / 1000.0
        msg.header.stamp.sec = int(timeSec)
        msg.header.stamp.nanosec = int((timeSec * 1000000000) % 1000000000)

        self.publisherMag.publish(msg)
def publishCustomMessage(imu_data, seq):
      imu_message = Imu()
      mgn_message = MagneticField()
      
      imu_message.header.seq = seq
      imu_message.header.frame_id = "IMU Message"
      imu_message.header.stamp = rospy.Time.now()
      
      mgn_message.header.stamp = rospy.Time.now()
      mgn_message.header.frame_id = "Magnetic field data"
      mgn_message.header.seq = seq
      
      imu_message.linear_acceleration.x = trimValue(imu_data['aclx'])
      imu_message.linear_acceleration.y = trimValue(imu_data['acly'])
      imu_message.linear_acceleration.z = trimValue(imu_data['aclz'])
      imu_message.orientation.w = imu_data['qw']
      imu_message.orientation.x = imu_data['qx']
      imu_message.orientation.y = imu_data['qy']
      imu_message.orientation.z = imu_data['qz']
      imu_message.angular_velocity.x = trimValue(imu_data['gyrx'])
      imu_message.angular_velocity.y = trimValue(imu_data['gyry'])
      imu_message.angular_velocity.z = trimValue(imu_data['gyrz'])
      
      mgn_message.magnetic_field.x = trimValue(imu_data['magx'])
      mgn_message.magnetic_field.y = trimValue(imu_data['magy'])
      mgn_message.magnetic_field.z = trimValue(imu_data['magz'])

# Publishing magnetic field data and IMU data
      imu_publisher = rospy.Publisher('sensor'+'/imu',Imu, queue_size = 5)
      mgn_publisher = rospy.Publisher('sensor'+'/mag', MagneticField, queue_size = 5)

      imu_publisher.publish(imu_message)
      mgn_publisher.publish(mgn_message)
def imu_publisher():
    global accl_x, accl_y, accl_z, gyro_x, gyro_y, gyro_z, comp_x, comp_y, comp_z
    rospy.init_node(
        'Imu_mpu9250_node', anonymous=False
    )  # if anonymous=True is to ensure that node is unique by adding random number in the end
    r = rospy.Rate(20.0)
    current_time = rospy.Time.now()
    curn_time = time.time()
    last_time = time.time()
    new_time = 0.0
    while not rospy.is_shutdown():
        current_time = rospy.Time.now()
        read_imu_raw_data()

        imu = Imu()
        imu.header.stamp = rospy.Time.now()
        imu.angular_velocity = Vector3(gyro_x, gyro_y, gyro_z)
        imu.linear_acceleration = Vector3(accl_x, accl_y, accl_z)
        imu_data_pub.publish(imu)

        mag = MagneticField()
        mag.header.stamp = current_time
        mag.header.frame_id = "imu/mag"
        mag.magnetic_field = Vector3(comp_x, comp_y, comp_z)
        imu_mag_pub.publish(mag)

        r.sleep()
Exemplo n.º 14
0
 def reset_vars(self):
     self.imu_msg = Imu()
     self.imu_msg.orientation_covariance = (-1., ) * 9
     self.imu_msg.angular_velocity_covariance = (-1., ) * 9
     self.imu_msg.linear_acceleration_covariance = (-1., ) * 9
     self.pub_imu = False
     self.pub_syncout_timeref = False
     self.raw_gps_msg = NavSatFix()
     self.pub_raw_gps = False
     self.pos_gps_msg = NavSatFix()
     self.pub_pos_gps = False
     self.vel_msg = TwistStamped()
     self.pub_vel = False
     self.mag_msg = MagneticField()
     self.mag_msg.magnetic_field_covariance = (0, ) * 9
     self.pub_mag = False
     self.temp_msg = Temperature()
     self.temp_msg.variance = 0.
     self.pub_temp = False
     self.press_msg = FluidPressure()
     self.press_msg.variance = 0.
     self.pub_press = False
     self.anin1_msg = UInt16()
     self.pub_anin1 = False
     self.anin2_msg = UInt16()
     self.pub_anin2 = False
     self.ecef_msg = PointStamped()
     self.pub_ecef = False
     self.pub_diag = False
Exemplo n.º 15
0
    def _log_data_log2(self, timestamp, data, logconf):
        """Callback froma the log API when data arrives"""
        msg = Temperature()
        # ToDo: it would be better to convert from timestamp to rospy time
        msg.header.stamp = rospy.Time.now()
        msg.header.frame_id = self.tf_prefix + "/base_link"
        # measured in degC
        msg.temperature = data["baro.temp"]
        self._pubTemp.publish(msg)

        # ToDo: it would be better to convert from timestamp to rospy time
        msg = MagneticField()
        msg.header.stamp = rospy.Time.now()
        msg.header.frame_id = self.tf_prefix + "/base_link"

        # measured in Tesla
        msg.magnetic_field.x = data["mag.x"]
        msg.magnetic_field.y = data["mag.y"]
        msg.magnetic_field.z = data["mag.z"]

        self._pubMag.publish(msg)

        msg = Float32()
        # hPa (=mbar)
        msg.data = data["baro.pressure"]
        self._pubPressure.publish(msg)

        # V
        msg.data = data["pm.vbat"]
        self._pubBattery.publish(msg)

        # Test
        msg.data = data["test.tval"]
        self._pubTest.publish(msg)
Exemplo n.º 16
0
def publish_mag_state_msg(publisher):
    mag_state_msg = MagneticField()
    mag_state_msg.header.stamp = rospy.get_rostime()
    mag_state_msg.magnetic_field.x = mag.GetMagRawData()[0]
    mag_state_msg.magnetic_field.y = mag.GetMagRawData()[1]
    mag_state_msg.magnetic_field.z = mag.GetMagRawData()[2]
    publisher.publish(mag_state_msg)
Exemplo n.º 17
0
def callback_mag(data):
	global mag_msg, geo_msg
	mag_msg = MagneticField()
	geo_msg.header = mag_msg.header

	mag_msg = data
	geo_msg.vector = mag_msg.magnetic_field
Exemplo n.º 18
0
    def __init__(self, i2c=None):
        super().__init__('rtf_lis3mdl')

        if i2c is None:
            self.i2c = busio.I2C(board.SCL, board.SDA)
        else:
            self.i2c = i2c

        self.lis = adafruit_lis3mdl.LIS3MDL(
            self.i2c)  # 155 Hz, 4 gauss, continuous
        self.lis.data_rate = adafruit_lis3mdl.Rate.RATE_155_HZ

        self.timer_mag = self.create_timer(1 / 100, self.callback)
        self.pub_mag = self.create_publisher(MagneticField, 'magnetic', 10)

        self.mags_bias = self.declare_parameter('mags_bias', [0., 0., 0.])

        frame_id = self.declare_parameter('frame_id', "base_imu_link").value

        self.mag_msg = MagneticField()
        self.mag_msg.header.frame_id = frame_id

        mc = 0.01
        self.mag_msg.magnetic_field_covariance = [
            mc, 0.0, 0.0, 0.0, mc, 0.0, 0.0, 0.0, mc
        ]

        self.calibrate = False
Exemplo n.º 19
0
    def pub_data(self, ax, ay, az, gx, gy, gz, mx, my, mz):
        self.processValues()
        imu_topic = Imu()
        mag_topic = MagneticField()

        #		self.rate = rospy.Rate(self.rate_hz)
        while not rospy.is_shutdown():
            self.processValues()

            imu_topic.header.stamp = rospy.Time.now()
            imu_topic.header.frame_id = "map"
            imu_topic.angular_velocity.x = self.gx
            imu_topic.angular_velocity.y = self.gy
            imu_topic.angular_velocity.z = self.gz
            imu_topic.linear_acceleration.x = self.ax
            imu_topic.linear_acceleration.y = self.ay
            imu_topic.linear_acceleration.z = self.az

            self.imu_raw_pub.publish(imu_topic)

            mag_topic.header.stamp = rospy.Time.now()
            mag_topic.header.frame_id = "map"
            mag_topic.magnetic_field.x = self.mx
            mag_topic.magnetic_field.y = self.my
            mag_topic.magnetic_field.z = self.mz

            self.mag_raw_pub.publish(mag_topic)

            self.rate.sleep()
Exemplo n.º 20
0
    def __init__(self, _threaded_mode = False):
        self.data_dir = "/tmp/BHG_DATA"
        self.csv_filename = "default_data.csv"
        self.datetimeData = ""
        self.is_recording = False
        self.rel_alt = Altitude()
        self.gps_fix = NavSatFix()
        self.odom = Odometry()
        self.imu_mag = MagneticField()
        self.imu_data = Imu()
        self.vel_gps = TwistStamped()
        self.temp_imu = Temperature()
        self.trigtime = "TrigTimeNotSet"
        self.arduino_dev = rospy.get_param('~arduino_dev', '/dev/ttyACM0') 
        self.arduino_timeout = rospy.get_param('~arduino_timeout', 2)
        self.ardunio_ser = ''

        self.pub = rospy.Publisher('trig_timer', String, queue_size=10)

        rospy.Subscriber('/directory', String, self.directory_callback)
        rospy.Subscriber("/record", Bool, self.record_callback)
        rospy.Subscriber("/mavros/altitude", Altitude, self.alt_cb) # change to /global_position/rel_alt Float64
        rospy.Subscriber("/mavros/global_position/global", NavSatFix, self.gps_cb)
        rospy.Subscriber("/mavros/global_position/local", Odometry, self.odom_cb) 
        rospy.Subscriber("/mavros/imu/mag", MagneticField, self.mag_cb)
        rospy.Subscriber("/mavros/imu/data", Imu, self.imu_cb)
        rospy.Subscriber("/mavros/global_position/raw/gps_vel", TwistStamped, self.vel_cb)
        rospy.Subscriber("/mavros/imu/temperature_imu", Temperature, self.temp_cb)
Exemplo n.º 21
0
    def publish(self, event):
        compass_accel = self.compass_accel.read()
        compass = compass_accel[0:3]
        accel = compass_accel[3:6]
        gyro = self.gyro.read()

        # Put together an IMU message
        imu_msg = Imu()
        imu_msg.header.stamp = rospy.Time.now()
        imu_msg.orientation_covariance[0] = -1
        imu_msg.angular_velocity = gyro[0] * DEG_TO_RAD
        imu_msg.angular_velocity = gyro[1] * DEG_TO_RAD
        imu_msg.angular_velocity = gyro[2] * DEG_TO_RAD
        imu_msg.linear_acceleration.x = accel[0] * G
        imu_msg.linear_acceleration.y = accel[1] * G
        imu_msg.linear_acceleration.z = accel[2] * G

        self.pub_imu.publish(imu_msg)

        # Put together a magnetometer message
        mag_msg = MagneticField()
        mag_msg.header.stamp = rospy.Time.now()
        mag_msg.magnetic_field.x = compass[0]
        mag_msg.magnetic_field.y = compass[1]
        mag_msg.magnetic_field.z = compass[2]

        self.pub_mag.publish(mag_msg)
Exemplo n.º 22
0
def do_parse(ext_type, ext_len, ext_data):
    # 将ext_data 封装成完整的数据帧
    ext_data.insert(0, ext_len)
    ext_data.insert(0, ext_type)
    ext_data.insert(0, 0xfa)
    ext_data.insert(0, 0xce)
    # CE FA 03 18    76 0E    5C 03 F0 FF 88 3C      E0 FF A2 00 84 00    00 A2 FF E0 00 84      F4 01     20 03
    # 根据数据帧的类型的类型来做对应的解析  0x01 线速度  0x02 电池
    if ext_type == 0x03:
        # 对数据进行拆包
        # 温度
        temperature = struct.unpack('h', bytearray(ext_data[4:6]))[0]

        # 加速度
        ax = struct.unpack('h', bytearray(ext_data[6:8]))[0]
        ay = struct.unpack('h', bytearray(ext_data[8:10]))[0]
        az = struct.unpack('h', bytearray(ext_data[10:12]))[0]
        # 角速度
        gx = struct.unpack('h', bytearray(ext_data[12:14]))[0]
        gy = struct.unpack('h', bytearray(ext_data[14:16]))[0]
        gz = struct.unpack('h', bytearray(ext_data[16:18]))[0]
        # 地磁
        mx = struct.unpack('h', bytearray(ext_data[18:20]))[0]
        my = struct.unpack('h', bytearray(ext_data[20:22]))[0]
        mz = struct.unpack('h', bytearray(ext_data[22:24]))[0]
        # 速度
        velocity = struct.unpack('h', bytearray(ext_data[24:26]))[0]
        angular = struct.unpack('h', bytearray(ext_data[26:28]))[0]

        # 发布陀螺仪的数据
        imu = Imu()
        # 根据芯片手册设定缩放系数
        accel_ratio = 1 / 16384.0
        imu.linear_acceleration.x = ax * accel_ratio
        imu.linear_acceleration.y = ay * accel_ratio
        imu.linear_acceleration.z = az * accel_ratio

        # °/s 转成弧度/s
        gyro_ratio = 1 / 65.5 / (180 / 3.1415926)
        imu.angular_velocity.x = gx * gyro_ratio
        imu.angular_velocity.y = gy * gyro_ratio
        imu.angular_velocity.z = gz * gyro_ratio

        imuPublisher.publish(imu)

        # 发布地磁的数据
        mag = MagneticField()
        mag.magnetic_field.x = mx
        mag.magnetic_field.y = my
        mag.magnetic_field.z = mz

        magPublisher.publish(mag)

        # print(velocity,angular)
        # 将小车当前的线速度和角速度发布出去
        twist = Twist()
        twist.linear.x = velocity / 1000.0
        twist.angular.z = angular / 1000.0
        velPublisher.publish(twist)
Exemplo n.º 23
0
def main():
    rospy.init_node("imu")

    port = rospy.get_param("~port", "GPG3_AD1")
    sensor = InertialMeasurementUnit(bus=port)

    pub_imu = rospy.Publisher("~imu", Imu, queue_size=10)
    pub_temp = rospy.Publisher("~temp", Temperature, queue_size=10)
    pub_magn = rospy.Publisher("~magnetometer", MagneticField, queue_size=10)

    br = TransformBroadcaster()

    msg_imu = Imu()
    msg_temp = Temperature()
    msg_magn = MagneticField()
    hdr = Header(stamp=rospy.Time.now(), frame_id="IMU")

    rate = rospy.Rate(rospy.get_param('~hz', 30))
    while not rospy.is_shutdown():
        q = sensor.read_quaternion()  # x,y,z,w
        mag = sensor.read_magnetometer()  # micro Tesla (µT)
        gyro = sensor.read_gyroscope()  # deg/second
        accel = sensor.read_accelerometer()  # m/s²
        temp = sensor.read_temperature()  # °C

        msg_imu.header = hdr

        hdr.stamp = rospy.Time.now()

        msg_temp.header = hdr
        msg_temp.temperature = temp
        pub_temp.publish(msg_temp)

        msg_imu.header = hdr
        msg_imu.linear_acceleration.x = accel[0]
        msg_imu.linear_acceleration.y = accel[1]
        msg_imu.linear_acceleration.z = accel[2]
        msg_imu.angular_velocity.x = math.radians(gyro[0])
        msg_imu.angular_velocity.y = math.radians(gyro[1])
        msg_imu.angular_velocity.z = math.radians(gyro[2])
        msg_imu.orientation.w = q[3]
        msg_imu.orientation.x = q[0]
        msg_imu.orientation.y = q[1]
        msg_imu.orientation.z = q[2]
        pub_imu.publish(msg_imu)

        msg_magn.header = hdr
        msg_magn.magnetic_field.x = mag[0] * 1e-6
        msg_magn.magnetic_field.y = mag[1] * 1e-6
        msg_magn.magnetic_field.z = mag[2] * 1e-6
        pub_magn.publish(msg_magn)

        transform = TransformStamped(header=Header(stamp=rospy.Time.now(),
                                                   frame_id="world"),
                                     child_frame_id="IMU")
        transform.transform.rotation = msg_imu.orientation
        br.sendTransformMessage(transform)

        rate.sleep()
def main():
    rospy.init_node('imu_rawdata_publisher', anonymous=True)
    rate = rospy.Rate(100)  # 5hz
    rospy.loginfo("In main function")
    pubs_imu = rospy.Publisher('/imu/data_raw', Imu, queue_size=15)
    pubs_magnetometer = rospy.Publisher('/imu/mag',
                                        MagneticField,
                                        queue_size=15)
    imu_read = Imu()
    magnetometer_read = MagneticField()
    gyro_x, gyro_y, gyro_z, count = 0, 0, 0, 0

    while not rospy.is_shutdown():
        mpu = mpu6050(0x68)
        accel_data = mpu.get_accel_data()
        gyro_data = mpu.get_gyro_data()

        imu_read.header.stamp = rospy.Time.now()
        imu_read.header.frame_id = "body_frame"

        ### Accelerometer data
        imu_read.linear_acceleration.x = accel_data['x']
        imu_read.linear_acceleration.y = accel_data['y']
        imu_read.linear_acceleration.z = accel_data['z']

        #### Gyrometer data
        gyro_x = gyro_data['x'] * (pi / 180)
        gyro_y = gyro_data['y'] * (pi / 180)
        gyro_z = gyro_data['z'] * (pi / 180)

        if abs(gyro_x) < 0.2:
            imu_read.angular_velocity.x = 0.0
        else:
            imu_read.angular_velocity.x = gyro_x

        if abs(gyro_y) < 0.2:
            imu_read.angular_velocity.y = 0.0
        else:
            imu_read.angular_velocity.y = gyro_y

        if abs(gyro_z) < 0.2:
            imu_read.angular_velocity.z = 0.0
        else:
            imu_read.angular_velocity.z = gyro_z
        '''##### Magnetometer data
		magnetometer_read.header.stamp = rospy.Time.now();
		magnetometer_read.header.frame_id = "body_frame";
		magnetometer_read.magnetic_field.x = 
		magnetometer_read.magnetic_field.y = 
		magnetometer_read.magnetic_field.z = '''

        pubs_imu.publish(imu_read)
        #pubs_magnetometer.publish(magnetometer_read)

        rate.sleep()

    rate.sleep()
    rospy.loginfo("Node is shutting down")
Exemplo n.º 25
0
    def __init__(self):
        self._pub_imu = rospy.Publisher(self.IMU_DEST_TOPIC_QUAT, Imu, queue_size=50)
        self._pub_mag = rospy.Publisher(self.IMU_DEST_TOPIC_MAG, MagneticField, queue_size=50)

        self._current_imu_msg = Imu()
        self._current_mag_msg = MagneticField()

        self._serial_port = None
        self._serial = None
Exemplo n.º 26
0
    def _send_mag(self, now, x, y, z):
        mag_msg = MagneticField()
        mag_msg.header.stamp = now
        mag_msg.header.frame_id = self._tf_prefix + '/imu_link'

        mag_msg.magnetic_field.x = x
        mag_msg.magnetic_field.y = y
        mag_msg.magnetic_field.z = z

        self._mag_pub.publish(mag_msg)
Exemplo n.º 27
0
    def _publish_current_msg(self):
        self._current_imu_msg.header.stamp = rospy.Time.now()
        self._current_mag_msg.header.stamp = rospy.Time.now()
        self._current_imu_msg.header.frame_id = "imu_link"
        self._current_mag_msg.header.frame_id = "imu_link"

        self._pub_imu.publish(self._current_imu_msg)
        self._current_imu_msg = Imu()
        self._pub_mag.publish(self._current_mag_msg)
        self._current_mag_msg = MagneticField()
Exemplo n.º 28
0
def get_mag(imu_raw):
    mag_out = MagneticField()
    mag_out.header.stamp=rospy.Time.now()
    
    mag=Vector3()
    mag.x = float(imu_raw[4])
    mag.y = float(imu_raw[5])
    mag.z = float(imu_raw[6])
    mag_out.magnetic_field=mag
    return mag_out
Exemplo n.º 29
0
def imu_pub():
    rate = rospy.Rate(100)
    no_covariance_matrix = (0, 0, 0, 0, 0, 0, 0, 0, 0)
    unknown_matrix = (-1, 0, 0, 0, 0, 0, 0, 0, 0)
    unknown_quat = Quaternion(0, 0, 0, 0)

    yaw = 0

    imu = navio.mpu9250.MPU9250()
    if imu.testConnection():
        print "Connection OK"
    else:
        sys.exit("Connection failed")

    accel_gyro_pub = rospy.Publisher("imu/data_raw", Imu)
    mag_pub = rospy.Publisher("imu/mag", MagneticField)
    yaw_pub = rospy.Publisher("yaw", Yaw)

    imu.initialize()

    rospy.sleep(1.0)

    last_time = rospy.get_time()

    while not rospy.is_shutdown():
        m9a, m9g, m9m = imu.getMotion9()

        m9m_corrected = (
            m9m[1], m9m[0], -m9m[2]
        )  # the magnetometer is oriented differently in the package

        accel_vec = Vector3(*m9a)
        angvel_vec = Vector3(-m9g[0], -m9g[1], m9g[2])
        mag_vec = Vector3(*m9m_corrected)

        accel_gyro_header = std_msgs.msg.Header()
        accel_gyro_header.stamp = rospy.Time.now()
        accel_gyro_header.frame_id = "base_link"

        mag_header = std_msgs.msg.Header()
        mag_header.stamp = rospy.Time.now()
        mag_header.frame_id = "base_link"

        current_time = rospy.get_time()
        yaw -= m9g[2] * (current_time - last_time)
        last_time = current_time

        accel_gyro_pub.publish(
            Imu(accel_gyro_header, unknown_quat, unknown_matrix, angvel_vec,
                no_covariance_matrix, accel_vec, no_covariance_matrix))
        mag_pub.publish(
            MagneticField(mag_header, mag_vec, no_covariance_matrix))
        yaw_pub.publish(Yaw(yaw))

        rate.sleep()
Exemplo n.º 30
0
def unbatchMagneticField(msg):
    nbFrames = len(msg.stamps)
    for i in range(nbFrames):
        m = MagneticField()
        m.header.seq = nbFrames * msg.header.seq + i
        m.header.frame_id = msg.header.frame_id
        m.header.stamp = msg.stamps[i]
        m.magnetic_field.x = msg.magnetic_fields[i].x
        m.magnetic_field.y = msg.magnetic_fields[i].y
        m.magnetic_field.z = msg.magnetic_fields[i].z
        yield m