|
@@ -0,0 +1,153 @@
|
|
|
|
+#include "imu_data.h"
|
|
|
|
+#include <ros/ros.h>
|
|
|
|
+#include <unistd.h>
|
|
|
|
+#include <fcntl.h>
|
|
|
|
+#include <stdio.h>
|
|
|
|
+#include <linux/i2c-dev.h>
|
|
|
|
+#include <sys/ioctl.h>
|
|
|
|
+
|
|
|
|
+int myIMU::initIICDevice()
|
|
|
|
+{
|
|
|
|
+ int fd;
|
|
|
|
+ fd = open("/dev/i2c-1", O_RDWR);
|
|
|
|
+ if(fd < 0)
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Open IIC device error !");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ iicFD = fd;
|
|
|
|
+ ROS_INFO("init iicFD = %d", iicFD);
|
|
|
|
+ if(ioctl(fd, I2C_SLAVE, I2C_DEV_ADDR) < 0)
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("IIC device ioctl error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getAccXData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ ROS_INFO("iicFD = %d", iicFD);
|
|
|
|
+
|
|
|
|
+ if(read(iicFD, &accX, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)accX[1]<<8)|accX[0])/32768.0*16.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read accX data error !");
|
|
|
|
+ }
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getAccYData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &accY, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)accY[1]<<8)|accY[0])/32768.0*16.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read accY data error !");
|
|
|
|
+ }
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getAccZData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &accZ, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)accZ[1]<<8)|accZ[0])/32768.0*16.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read accZ data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getGyoXData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &gyoX, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)gyoX[1]<<8)|gyoX[0])/32768.0*2000.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read gyoX data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getGyoYData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &gyoY, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)gyoY[1]<<8)|gyoY[0])/32768.0*2000.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read gyoY data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getGyoZData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &gyoZ, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)gyoZ[1]<<8)|gyoZ[0])/32768.0*2000.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read gyoZ register data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getRollData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &roll, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)roll[1]<<8)|roll[0])/32768.0*180.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read roll register data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getPitchData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &pitch, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)pitch[1]<<8)|pitch[0])/32768.0*180.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read pitch register data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+float myIMU::getYawData()
|
|
|
|
+{
|
|
|
|
+ float data = 0;
|
|
|
|
+ if(read(iicFD, &yaw, 2))
|
|
|
|
+ {
|
|
|
|
+ data = (((short)yaw[1]<<8)|yaw[0])/32768.0*180.0;
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ ROS_ERROR_STREAM("Read yaw register data error !");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return data;
|
|
|
|
+}
|
|
|
|
+
|