47 #include "sensor_msgs/Joy.h"    48 #include "std_msgs/Bool.h"    50 #include "wiimote/State.h"    51 #include "wiimote/IrSourceInfo.h"   152   ROS_INFO(
"Put Wiimote in discoverable mode now (press 1+2)...");
   154     ROS_INFO(
"Searching indefinitely...");
   156     ROS_INFO(
"Timeout in about %d seconds if not paired.", timeout);
   160     ROS_ERROR(
"Unable to connect to wiimote");
   173       ROS_ERROR(
"Wiimote not usable due to calibration failure.");
   182   return wiimote_c::cwiid_close(
wiimote_);
   193       ROS_WARN(
"Failed to read current Wiimote calibration data; proceeding with previous data");
   197       ROS_ERROR(
"Failed to read Wiimote factory calibration data");
   207       ROS_ERROR(
"Some Wiimote factory calibration data is missing; calibration failed");
   208       ROS_ERROR(
"Wiimote Cal:: zero[x]:%d, zero[y]:%d, zero[z]:%d,\n\tone[x]:%d, one[y]:%d, one[z]:%d",
   217       ROS_DEBUG(
"Wiimote Cal:: zero[x]:%d, zero[y]:%d, zero[z]:%d,\n\tone[x]:%d, one[y]:%d, one[z]:%d",
   225     ROS_WARN(
"Could not read Wiimote state; nunchuk may not be calibrated if present.");
   235           ROS_WARN(
"Failed to read current Nunchuk calibration data; proceeding with previous data");
   239           ROS_ERROR(
"Failed to read Nunchuk factory calibration data");
   250           ROS_ERROR(
"Some Nunchuk factory calibration data is missing; calibration failed");
   251           ROS_ERROR(
"Nunchuk Cal:: zero[x]:%d, zero[y]:%d, zero[z]:%d,\n\tone[x]:%d, one[y]:%d, one[z]:%d",
   260           ROS_DEBUG(
"Nunchuk Cal:: zero[x]:%d, zero[y]:%d, zero[z]:%d,\n\tone[x]:%d, one[y]:%d, one[z]:%d",
   274     uint8_t new_report_mode = save_report_mode | (CWIID_RPT_ACC | CWIID_RPT_EXT);
   276     if (new_report_mode != save_report_mode)
   281     ROS_INFO(
"Collecting additional calibration data; keep wiimote stationary...");
   289     bool data_complete = 
false;
   290     int wiimote_data_points = 0;
   291     int motionplus_data_points = 0;
   293     while (!failed && !data_complete)
   304           ++wiimote_data_points;
   320             ++motionplus_data_points;
   333           data_complete = 
true;
   339             data_complete = 
true;
   347       ROS_DEBUG(
"Calculating calibration data...");
   351       bool is_bad_cal = 
false;
   352       std::for_each(std::begin(stddev), std::end(stddev), [&](
const double d)  
   357           ROS_DEBUG(
"Wiimote standard deviation > 1.0");
   365         ROS_DEBUG(
"Variance Scaled x: %lf, y: %lf, z: %lf", variance.at(CWIID_X),
   366             variance.at(CWIID_Y), variance.at(CWIID_Z));
   369         linear_acceleration_covariance_[1] = 0.0;
   370         linear_acceleration_covariance_[2] = 0.0;
   372         linear_acceleration_covariance_[3] = 0.0;
   373         linear_acceleration_covariance_[4] = variance.at(CWIID_Y);
   374         linear_acceleration_covariance_[5] = 0.0;
   376         linear_acceleration_covariance_[6] = 0.0;
   377         linear_acceleration_covariance_[7] = 0.0;
   378         linear_acceleration_covariance_[8] = variance.at(CWIID_Z);
   382         ROS_ERROR(
"Failed calibration; using questionable data for linear acceleration");
   394         std::for_each(std::begin(gyro_stddev), std::end(gyro_stddev), [&](
const double d)  
   399             ROS_DEBUG(
"MotionPlus standard deviation > 50");
   407           ROS_DEBUG(
"Gyro Variance Scaled x: %lf, y: %lf, z: %lf", gyro_variance.at(CWIID_PHI),
   408               gyro_variance.at(CWIID_THETA), gyro_variance.at(CWIID_PSI));
   411           angular_velocity_covariance_[1] = 0.0;
   412           angular_velocity_covariance_[2] = 0.0;
   414           angular_velocity_covariance_[3] = 0.0;
   415           angular_velocity_covariance_[4] = gyro_variance.at(CWIID_THETA);
   416           angular_velocity_covariance_[5] = 0.0;
   418           angular_velocity_covariance_[6] = 0.0;
   419           angular_velocity_covariance_[7] = 0.0;
   420           angular_velocity_covariance_[8] = gyro_variance.at(CWIID_PSI);
   424           ROS_ERROR(
"Failed calibration; using questionable data for angular velocity");
   439       ROS_ERROR(
"Failed calibration; using questionable data");
   444       struct timespec state_tv;
   446       if (clock_gettime(CLOCK_REALTIME, &state_tv) == 0)
   452         ROS_WARN(
"Could not update calibration time.");
   457     if (new_report_mode != save_report_mode)
   464   std_msgs::Bool imu_is_calibrated_data;
   465   imu_is_calibrated_data.data = result;
   523   uint8_t wii_nunchuk_subscribers = 0;
   524   uint8_t wii_classic_subscribers = 0;
   527   uint8_t new_report_mode = current_report_mode;
   549   if (joy_subscribers || wii_state_subscribers || imu_subscribers)
   552     new_report_mode |= (CWIID_RPT_ACC | CWIID_RPT_MOTIONPLUS);
   554     if (joy_subscribers || wii_state_subscribers)
   557       new_report_mode |= (CWIID_RPT_BTN);
   560     if (wii_state_subscribers)
   563       new_report_mode |= (CWIID_RPT_IR | CWIID_RPT_NUNCHUK);
   568     if (!joy_subscribers && !wii_state_subscribers && !imu_subscribers)
   571       new_report_mode &= ~(CWIID_RPT_ACC | CWIID_RPT_MOTIONPLUS);
   574     if (!joy_subscribers && !wii_state_subscribers)
   577       new_report_mode &= ~(CWIID_RPT_BTN);
   580     if (!wii_state_subscribers)
   583       new_report_mode &= ~(CWIID_RPT_IR);
   607           ROS_ERROR(
"Topic /wiimote/nunchuk not advertised due to calibration failure");
   614     if (wii_nunchuk_subscribers)
   617       new_report_mode |= (CWIID_RPT_NUNCHUK);
   621       if (!wii_state_subscribers)
   624         new_report_mode &= ~(CWIID_RPT_NUNCHUK);
   637       if (!wii_state_subscribers)
   640         new_report_mode &= ~(CWIID_RPT_NUNCHUK);
   664     if (wii_classic_subscribers)
   667       new_report_mode |= (CWIID_RPT_CLASSIC);
   672       new_report_mode &= ~(CWIID_RPT_CLASSIC);
   685       new_report_mode &= ~(CWIID_RPT_CLASSIC);
   690   if (current_report_mode != new_report_mode)
   695   if (!joy_subscribers && !wii_state_subscribers && !imu_subscribers &&
   696       !wii_nunchuk_subscribers & !wii_classic_subscribers)
   722   if (wii_state_subscribers)
   728   if (wii_nunchuk_subscribers)
   735   if (wii_classic_subscribers)
   745   bool get_state_result = 
true;
   746   bool data_valid = 
false;
   750   static int wiimote_count = 0;
   751   static int motionplus_count = 0;
   762       if (count > 1 && !(count % 100))
   765         ROS_INFO(
"Waiting for valid wiimote data...");
   774         get_state_result = 
false;
   792   while (get_state_result && !data_valid);
   807         if (count > 1 && !(count % 100))
   810           ROS_INFO(
"Waiting for valid MotionPlus data...");
   819           get_state_result = 
false;
   831           ROS_DEBUG(
"Ignoring MotionPlus data point %d", motionplus_count);
   843     while (get_state_result && !data_valid);
   848     motionplus_count = 0;
   852   if (get_state_result)
   854     struct timespec state_tv;
   856     if (clock_gettime(CLOCK_REALTIME, &state_tv) == 0)
   863       ROS_ERROR(
"Error sampling real-time clock");
   879   if (wiimote_c::cwiid_set_rpt_mode(
wiimote_, rpt_mode))
   881     ROS_ERROR(
"Error setting report mode: Bit(s):%d", rpt_mode);
   888     if (rpt_mode & CWIID_RPT_MOTIONPLUS)
   890       wiimote_c::cwiid_enable(
wiimote_, CWIID_FLAG_MOTIONPLUS);
   902     ROS_WARN(
"LED ID %d out of bounds; ignoring!", led);
   930   if (wiimote_c::cwiid_set_led(
wiimote_, led_state))
   940     ROS_INFO(
"Connection to wiimote lost");
   947   if (wiimote_c::cwiid_set_rumble(
wiimote_, rumble))
   955   const int MAX_BUF = 500;
   956   char msgs_buf[MAX_BUF];
   958   vsnprintf(msgs_buf, MAX_BUF, fmt, ap);
   962     ROS_ERROR(
"Wii Error: ID: %d: %s", wiimote_c::cwiid_get_id(
wiimote), msgs_buf);
   966     ROS_ERROR(
"Wii Error: ID: ?: %s", msgs_buf);
   973     (CWIID_RPT_BTN | CWIID_RPT_ACC | CWIID_RPT_IR);
   998   return wiimote_state_.ext_type == wiimote_c::CWIID_EXT_MOTIONPLUS;
  1003   bool is_calibrated = 
false;
  1007   if (stick[CWIID_X] != 0 && stick[CWIID_Y] != 0)
  1009     center[CWIID_X] = stick[CWIID_X];
  1010     center[CWIID_Y] = stick[CWIID_Y];
  1012     is_calibrated = 
true;
  1014     ROS_DEBUG(
"%s Joystick Center:: x:%d, y:%d", name, center[CWIID_X], center[CWIID_Y]);
  1017   return is_calibrated;
  1021     uint8_t (&stick_max)[2], 
const char *name)
  1023   bool updated = 
false;
  1025   if (stick[CWIID_X] < stick_min[CWIID_X])
  1027     stick_min[CWIID_X] = stick[CWIID_X];
  1031   if (stick[CWIID_Y] < stick_min[CWIID_Y])
  1033     stick_min[CWIID_Y] = stick[CWIID_Y];
  1037   if (stick[CWIID_X] > stick_max[CWIID_X])
  1039     stick_max[CWIID_X] = stick[CWIID_X];
  1043   if (stick[CWIID_Y] > stick_max[CWIID_Y])
  1045     stick_max[CWIID_Y] = stick[CWIID_Y];
  1051     ROS_DEBUG(
"%s Joystick:: Min x:%3d, y:%3d  Max x:%3d, y:%3d", name,
  1052         stick_min[CWIID_X], stick_min[CWIID_Y], stick_max[CWIID_X], stick_max[CWIID_Y]);
  1057     uint8_t stick_max[2], uint8_t stick_center[2], 
double (&stick)[2])
  1060   int deadzoneMargin = 4;
  1073   if (stick_max[CWIID_X] < 128)
  1075     if (stick_max[CWIID_X] < 32)
  1079     else if (stick_max[CWIID_X] < 64)
  1090   if (stick_current[CWIID_X] > stick_center[CWIID_X])
  1092     stick[CWIID_X] = -(stick_current[CWIID_X] - stick_center[CWIID_X]) /
  1093       ((stick_max[CWIID_X] - stick_center[CWIID_X]) * 1.0);
  1094     deadzone[CWIID_X] = deadzoneMargin /
  1095       ((stick_max[CWIID_X] - stick_center[CWIID_X]) * 1.0);
  1099     stick[CWIID_X] = -(stick_current[CWIID_X] - stick_center[CWIID_X]) /
  1100       ((stick_center[CWIID_X] - stick_min[CWIID_X]) * 1.0);
  1101     deadzone[CWIID_X] = deadzoneMargin /
  1102       ((stick_center[CWIID_X] - stick_min[CWIID_X]) * 1.0);
  1104   if (stick_current[CWIID_Y] > stick_center[CWIID_Y])
  1106     stick[CWIID_Y] = (stick_current[CWIID_Y] - stick_center[CWIID_Y]) /
  1107       ((stick_max[CWIID_Y] - stick_center[CWIID_Y]) * 1.0);
  1108     deadzone[CWIID_Y] = deadzoneMargin /
  1109       ((stick_max[CWIID_Y] - stick_center[CWIID_Y]) * 1.0);
  1113     stick[CWIID_Y] = (stick_current[CWIID_Y] - stick_center[CWIID_Y]) /
  1114       ((stick_center[CWIID_Y] - stick_min[CWIID_Y]) * 1.0);
  1115     deadzone[CWIID_Y] = deadzoneMargin /
  1116       ((stick_center[CWIID_Y] - stick_min[CWIID_Y]) * 1.0);
  1120   if (fabs(stick[CWIID_X]) <= deadzone[CWIID_X])
  1122     stick[CWIID_X] = 0.0;
  1124   if (fabs(stick[CWIID_Y]) <= deadzone[CWIID_Y])
  1126     stick[CWIID_Y] = 0.0;
  1132   sensor_msgs::Joy joy_data;
  1146   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_1) > 0);
  1147   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_2) > 0);
  1148   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_A) > 0);
  1149   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_B) > 0);
  1150   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_PLUS) > 0);
  1151   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_MINUS) > 0);
  1152   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_LEFT) > 0);
  1153   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_RIGHT) > 0);
  1154   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_UP) > 0);
  1155   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_DOWN) > 0);
  1156   joy_data.buttons.push_back((
wiimote_state_.buttons & CWIID_BTN_HOME) > 0);
  1166   sensor_msgs::Imu imu_data_data;
  1173   imu_data_data.orientation_covariance[0] = -1.0;
  1188     imu_data_data.angular_velocity.x = (
wiimote_state_.ext.motionplus.angle_rate[CWIID_PHI] -
  1190     imu_data_data.angular_velocity.y = (
wiimote_state_.ext.motionplus.angle_rate[CWIID_THETA] -
  1192     imu_data_data.angular_velocity.z = (
wiimote_state_.ext.motionplus.angle_rate[CWIID_PSI] -
  1203   wiimote::State wiimote_state_data;
  1205   wiimote_state_data.header.stamp.sec = 
state_secs_;
  1216   wiimote_state_data.linear_acceleration_raw.x = 
wiimote_state_.acc[CWIID_X];
  1217   wiimote_state_data.linear_acceleration_raw.y = 
wiimote_state_.acc[CWIID_Y];
  1218   wiimote_state_data.linear_acceleration_raw.z = 
wiimote_state_.acc[CWIID_Z];
  1227     wiimote_state_data.angular_velocity_zeroed.x = (
wiimote_state_.ext.motionplus.angle_rate[CWIID_PHI] -
  1229     wiimote_state_data.angular_velocity_zeroed.y = (
wiimote_state_.ext.motionplus.angle_rate[CWIID_THETA] -
  1231     wiimote_state_data.angular_velocity_zeroed.z = (
wiimote_state_.ext.motionplus.angle_rate[CWIID_PSI] -
  1234     wiimote_state_data.angular_velocity_raw.x = 
wiimote_state_.ext.motionplus.angle_rate[CWIID_PHI];
  1235     wiimote_state_data.angular_velocity_raw.y = 
wiimote_state_.ext.motionplus.angle_rate[CWIID_THETA];
  1236     wiimote_state_data.angular_velocity_raw.z = 
wiimote_state_.ext.motionplus.angle_rate[CWIID_PSI];
  1241   wiimote_state_data.buttons.elems[ 0] = ((
wiimote_state_.buttons & CWIID_BTN_1) > 0);
  1242   wiimote_state_data.buttons.elems[ 1] = ((
wiimote_state_.buttons & CWIID_BTN_2) > 0);
  1243   wiimote_state_data.buttons.elems[ 2] = ((
wiimote_state_.buttons & CWIID_BTN_PLUS) > 0);
  1244   wiimote_state_data.buttons.elems[ 3] = ((
wiimote_state_.buttons & CWIID_BTN_MINUS) > 0);
  1245   wiimote_state_data.buttons.elems[ 4] = ((
wiimote_state_.buttons & CWIID_BTN_A) > 0);
  1246   wiimote_state_data.buttons.elems[ 5] = ((
wiimote_state_.buttons & CWIID_BTN_B) > 0);
  1247   wiimote_state_data.buttons.elems[ 6] = ((
wiimote_state_.buttons & CWIID_BTN_UP) > 0);
  1248   wiimote_state_data.buttons.elems[ 7] = ((
wiimote_state_.buttons & CWIID_BTN_DOWN) > 0);
  1249   wiimote_state_data.buttons.elems[ 8] = ((
wiimote_state_.buttons & CWIID_BTN_LEFT) > 0);
  1250   wiimote_state_data.buttons.elems[ 9] = ((
wiimote_state_.buttons & CWIID_BTN_RIGHT) > 0);
  1251   wiimote_state_data.buttons.elems[10] = ((
wiimote_state_.buttons & CWIID_BTN_HOME) > 0);
  1264       wiimote_state_data.nunchuk_joystick_raw[CWIID_X] = 
wiimote_state_.ext.nunchuk.stick[CWIID_X];
  1265       wiimote_state_data.nunchuk_joystick_raw[CWIID_Y] = 
wiimote_state_.ext.nunchuk.stick[CWIID_Y];
  1267       wiimote_state_data.nunchuk_joystick_zeroed[CWIID_X] = stick[CWIID_X];
  1268       wiimote_state_data.nunchuk_joystick_zeroed[CWIID_Y] = stick[CWIID_Y];
  1270       wiimote_state_data.nunchuk_acceleration_raw.x = 
wiimote_state_.ext.nunchuk.acc[CWIID_X];
  1271       wiimote_state_data.nunchuk_acceleration_raw.y = 
wiimote_state_.ext.nunchuk.acc[CWIID_Y];
  1272       wiimote_state_data.nunchuk_acceleration_raw.z = 
wiimote_state_.ext.nunchuk.acc[CWIID_Z];
  1274       wiimote_state_data.nunchuk_acceleration_zeroed.x =
  1277       wiimote_state_data.nunchuk_acceleration_zeroed.y =
  1280       wiimote_state_data.nunchuk_acceleration_zeroed.z =
  1285       wiimote_state_data.nunchuk_buttons[0] =
  1286         ((
wiimote_state_.ext.nunchuk.buttons & CWIID_NUNCHUK_BTN_Z) > 0);
  1287       wiimote_state_data.nunchuk_buttons[1] =
  1288         ((
wiimote_state_.ext.nunchuk.buttons & CWIID_NUNCHUK_BTN_C) > 0);
  1293   for (
int ir_idx = 0; ir_idx < CWIID_IR_SRC_COUNT; ir_idx++)
  1295     wiimote::IrSourceInfo irSourceInfo;
  1304       if (irSourceInfo.ir_size < 1)
  1306         irSourceInfo.ir_size = wiimote::State::INVALID;
  1311       irSourceInfo.x = wiimote::State::INVALID_FLOAT;
  1312       irSourceInfo.y = wiimote::State::INVALID_FLOAT;
  1314       irSourceInfo.ir_size = wiimote::State::INVALID;
  1317     wiimote_state_data.ir_tracking.push_back(irSourceInfo);
  1321   for (uint8_t i = 0; i < 4; i++)
  1329   wiimote_state_data.percent_battery = 
wiimote_state_.battery * 100.0 / CWIID_BATTERY_MAX;
  1384     ROS_WARN(
"State type is not Nunchuk!");
  1393   sensor_msgs::Joy wiimote_nunchuk_data;
  1397     wiimote_nunchuk_data.header.stamp.sec = 
state_secs_;
  1406     wiimote_nunchuk_data.axes.push_back(stick[CWIID_X]);  
  1407     wiimote_nunchuk_data.axes.push_back(stick[CWIID_Y]);  
  1419     wiimote_nunchuk_data.buttons.push_back((
wiimote_state_.ext.nunchuk.buttons & CWIID_NUNCHUK_BTN_Z) > 0);
  1420     wiimote_nunchuk_data.buttons.push_back((
wiimote_state_.ext.nunchuk.buttons & CWIID_NUNCHUK_BTN_C) > 0);
  1431   sensor_msgs::Joy wiimote_classic_data;
  1435     ROS_WARN(
"State type is not Classic!");
  1463   wiimote_classic_data.header.stamp.sec = 
state_secs_;
  1467   double stick_left[2];
  1468   double stick_right[2];
  1475   wiimote_classic_data.axes.push_back(stick_left[CWIID_X]);   
  1476   wiimote_classic_data.axes.push_back(stick_left[CWIID_Y]);   
  1477   wiimote_classic_data.axes.push_back(stick_right[CWIID_X]);  
  1478   wiimote_classic_data.axes.push_back(stick_right[CWIID_Y]);  
  1482   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_X) > 0);
  1483   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_Y) > 0);
  1484   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_A) > 0);
  1485   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_B) > 0);
  1486   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_PLUS) > 0);
  1487   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_MINUS) > 0);
  1488   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_LEFT) > 0);
  1489   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_RIGHT) > 0);
  1490   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_UP) > 0);
  1491   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_DOWN) > 0);
  1492   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_HOME) > 0);
  1493   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_L) > 0);
  1494   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_R) > 0);
  1495   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_ZL) > 0);
  1496   wiimote_classic_data.buttons.push_back((
wiimote_state_.ext.classic.buttons & CWIID_CLASSIC_BTN_ZR) > 0);
  1504   bool led_found = 
