Go to the documentation of this file.00001
00009
00010
00011
00012
00013 #include <csignal>
00014 #include <ecl/time.hpp>
00015 #include <ecl/sigslots.hpp>
00016 #include <ecl/geometry/pose2d.hpp>
00017 #include <ecl/linear_algebra.hpp>
00018 #include "kobuki_driver/kobuki.hpp"
00019
00020
00021
00022
00023
00024 class KobukiManager {
00025 public:
00026 KobukiManager() :
00027 dx(0.0), dth(0.0),
00028 slot_stream_data(&KobukiManager::processStreamData, *this)
00029 {
00030 kobuki::Parameters parameters;
00031 parameters.sigslots_namespace = "/kobuki";
00032 parameters.device_port = "/dev/kobuki";
00033 parameters.enable_acceleration_limiter = false;
00034 kobuki.init(parameters);
00035 kobuki.enable();
00036 slot_stream_data.connect("/kobuki/stream_data");
00037 }
00038
00039 ~KobukiManager() {
00040 kobuki.setBaseControl(0,0);
00041 kobuki.disable();
00042 }
00043
00044 void processStreamData() {
00045 ecl::Pose2D<double> pose_update;
00046 ecl::linear_algebra::Vector3d pose_update_rates;
00047 kobuki.updateOdometry(pose_update, pose_update_rates);
00048 pose *= pose_update;
00049 dx += pose_update.x();
00050 dth += pose_update.heading();
00051
00052
00053
00054 processMotion();
00055 }
00056
00057
00058 void processMotion() {
00059 if (dx >= 1.0 && dth >= ecl::pi/2.0) { dx=0.0; dth=0.0; kobuki.setBaseControl(0.0, 0.0); return; }
00060 else if (dx >= 1.0) { kobuki.setBaseControl(0.0, 3.3); return; }
00061 else { kobuki.setBaseControl(0.3, 0.0); return; }
00062 }
00063
00064 ecl::Pose2D<double> getPose() {
00065 return pose;
00066 }
00067
00068 private:
00069 double dx, dth;
00070 ecl::Pose2D<double> pose;
00071 kobuki::Kobuki kobuki;
00072 ecl::Slot<> slot_stream_data;
00073 };
00074
00075
00076
00077
00078
00079 bool shutdown_req = false;
00080 void signalHandler(int signum) {
00081 shutdown_req = true;
00082 }
00083
00084
00085
00086
00087
00088 int main(int argc, char** argv)
00089 {
00090 signal(SIGINT, signalHandler);
00091
00092 std::cout << "Demo : Example of simple control loop." << std::endl;
00093 KobukiManager kobuki_manager;
00094
00095 ecl::Sleep sleep(1);
00096 ecl::Pose2D<double> pose;
00097 try {
00098 while (!shutdown_req){
00099 sleep();
00100 pose = kobuki_manager.getPose();
00101 std::cout << "current pose: [" << pose.x() << ", " << pose.y() << ", " << pose.heading() << "]" << std::endl;
00102 }
00103 } catch ( ecl::StandardException &e ) {
00104 std::cout << e.what();
00105 }
00106 return 0;
00107 }