#include <iostream>
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpDisplay.h>
#include <visp3/core/vpImage.h>
#include <visp3/core/vpIoTools.h>
#include <visp3/core/vpTime.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/robot/vpRobotPioneer.h>
#ifndef VISP_HAVE_PIONEER
int main()
{
std::cout << "\nThis example requires Aria 3rd party library. You should "
"install it.\n"
<< std::endl;
return 0;
}
#else
ArSonarDevice sonar;
#if defined(VISP_HAVE_X11)
#elif defined(VISP_HAVE_GDI)
#endif
static bool isInitialized = false;
static int half_size = 256 * 2;
void sonarPrinter(void)
{
fprintf(stdout, "in sonarPrinter()\n");
fflush(stdout);
double scale = (double)half_size / (double)sonar.getMaxRange();
double range;
double angle;
printf("Closest readings within polar sections:\n");
double start_angle = -45;
double end_angle = 45;
range = sonar.currentReadingPolar(start_angle, end_angle, &angle);
printf(" front quadrant: %5.0f ", range);
if (std::fabs(range - sonar.getMaxRange()) > std::numeric_limits<double>::epsilon())
printf("%3.0f ", angle);
printf("\n");
#if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)
if (isInitialized && std::fabs(range - sonar.getMaxRange()) > std::numeric_limits<double>::epsilon()) {
double j = -y * scale + half_size;
double i = -x * scale + half_size;
}
#endif
range = sonar.currentReadingPolar(-135, -45, &angle);
printf(" right quadrant: %5.0f ", range);
if (std::fabs(range - sonar.getMaxRange()) > std::numeric_limits<double>::epsilon())
printf("%3.0f ", angle);
printf("\n");
range = sonar.currentReadingPolar(45, 135, &angle);
printf(" left quadrant: %5.0f ", range);
if (std::fabs(range - sonar.getMaxRange()) > std::numeric_limits<double>::epsilon())
printf("%3.0f ", angle);
printf("\n");
range = sonar.currentReadingPolar(-135, 135, &angle);
printf(" back quadrant: %5.0f ", range);
if (std::fabs(range - sonar.getMaxRange()) > std::numeric_limits<double>::epsilon())
printf("%3.0f ", angle);
printf("\n");
ArSensorReading *reading;
for (int sensor = 0; sensor < robot->getNumSonar(); sensor++) {
reading = robot->getSonarReading(sensor);
if (reading != NULL) {
angle = reading->getSensorTh();
range = reading->getRange();
double sx = reading->getSensorX();
double sy = reading->getSensorY();
double x = sx + ox;
double y = sy + oy;
double sj = -sy * scale + half_size;
double si = -sx * scale + half_size;
double j = -y * scale + half_size;
double i = -x * scale + half_size;
#if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)
if (isInitialized && std::fabs(range - sonar.getMaxRange()) > std::numeric_limits<double>::epsilon()) {
char legend[15];
sprintf(legend, "%d: %1.2fm", sensor, float(range) / 1000);
}
#endif
}
}
#if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)
if (isInitialized)
#endif
fflush(stdout);
}
int main(int argc, char **argv)
{
try {
ArArgumentParser parser(&argc, argv);
parser.loadDefaultArguments();
ArRobotConnector robotConnector(&parser, robot);
if (!robotConnector.connectRobot()) {
ArLog::log(ArLog::Terse, "Could not connect to the robot");
if (parser.checkHelpAndWarnUnparsed()) {
Aria::logOptions();
Aria::exit(1);
}
}
if (!Aria::parseArgs()) {
Aria::logOptions();
Aria::shutdown();
return false;
}
std::cout << "Robot connected" << std::endl;
#if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)
if (isInitialized == false) {
I.
resize((
unsigned int)half_size * 2, (
unsigned int)half_size * 2);
I = 255;
#if defined(VISP_HAVE_X11)
#elif defined(VISP_HAVE_GDI)
#endif
d->
init(I, -1, -1,
"Sonar range data");
isInitialized = true;
}
#endif
ArGlobalFunctor sonarPrinterCB(&sonarPrinter);
robot->addRangeDevice(&sonar);
robot->addUserTask("Sonar printer", 50, &sonarPrinterCB);
for (int i = 0; i < 1000; i++) {
std::cout <<
"Trans. vel= " << v_mes[0] <<
" m/s, Rot. vel=" <<
vpMath::deg(v_mes[1]) <<
" deg/s" << std::endl;
std::cout << "Left wheel vel= " << v_mes[0] << " m/s, Right wheel vel=" << v_mes[1] << " m/s" << std::endl;
std::cout << "Battery=" << robot->getBatteryVoltage() << std::endl;
#if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)
if (isInitialized) {
{
std::string opath;
#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) // UNIX
opath = "/tmp";
#elif defined(_WIN32)
opath = "C:\\temp";
#endif
try {
} catch (...) {
std::cerr << std::endl << "ERROR:" << std::endl;
std::cerr << " Cannot create " << opath << std::endl;
exit(-1);
}
}
std::string filename = opath + "/sonar.png";
}
break;
}
}
#endif
}
ArLog::log(ArLog::Normal, "simpleMotionCommands: Stopping.");
robot->lock();
robot->stop();
robot->unlock();
ArUtil::sleep(1000);
robot->lock();
ArLog::log(ArLog::Normal,
"simpleMotionCommands: Pose=(%.2f,%.2f,%.2f), Trans. "
"Vel=%.2f, Rot. Vel=%.2f, Battery=%.2fV",
robot->getX(), robot->getY(), robot->getTh(), robot->getVel(), robot->getRotVel(),
robot->getBatteryVoltage());
robot->unlock();
std::cout << "Ending robot thread..." << std::endl;
robot->stopRunning();
#if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI)
if (isInitialized) {
if (d != NULL)
delete d;
}
#endif
robot->waitForRunExit();
delete robot;
ArLog::log(ArLog::Normal, "simpleMotionCommands: Exiting.");
return 0;
std::cout << "Catch an exception: " << e << std::endl;
return 1;
}
}
#endif