Modifying Arduino IDE code with rosserial to export IMU data
So I have been trying to export the IMU data from a sparkfun 9dof imu off Arduino IDE for a couple days now and having no luck with the rosserial section of the code. Below will be the arduino IDE code that gathers the raw imu data. My question is there any documentation on getting this working or an outline of what I need to do because I am hitting a wall. Thank you!
#
#include "ICM_20948.h" // Click here to get the library: http://librarymanager/All#SparkFun_ICM_20948_IMU
#include <ros.h>
#include <std_msg
//#define USE_SPI // Uncomment this to use SPI
#define SERIAL_PORT Serial
#define SPI_PORT SPI // Your desired SPI port. Used only when "USE_SPI" is defined
#define CS_PIN 2 // Which pin you connect CS to. Used only when "USE_SPI" is defined
#define WIRE_PORT Wire // Your desired Wire port. Used when "USE_SPI" is not defined
#define AD0_VAL 1 // The value of the last bit of the I2C address. \
// On the SparkFun 9DoF IMU breakout the default is 1, and when \
// the ADR jumper is closed the value becomes 0
#ifdef USE_SPI
ICM_20948_SPI myICM; // If using SPI create an ICM_20948_SPI object
#else
ICM_20948_I2C myICM; // Otherwise create an ICM_20948_I2C object
#endif
void setup()
{
SERIAL_PORT.begin(115200);
while (!SERIAL_PORT)
{
};
#ifdef USE_SPI
SPI_PORT.begin();
#else
WIRE_PORT.begin();
WIRE_PORT.setClock(400000);
#endif
//myICM.enableDebugging(); // Uncomment this line to enable helpful debug messages on Serial
bool initialized = false;
while (!initialized)
{
#ifdef USE_SPI
myICM.begin(CS_PIN, SPI_PORT);
#else
myICM.begin(WIRE_PORT, AD0_VAL);
#endif
SERIAL_PORT.print(F("Initialization of the sensor returned: "));
SERIAL_PORT.println(myICM.statusString());
if (myICM.status != ICM_20948_Stat_Ok)
{
SERIAL_PORT.println("Trying again...");
delay(500);
}
else
{
initialized = true;
}
}
}
void loop()
{
if (myICM.dataReady())
{
myICM.getAGMT(); // The values are only updated when you call 'getAGMT'
// printRawAGMT( myICM.agmt ); // Uncomment this to see the raw values, taken directly from the agmt structure
printScaledAGMT(&myICM); // This function takes into account the scale settings from when the measurement was made to calculate the values with units
delay(30);
}
else
{
SERIAL_PORT.println("Waiting for data");
delay(500);
}
}
// Below here are some helper functions to print the data nicely!
void printPaddedInt16b(int16_t val)
{
if (val > 0)
{
SERIAL_PORT.print(" ");
if (val < 10000)
{
SERIAL_PORT.print("0");
}
if (val < 1000)
{
SERIAL_PORT.print("0");
}
if (val < 100)
{
SERIAL_PORT.print("0");
}
if (val < 10)
{
SERIAL_PORT.print("0");
}
}
else
{
SERIAL_PORT.print("-");
if (abs(val) < 10000)
{
SERIAL_PORT.print("0");
}
if (abs(val) < 1000)
{
SERIAL_PORT.print("0");
}
if (abs(val) < 100)
{
SERIAL_PORT.print("0");
}
if (abs(val) < 10)
{
SERIAL_PORT.print("0");
}
}
SERIAL_PORT.print(abs(val));
}
void printRawAGMT(ICM_20948_AGMT_t agmt)
{
SERIAL_PORT.print("RAW. Acc [ ");
printPaddedInt16b(agmt.acc.axes.x);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.acc.axes.y);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.acc.axes.z);
SERIAL_PORT.print(" ], Gyr [ ");
printPaddedInt16b(agmt.gyr.axes.x);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.gyr.axes.y);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.gyr.axes.z);
SERIAL_PORT.print(" ], Mag [ ");
printPaddedInt16b(agmt.mag.axes.x);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.mag.axes.y);
SERIAL_PORT.print(", ");
printPaddedInt16b(agmt.mag.axes.z);
SERIAL_PORT.print(" ], Tmp [ ");
printPaddedInt16b(agmt.tmp.val);
SERIAL_PORT ...
I'm confused: you say you're using
rosserial
, but I don't see a publisher nor subscriber anywhere, and you're usingSERIAL_PORT.print(..)
. You cannot use the serial port directly when usingrosserial
, unless you have configured eitherrosserial
orSerial
to use a different serial port than the default.And just to make sure: you've seen and completed the rosserial tutorials?