false;
  1505   bool rumble_found = 
false;
  1507   for (std::vector<sensor_msgs::JoyFeedback>::const_iterator it = feedback->array.begin();
  1508       it != feedback->array.end(); ++it)
  1510     if ((*it).type == sensor_msgs::JoyFeedback::TYPE_LED)
  1514       if ((*it).intensity >= 0.5)
  1523     else if ((*it).type == sensor_msgs::JoyFeedback::TYPE_RUMBLE)
  1527         ROS_WARN(
"RUMBLE ID %d out of bounds; ignoring!", (*it).id);
  1531         rumble_found = 
true;
  1533         if ((*it).intensity >= 0.5)
  1545       ROS_WARN(
"Unknown JoyFeedback command; ignored");
  1577   if (
nullptr != g_wiimote_node)
  1591   bool fed_addr = 
false;
  1592   std::string bluetooth_addr;
  1593   ros::init(argc, argv, 
"wiimote_controller");
  1599     ROS_INFO(
"Using Bluetooth address specified from CLI");
  1611   double check_connection_interval;
  1612   ros::param::param<int>(
"~pair_timeout", pair_timeout, 5);
  1613   ros::param::param<double>(
"~check_connection_interval", check_connection_interval, 0.0);
  1619     ROS_INFO(
"Searching for Wiimotes");
  1621   ROS_INFO(
"Allow all joy sticks to remain at center position until calibrated.");
  1625     ROS_INFO(
"Wiimote is Paired");
  1632     ROS_ERROR(
"* * * Wiimote pairing failed.");
  1638   if (check_connection_interval > 0.0)
  1656     ROS_ERROR(
"Error on wiimote disconnect");
 
