Automatic IMU caliberation can now be disabled using

`do_imu_caliberation` rosparam and reset using `imu_recalib` service.
The `cmd_vel` queue size resized to 1.
Esse commit está contido em:
Mani Monajjemi
2012-09-05 17:22:59 -07:00
commit de autolab
commit 25ac4a9f8a
4 arquivos alterados com 60 adições e 17 exclusões
+1
Ver Arquivo
@@ -28,6 +28,7 @@ rosbuild_gensrv()
#rosbuild_link_boost(${PROJECT_NAME} thread) #rosbuild_link_boost(${PROJECT_NAME} thread)
#target_link_libraries(example ${PROJECT_NAME}) #target_link_libraries(example ${PROJECT_NAME})
rosbuild_add_boost_directories()
set(SDK ARDroneLib/) set(SDK ARDroneLib/)
link_directories(${PROJECT_SOURCE_DIR}/lib/) link_directories(${PROJECT_SOURCE_DIR}/lib/)
include_directories(${SDK} ${SDK}/FFMPEG/Includes ${SDK}/Soft/Common ${SDK}/Soft/Lib ${SDK}/VP_SDK ${SDK}/VP_SDK/VP_Os/linux ) include_directories(${SDK} ${SDK}/FFMPEG/Includes ${SDK}/Soft/Common ${SDK}/Soft/Lib ${SDK}/VP_SDK ${SDK}/VP_SDK/VP_Os/linux )
+52 -16
Ver Arquivo
@@ -14,7 +14,7 @@ ARDroneDriver::ARDroneDriver()
inited = false; inited = false;
last_frame_id = -1; last_frame_id = -1;
last_navdata_id = -1; last_navdata_id = -1;
cmd_vel_sub = node_handle.subscribe("cmd_vel", 100, &cmdVelCallback); cmd_vel_sub = node_handle.subscribe("cmd_vel", 1, &cmdVelCallback);
takeoff_sub = node_handle.subscribe("ardrone/takeoff", 1, &takeoffCallback); takeoff_sub = node_handle.subscribe("ardrone/takeoff", 1, &takeoffCallback);
reset_sub = node_handle.subscribe("ardrone/reset", 1, &resetCallback); reset_sub = node_handle.subscribe("ardrone/reset", 1, &resetCallback);
land_sub = node_handle.subscribe("ardrone/land", 1, &landCallback); land_sub = node_handle.subscribe("ardrone/land", 1, &landCallback);
@@ -27,6 +27,14 @@ ARDroneDriver::ARDroneDriver()
toggleNavdataDemo_service = node_handle.advertiseService("ardrone/togglenavdatademo", toggleNavdataDemoCallback); toggleNavdataDemo_service = node_handle.advertiseService("ardrone/togglenavdatademo", toggleNavdataDemoCallback);
setCamChannel_service = node_handle.advertiseService("ardrone/setcamchannel",setCamChannelCallback ); setCamChannel_service = node_handle.advertiseService("ardrone/setcamchannel",setCamChannelCallback );
setLedAnimation_service = node_handle.advertiseService("ardrone/setledanimation", setLedAnimationCallback); setLedAnimation_service = node_handle.advertiseService("ardrone/setledanimation", setLedAnimationCallback);
/*
To be honest, I am not sure why advertising a service using class members should be this complicated!
One day, I should learn what is exactly happenning here. /M
*/
imuReCalib_service = node_handle.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>
("ardrone/imu_recalib", boost::bind(&ARDroneDriver::imuReCalibCallback, this, _1, _2));
// setEnemyColor_service = node_handle.advertiseService("/ardrone/setenemycolor", setEnemyColorCallback); // setEnemyColor_service = node_handle.advertiseService("/ardrone/setenemycolor", setEnemyColorCallback);
// setHullType_service = node_handle.advertiseService("/ardrone/sethulltype", setHullTypeCallback); // setHullType_service = node_handle.advertiseService("/ardrone/sethulltype", setHullTypeCallback);
@@ -55,16 +63,10 @@ ARDroneDriver::ARDroneDriver()
// Caliberation // Caliberation
max_num_samples = 50; max_num_samples = 50;
caliberated = false; do_caliberation = (ros::param::get("~do_imu_caliberation", do_caliberation)) ? do_caliberation : false;
if (do_caliberation) {
for (int i = 0; i < 3; i++) resetCaliberation();
{ ROS_WARN("Automatic IMU Caliberation is active.");
acc_bias[i] = 0.0;
vel_bias[i] = 0.0;
gyro_bias[i] = 0.0;
acc_samples.push_back(std::vector<double> ());
gyro_samples.push_back(std::vector<double> ());
vel_samples.push_back(std::vector<double> ());
} }
// Camera Info Manager // Camera Info Manager
@@ -159,6 +161,23 @@ void ARDroneDriver::run()
printf("ROS loop terminated ... \n"); printf("ROS loop terminated ... \n");
} }
void ARDroneDriver::resetCaliberation()
{
caliberated = false;
acc_samples.clear();
gyro_samples.clear();
vel_samples.clear();
for (int i = 0; i < 3; i++)
{
acc_bias[i] = 0.0;
vel_bias[i] = 0.0;
gyro_bias[i] = 0.0;
acc_samples.push_back(std::vector<double> ());
gyro_samples.push_back(std::vector<double> ());
vel_samples.push_back(std::vector<double> ());
}
}
double ARDroneDriver::calcAverage(std::vector<double> &vec) double ARDroneDriver::calcAverage(std::vector<double> &vec)
{ {
double ret = 0.0; double ret = 0.0;
@@ -500,7 +519,7 @@ void ARDroneDriver::publish_navdata()
vp_os_mutex_unlock(&navdata_lock); vp_os_mutex_unlock(&navdata_lock);
if (!caliberated) if ((do_caliberation) && (!caliberated))
{ {
acc_samples[0].push_back(navdata_phys.phys_accs[ACC_X]); acc_samples[0].push_back(navdata_phys.phys_accs[ACC_X]);
acc_samples[1].push_back(navdata_phys.phys_accs[ACC_Y]); acc_samples[1].push_back(navdata_phys.phys_accs[ACC_Y]);
@@ -519,13 +538,15 @@ void ARDroneDriver::publish_navdata()
gyro_bias[j] = calcAverage(gyro_samples[j]); gyro_bias[j] = calcAverage(gyro_samples[j]);
vel_bias[j] = calcAverage(vel_samples[j]); vel_bias[j] = calcAverage(vel_samples[j]);
} }
ROS_INFO("Bias in linear acceleration: [%4.4lf, %4.4lf, %4.4lf]", acc_bias[0], acc_bias[1], acc_bias[2]); ROS_INFO("Bias in linear acceleration (mg): [%4.4lf, %4.4lf, %4.4lf]", acc_bias[0], acc_bias[1], acc_bias[2]);
ROS_INFO("Bias in angular velocity: [%4.4lf, %4.4lf, %4.4lf]", gyro_bias[0], gyro_bias[1], gyro_bias[2]); ROS_INFO("Bias in angular velocity (deg/s): [%4.4lf, %4.4lf, %4.4lf]", gyro_bias[0], gyro_bias[1], gyro_bias[2]);
ROS_INFO("Bias in linear velocity: [%4.4lf, %4.4lf, %4.4lf]", vel_bias[0], vel_bias[1], vel_bias[2]); ROS_INFO("Bias in linear velocity (mm/s): [%4.4lf, %4.4lf, %4.4lf]", vel_bias[0], vel_bias[1], vel_bias[2]);
ROS_INFO("Above values (except z-axis accel) will be substracted from actual IMU data in `navdata` and `imu` topic.");
ROS_INFO("This feature can be disabled using `do_imu_caliberation` parameter. Recaliberate using `imu_recalib` service.");
caliberated = true; caliberated = true;
} }
} }
if (caliberated) if ((do_caliberation) && (caliberated))
{ {
for (int j = 0; j < 3; j++) for (int j = 0; j < 3; j++)
{ {
@@ -642,6 +663,21 @@ void ARDroneDriver::publish_tf()
tf_broad.sendTransform(tf_base_bottom); tf_broad.sendTransform(tf_base_bottom);
} }
bool ARDroneDriver::imuReCalibCallback(std_srvs::Empty::Request &request, std_srvs::Empty::Response &response)
{
if (!do_caliberation)
{
ROS_WARN("Automatic IMU Caliberation is not active. Activate first using `do_imu_caliberation` parameter");
return false;
}
else
{
ROS_WARN("Recaliberating IMU, please do not move the drone for a couple of seconds.");
resetCaliberation();
return true;
}
}
void controlCHandler (int signal) void controlCHandler (int signal)
{ {
ros::shutdown(); ros::shutdown();
+6
Ver Arquivo
@@ -7,6 +7,7 @@
#include <camera_info_manager/camera_info_manager.h> #include <camera_info_manager/camera_info_manager.h>
#include <sensor_msgs/Image.h> #include <sensor_msgs/Image.h>
#include <sensor_msgs/Imu.h> #include <sensor_msgs/Imu.h>
#include <std_srvs/Empty.h>
#include <ardrone_autonomy/Navdata.h> #include <ardrone_autonomy/Navdata.h>
#include "ardrone_sdk.h" #include "ardrone_sdk.h"
#include <vector> #include <vector>
@@ -30,12 +31,15 @@ public:
void run(); void run();
double getRosParam(char* param, double defaultVal); double getRosParam(char* param, double defaultVal);
bool imuReCalibCallback(std_srvs::Empty::Request& request, std_srvs::Empty::Response &response);
private: private:
void publish_video(); void publish_video();
void publish_navdata(); void publish_navdata();
void publish_tf(); void publish_tf();
bool readCovParams(std::string param_name, boost::array<double, 9> &cov_array); bool readCovParams(std::string param_name, boost::array<double, 9> &cov_array);
double calcAverage(std::vector<double> &vec); double calcAverage(std::vector<double> &vec);
void resetCaliberation();
ros::NodeHandle node_handle; ros::NodeHandle node_handle;
ros::Subscriber cmd_vel_sub; ros::Subscriber cmd_vel_sub;
@@ -60,6 +64,7 @@ private:
ros::ServiceServer toggleNavdataDemo_service; ros::ServiceServer toggleNavdataDemo_service;
ros::ServiceServer setCamChannel_service; ros::ServiceServer setCamChannel_service;
ros::ServiceServer setLedAnimation_service; ros::ServiceServer setLedAnimation_service;
ros::ServiceServer imuReCalib_service;
/* /*
* Orange Green : 1 * Orange Green : 1
@@ -102,6 +107,7 @@ private:
sensor_msgs::Imu imu_msg; sensor_msgs::Imu imu_msg;
// Manual IMU caliberation // Manual IMU caliberation
bool do_caliberation;
int max_num_samples; int max_num_samples;
bool caliberated; bool caliberated;
double acc_bias[3]; double acc_bias[3];
+1 -1
Ver Arquivo
@@ -42,8 +42,8 @@ extern "C" {
extern video_decoder_config_t vec; extern video_decoder_config_t vec;
} }
#define NB_DRIVER_POST_STAGES 10
#define NB_DRIVER_POST_STAGES 10
extern navdata_vision_detect_t shared_navdata_detect; extern navdata_vision_detect_t shared_navdata_detect;
extern navdata_phys_measures_t shared_navdata_phys; extern navdata_phys_measures_t shared_navdata_phys;
extern navdata_demo_t shared_navdata; extern navdata_demo_t shared_navdata;