#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 EXIT_SUCCESS;
}
#else
#ifdef ENABLE_VISP_NAMESPACE
#endif
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 != nullptr) {
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()) {
std::stringstream legend;
legend << sensor << ": " << std::setprecision(2) << 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 = 255u;
#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__)))
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;
return EXIT_FAILURE;
}
}
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 != nullptr)
delete d;
}
#endif
robot->waitForRunExit();
delete robot;
ArLog::log(ArLog::Normal, "simpleMotionCommands: Exiting.");
return EXIT_SUCCESS;
}
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
#endif
Implementation of column vector and the associated operations.
static const vpColor blue
static const vpColor green
Display for windows using GDI (available on any windows 32 platform).
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="") VP_OVERRIDE
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void getImage(const vpImage< unsigned char > &Is, vpImage< vpRGBa > &Id)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
error that can be emitted by ViSP classes.
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
void resize(unsigned int h, unsigned int w)
resize the image : Image initialization
static double rad(double deg)
static double deg(double rad)
Interface for Pioneer mobile robots based on Aria 3rd party library.
void useSonar(bool usage)
void getVelocity(const vpRobot::vpControlFrameType frame, vpColVector &velocity)
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT double measureTimeMs()