###### tags: `控制組`
# IMU on rpi
參考 https://medium.com/@niru5/hands-on-with-rpi-and-mpu9250-part-3-232378fa6dbc
```
import os
import sys
import time
import smbus
from imusensor.MPU9250 import MPU9250
address = 0x68
bus = smbus.SMBus(1)
imu = MPU9250.MPU9250(bus, address)
imu.begin()
while True:
imu.readSensor()
imu.computeOrientation()
print ("Accel x: {0} ; Accel y : {1} ; Accel z : {2}".format(imu.AccelVals[0], imu.AccelVals[1], imu.AccelVals[2]))
print ("Gyro x: {0} ; Gyro y : {1} ; Gyro z : {2}".format(imu.GyroVals[0], imu.GyroVals[1], imu.GyroVals[2]))
print ("Mag x: {0} ; Mag y : {1} ; Mag z : {2}".format(imu.MagVals[0], imu.MagVals[1], imu.MagVals[2]))
print ("roll: {0} ; pitch : {1} ; yaw : {2}".format(imu.roll, imu.pitch, imu.yaw))
time.sleep(0.1)
```
加上濾波器
```
import os
import sys
import time
import smbus
from imusensor.MPU9250 import MPU9250
from imusensor.filters import madgwick
sensorfusion = madgwick.Madgwick(0.5)
address = 0x68
bus = smbus.SMBus(1)
imu = MPU9250.MPU9250(bus, address)
imu.begin()
imu.loadCalibDataFromFile("place_your_code_here.json")
currTime = time.time()
print_count = 0
while True:
imu.readSensor()
for i in range(10):
newTime = time.time()
dt = newTime - currTime
currTime = newTime
sensorfusion.updateRollPitchYaw(imu.AccelVals[0], imu.AccelVals[1], imu.AccelVals[2], imu.GyroVals[0], \
imu.GyroVals[1], imu.GyroVals[2], imu.MagVals[0], imu.MagVals[1], imu.MagVals[2], dt)
if print_count == 2:
print ("mad roll: {0} ; mad pitch : {1} ; mad yaw : {2}".format(sensorfusion.roll, sensorfusion.pitch, sensorfusion.yaw))
print_count = 0
print_count = print_count + 1
time.sleep(0.01)
```
包成ros
```
#!/usr/bin/env python3
import os
import sys
import time
import smbus
from imusensor.MPU9250 import MPU9250
from imusensor.filters import madgwick
import rospy
from std_msgs.msg import Float64MultiArray
def talker():
#initialization
sensorfusion = madgwick.Madgwick(0.5)
address = 0x68
bus = smbus.SMBus(1)
imu = MPU9250.MPU9250(bus, address)
imu.begin()
imu.caliberateGyro()
imu.caliberateAccelerometer()
currTime = time.time()
print_count = 0
#ros
pub = rospy.Publisher('imu_angle', Float64MultiArray, queue_size = 10)
rospy.init_node('talker', anonymous = True)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
imu.readSensor()
for i in range(10):
newTime = time.time()
dt = newTime - currTime
currTime = newTime
sensorfusion.updateRollPitchYaw(imu.AccelVals[0], imu.AccelVals[1], imu.AccelVals[2], imu.GyroVals[0], \
imu.GyroVals[1], imu.GyroVals[2], imu.MagVals[0], imu.MagVals[1], imu.MagVals[2], dt)
if print_count == 2:
arr = [sensorfusion.roll, sensorfusion.pitch, sensorfusion.yaw, imu.AccelVals[0], imu.AccelVals[1], imu.AccelVals[2]]
pub_imu = Float64MultiArray(data = arr)
pub.publish(pub_imu)
print_count = 0
print_count = print_count + 1
time.sleep(0.01)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
```