|
@@ -1,6 +1,5 @@
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
-import smbus
|
|
|
import rospy
|
|
|
import string
|
|
|
import math
|
|
@@ -11,6 +10,7 @@ from tf.transformations import quaternion_from_euler
|
|
|
from dynamic_reconfigure.server import Server
|
|
|
from rasp_imu_hat_6dof.cfg import imuConfig
|
|
|
from sensor_msgs.msg import Imu
|
|
|
+from imu_data import MyIMU
|
|
|
|
|
|
|
|
|
degrees2rad = math.pi/180.0
|
|
@@ -23,7 +23,6 @@ def reconfig_callback(config, level):
|
|
|
rospy.loginfo("Set imu_yaw_calibration to %d" % (imu_yaw_calibration))
|
|
|
return config
|
|
|
|
|
|
-
|
|
|
rospy.init_node("imu_node")
|
|
|
|
|
|
#Get DIY param
|
|
@@ -71,53 +70,6 @@ imuMsg.linear_acceleration_covariance = [
|
|
|
seq=0
|
|
|
accel_factor = 9.806/256.0 # sensor reports accel as 256.0 = 1G (9.8m/s^2). Convert to m/s^2.
|
|
|
|
|
|
-class MyIMU(object):
|
|
|
- def __init__(self, addr):
|
|
|
- self.addr = addr
|
|
|
- self.i2c = smbus.SMBus(1)
|
|
|
-
|
|
|
- def get_YPRAG(self):
|
|
|
- try:
|
|
|
- roll_tmp = self.i2c.read_i2c_block_data(self.addr, 0x3d, 2)
|
|
|
- pitch_tmp = self.i2c.read_i2c_block_data(self.addr, 0x3e, 2)
|
|
|
- yaw_tmp = self.i2c.read_i2c_block_data(self.addr, 0x3f, 2)
|
|
|
-
|
|
|
- ax_tmp = self.i2c.read_i2c_block_data(self.addr, 0x34, 2)
|
|
|
- ay_tmp = self.i2c.read_i2c_block_data(self.addr, 0x35, 2)
|
|
|
- az_tmp = self.i2c.read_i2c_block_data(self.addr, 0x36, 2)
|
|
|
-
|
|
|
- gx_tmp = self.i2c.read_i2c_block_data(self.addr, 0x37, 2)
|
|
|
- gy_tmp = self.i2c.read_i2c_block_data(self.addr, 0x38, 2)
|
|
|
- gz_tmp = self.i2c.read_i2c_block_data(self.addr, 0x39, 2)
|
|
|
- except IOError:
|
|
|
- rospy.logerr("Read IMU YPRAG date error !")
|
|
|
- else:
|
|
|
- self.raw_roll = float(((roll_tmp[1]<<8) |roll_tmp[0])/32768.0*180.0)
|
|
|
- self.raw_pitch = float(((pitch_tmp[1]<<8)|pitch_tmp[0])/32768.0*180.0)
|
|
|
- self.raw_yaw = (yaw_tmp[1] << 8 | yaw_tmp[0])/32768.0*180
|
|
|
-
|
|
|
- self.raw_ax = float(((ax_tmp[1]<<8)|ax_tmp[0])/32768.0*16.0)
|
|
|
- self.raw_ay = float(((ay_tmp[1]<<8)|ay_tmp[0])/32768.0*16.0)
|
|
|
- self.raw_az = float(((az_tmp[1]<<8)|az_tmp[0])/32768.0*16.0)
|
|
|
-
|
|
|
- self.raw_gx = float(((gx_tmp[1]<<8)|gx_tmp[0])/32768.0*2000.0)
|
|
|
- self.raw_gy = float(((gy_tmp[1]<<8)|gy_tmp[0])/32768.0*2000.0)
|
|
|
- self.raw_gz = float(((gz_tmp[1]<<8)|gz_tmp[0])/32768.0*2000.0)
|
|
|
-
|
|
|
- def get_quatern(self):
|
|
|
- try:
|
|
|
- q0 = self.i2c.read_i2c_block_data(self.addr, 0x51, 2)
|
|
|
- q1 = self.i2c.read_i2c_block_data(self.addr, 0x52, 2)
|
|
|
- q2 = self.i2c.read_i2c_block_data(self.addr, 0x53, 2)
|
|
|
- q3 = self.i2c.read_i2c_block_data(self.addr, 0x54, 2)
|
|
|
- except IOError:
|
|
|
- rospy.logerr("Read IMU quaternion date error !")
|
|
|
- else:
|
|
|
- self.raw_q0 = float(((q0[1]<<8)|q0[0])/32768.0)
|
|
|
- self.raw_q1 = float(((q1[1]<<8)|q1[0])/32768.0)
|
|
|
- self.raw_q2 = float(((q2[1]<<8)|q2[0])/32768.0)
|
|
|
- self.raw_q3 = float(((q3[1]<<8)|q3[0])/32768.0)
|
|
|
-
|
|
|
|
|
|
myIMU = MyIMU(0x50)
|
|
|
rate = rospy.Rate(pub_hz)
|
|
@@ -132,8 +84,6 @@ while not rospy.is_shutdown():
|
|
|
|
|
|
#rospy.loginfo("yaw_deg: %f", yaw_deg)
|
|
|
yaw = yaw_deg*degrees2rad
|
|
|
-
|
|
|
- #in AHRS firmware y axis points right, in ROS y axis points left (see REP 103)
|
|
|
pitch = float(myIMU.raw_pitch)*degrees2rad
|
|
|
roll = float(myIMU.raw_roll)*degrees2rad
|
|
|
#rospy.loginfo("yaw:%f pitch:%f rool:%f", yaw, pitch, roll)
|
|
@@ -147,16 +97,23 @@ while not rospy.is_shutdown():
|
|
|
imuMsg.angular_velocity.y = float(myIMU.raw_gy)*degrees2rad
|
|
|
imuMsg.angular_velocity.z = float(myIMU.raw_gz)*degrees2rad
|
|
|
|
|
|
- #myIMU.get_quatern()
|
|
|
- q = quaternion_from_euler(roll, pitch, yaw)
|
|
|
- imuMsg.orientation.x = q[0]
|
|
|
- imuMsg.orientation.y = q[1]
|
|
|
- imuMsg.orientation.z = q[2]
|
|
|
- imuMsg.orientation.w = q[3]
|
|
|
+ myIMU.get_quatern()
|
|
|
+ imuMsg.orientation.x = myIMU.raw_q1
|
|
|
+ imuMsg.orientation.y = myIMU.raw_q2
|
|
|
+ imuMsg.orientation.z = myIMU.raw_q3
|
|
|
+ imuMsg.orientation.w = myIMU.raw_q0
|
|
|
+
|
|
|
+ #q = quaternion_from_euler(roll, pitch, yaw)
|
|
|
+ #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 = link_name
|
|
|
imuMsg.header.seq = seq
|
|
|
pub.publish(imuMsg)
|
|
|
+
|
|
|
seq = seq + 1
|
|
|
rate.sleep()
|
|
|
|