Retrieves data from LSM6DSL sensors, filters and send to ROS
Dependencies: LSM6DSL kalman ros_lib_kinetic
main.cpp
- Committer:
- Jaimelt
- Date:
- 2018-03-28
- Revision:
- 0:1ad0b0cdf28f
File content as of revision 0:1ad0b0cdf28f:
#include"mbed.h"
#include <ros.h>
#include "LSM6DSLSensor.h"
#include <std_msgs/String.h>
#include <sensor_msgs/Imu.h>
#include <geometry_msgs/PoseStamped.h>
#include <geometry_msgs/Pose.h>
#include <nav_msgs/Path.h>
#include <ros/time.h>
/* Retrieve the composing elements of the expansion board */
/* Interface definition */
#ifdef TARGET_DISCO_L475VG_IOT01A
static DevI2C devI2c(PB_11,PB_10);
#else // X-Nucleo-IKS01A2 or SensorTile
#ifdef TARGET_SENSOR_TILE
#define SPI_TYPE_LPS22HB LPS22HBSensor::SPI3W
#define SPI_TYPE_LSM6DSL LSM6DSLSensor::SPI3W
SPI devSPI(PB_15, NC, PB_13); // 3-wires SPI on SensorTile
static Serial ser(PC_12,PD_2); // Serial with SensorTile Cradle Exp. Board + Nucleo
#define printf(...) ser.printf(__VA_ARGS__)
#else // Nucleo-XXX + X-Nucleo-IKS01A2
static DevI2C devI2c(D14,D15);
#endif
#endif
/* Motion sensors */
#ifdef TARGET_DISCO_L475VG_IOT01A
static LSM6DSLSensor acc_gyro(&devI2c,LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW,PD_11); // low address
#else // X-NUCLEO-IKS01A2 or SensorTile
#if defined (TARGET_SENSOR_TILE)
static LSM6DSLSensor acc_gyro(&devSPI,PB_12, NC, PA_2, SPI_TYPE_LSM6DSL);
#else
static LSM6DSLSensor acc_gyro(&devI2c,LSM6DSL_ACC_GYRO_I2C_ADDRESS_HIGH,D4,D5); // high address
#endif
#endif
ros::NodeHandle nh;
sensor_msgs::Imu imu_msg;
ros::Publisher pub_imu("/imu", &imu_msg);
geometry_msgs::PoseStamped pose_msg;
ros::Publisher pub_pose("/pose", &pose_msg);
nav_msgs::Path path_msg;
ros::Publisher pub_path("/path", &path_msg);
char frameid[] = "/imu";
//char frameid_pose[] = "/pose";
DigitalOut led = LED1;
Timer t;
float alpha = 0.1;
float x_acc_old, y_acc_old;
int main() {
int32_t axes[3];
int32_t angles[3];
float dx = 0, dy = 0, x_pos = 0, y_pos= 0, x_acc = 0, y_acc = 0, x_offset = 0, y_offset = 0;
float x_vel = 0;
float y_vel = 0;
float dt = 0.04;
//float yaw = ;
/* Init sensors with default params */
acc_gyro.init(NULL);
/* Enable sensors */
acc_gyro.enable_x();
acc_gyro.enable_g();
/*Offset calibration*/
for(int i = 0; i<200; i++){
acc_gyro.get_x_axes(axes);
acc_gyro.get_g_axes(angles);
x_offset += axes[0]/200;
y_offset += axes[1]/200;
wait_ms(10);
}
nh.initNode();
nh.advertise(pub_imu);
imu_msg.header.frame_id = frameid;
nh.advertise(pub_pose);
pose_msg.header.frame_id = frameid;
nh.advertise(pub_path);
path_msg.header.frame_id = frameid;
while (1) {
for(int i=0; i<20; i++) {
t.stop();
dt = t.read();
t.reset();
t.start();
acc_gyro.get_x_axes(axes);
acc_gyro.get_g_axes(angles);
x_acc = alpha * (axes[0]/104.383 - x_offset/104.383) + (1 - alpha) * x_acc;
y_vel = 0;
led = !led;
//Obtain pose from acceleration
dx = x_vel * dt + (dt*dt)/2.0*x_acc;//* cos(yaw);
dy = y_vel * dt + (dt*dt)/2.0*y_acc;;//* sin(yaw);
x_vel = x_vel + x_acc * dt;
y_vel = y_vel + y_acc * dt;
x_pos += dx;
y_pos += dy;
// nh.spinOnce();
}
imu_msg.header.stamp = nh.now();
pose_msg.header.stamp = nh.now();
path_msg.header.stamp = nh.now();
pose_msg.pose.position.x = x_pos;
pose_msg.pose.position.y = y_pos;
pub_pose.publish( &pose_msg );
imu_msg.linear_acceleration.x = x_acc;
imu_msg.linear_acceleration.y = y_acc;
imu_msg.linear_acceleration.z = axes[2]/104.383;
imu_msg.angular_velocity.x = angles[0];
imu_msg.angular_velocity.y = angles[1];
imu_msg.angular_velocity.z = angles[2];
pub_imu.publish( &imu_msg );
path_msg.poses[1].pose.position.x = x_pos;
path_msg.poses[1].pose.position.y = y_pos;
pub_path.publish( &path_msg);
nh.spinOnce();
}
}