ros::Time calibration_time_
int main(int argc, char *argv[])
void addData(int x, int y, int z)
ros::Subscriber joy_set_feedback_sub_
void setLEDBit(uint8_t led, bool on)
uint8_t nunchuk_stick_max_[2]
WiimoteNode * g_wiimote_node
void publishWiimoteState()
bool isCollectingWiimote()
uint8_t nunchuk_stick_min_[2]
StatVector3d angular_velocity_stat_
bool isCollectingMotionplus()
const uint8_t JOYSTICK_NUNCHUK_DEFAULT_CENTER_
void setBluetoothAddr(const char *bt_str)
TVectorDouble getStandardDeviationRaw()
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
ros::Publisher wiimote_state_pub_
bool classic_stick_right_calibrated_
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
void mySigHandler(int sig)
void publishWiimoteClassic()
static wiimote_c::cwiid_err_t cwiidErrorCallback
void initializeWiimoteState()
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
ros::Publisher imu_is_calibrated_pub_
boost::array< double, 9 > angular_velocity_covariance_
uint8_t classic_stick_left_min_[2]
uint8_t nunchuk_stick_center_[2]
void setRumbleBit(bool on)
bool publishWiimoteNunchukCommon()
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
const double EARTH_GRAVITY_
wiimote_c::cwiid_wiimote_t * wiimote_
ros::Publisher wiimote_nunchuk_pub_
uint8_t classic_stick_right_min_[2]
bool classic_stick_left_calibrated_
const uint8_t JOYSTICK_CLASSIC_LEFT_20PERCENT_MIN_
const uint8_t JOYSTICK_NUNCHUK_20PERCENT_MIN_
void joySetFeedbackCallback(const sensor_msgs::JoyFeedbackArray::ConstPtr &feedback)
void setRumbleState(uint8_t rumble)
void publish(const boost::shared_ptr< M > &message) const
const uint8_t JOYSTICK_CLASSIC_LEFT_20PERCENT_MAX_
void publishWiimoteNunchuk()
uint8_t classic_stick_right_center_[2]
ROSCPP_DECL bool get(const std::string &key, std::string &s)
bool isCollectingClassic()
TVectorDouble getMeanRaw()
const double GYRO_SCALE_FACTOR_
TVectorDouble getVarianceScaled(double scale)
bool isPresentMotionplus()
struct wiimote_c::acc_cal nunchuk_cal_
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
const uint8_t JOYSTICK_CLASSIC_LEFT_DEFAULT_CENTER_
struct wiimote_c::cwiid_state wiimote_state_
const uint8_t JOYSTICK_NUNCHUK_20PERCENT_MAX_
void setLedState(uint8_t led_state)
const int COVARIANCE_DATA_POINTS_
bool pairWiimote(int flags, int timeout)
const uint8_t JOYSTICK_CLASSIC_RIGHT_20PERCENT_MIN_
bool nunchuk_stick_calibrated_
StatVector3d linear_acceleration_stat_
#define zeroedByCal(raw, zero, one)
bool serviceImuCalibrateCallback(std_srvs::Empty::Request &, std_srvs::Empty::Response &)
void calculateJoystickAxisXY(uint8_t stick_current[2], uint8_t stick_min[2], uint8_t stick_max[2], uint8_t stick_center[2], double(&stick)[2])
const int IGNORE_DATA_POINTS_
uint8_t classic_stick_left_max_[2]
boost::array< double, 9 > linear_acceleration_covariance_
bool nunchuk_failed_calibration_
bool calibrateJoystick(uint8_t stick[2], uint8_t(¢er)[2], const char *name)
void checkFactoryCalibrationData()
char * getBluetoothAddr()
ROSCPP_DECL void shutdown()
void setReportMode(uint8_t rpt_mode)
const uint8_t JOYSTICK_CLASSIC_RIGHT_20PERCENT_MAX_
void resetMotionPlusState()
struct wiimote_c::acc_cal wiimote_cal_
ros::ServiceServer imu_calibrate_srv_
uint32_t getNumSubscribers() const
ROSCPP_DECL void spinOnce()
ros::Publisher wiimote_classic_pub_
void updateJoystickMinMax(uint8_t stick[2], uint8_t(&stick_min)[2], uint8_t(&stick_max)[2], const char *name)
uint8_t classic_stick_right_max_[2]
ros::Publisher imu_data_pub_
uint8_t classic_stick_left_center_[2]
const uint8_t JOYSTICK_CLASSIC_RIGHT_DEFAULT_CENTER_
std::vector< double > TVectorDouble
bool isCollectingNunchuk()