parent
01c3158d4e
commit
545537255b
@ -1,58 +0,0 @@
|
|||||||
#ifndef ROSKEYBOARDTELEOPNODE_H
|
|
||||||
#define ROSKEYBOARDTELEOPNODE_H
|
|
||||||
|
|
||||||
#include <termios.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/poll.h>
|
|
||||||
|
|
||||||
#include <boost/thread/thread.hpp>
|
|
||||||
#include <ros/ros.h>
|
|
||||||
#include <geometry_msgs/Twist.h>
|
|
||||||
|
|
||||||
#define KEYCODE_W 0x77
|
|
||||||
#define KEYCODE_A 0x61
|
|
||||||
#define KEYCODE_S 0x73
|
|
||||||
#define KEYCODE_D 0x64
|
|
||||||
|
|
||||||
#define KEYCODE_A_CAP 0x41
|
|
||||||
#define KEYCODE_D_CAP 0x44
|
|
||||||
#define KEYCODE_S_CAP 0x53
|
|
||||||
#define KEYCODE_W_CAP 0x57
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RosKeyboardTeleopNode
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
double walk_vel_;
|
|
||||||
double run_vel_;
|
|
||||||
double yaw_rate_;
|
|
||||||
double yaw_rate_run_;
|
|
||||||
|
|
||||||
geometry_msgs::Twist cmdvel_;
|
|
||||||
ros::NodeHandle n_;
|
|
||||||
ros::Publisher pub_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
RosKeyboardTeleopNode();
|
|
||||||
|
|
||||||
~RosKeyboardTeleopNode() { }
|
|
||||||
void keyboardLoop();
|
|
||||||
|
|
||||||
void stopRobot()
|
|
||||||
{
|
|
||||||
cmdvel_.linear.x = 0.0;
|
|
||||||
cmdvel_.angular.z = 0.0;
|
|
||||||
pub_.publish(cmdvel_);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int kfd;
|
|
||||||
extern struct termios cooked, raw;
|
|
||||||
extern bool done;
|
|
||||||
extern RosKeyboardTeleopNode* tbk;
|
|
||||||
|
|
||||||
#endif // ROSKEYBOARDTELEOPNODE_H
|
|
@ -1,138 +0,0 @@
|
|||||||
#include "../include/roskeyboardteleopnode.h"
|
|
||||||
|
|
||||||
int kfd = 0;
|
|
||||||
struct termios cooked, raw;
|
|
||||||
bool done;
|
|
||||||
RosKeyboardTeleopNode* tbk;
|
|
||||||
|
|
||||||
RosKeyboardTeleopNode::RosKeyboardTeleopNode()
|
|
||||||
{
|
|
||||||
pub_ = n_.advertise<geometry_msgs::Twist>("cmd_vel", 1);
|
|
||||||
|
|
||||||
ros::NodeHandle n_private("~");
|
|
||||||
n_private.param("walk_vel", walk_vel_, 0.5);
|
|
||||||
n_private.param("run_vel", run_vel_, 1.0);
|
|
||||||
n_private.param("yaw_rate", yaw_rate_, 1.0);
|
|
||||||
n_private.param("yaw_rate_run", yaw_rate_run_, 1.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void RosKeyboardTeleopNode::keyboardLoop()
|
|
||||||
{
|
|
||||||
char c;
|
|
||||||
double max_tv = walk_vel_;
|
|
||||||
double max_rv = yaw_rate_;
|
|
||||||
bool dirty = false;
|
|
||||||
int speed = 0;
|
|
||||||
int turn = 0;
|
|
||||||
|
|
||||||
// get the console in raw mode
|
|
||||||
tcgetattr(kfd, &cooked);
|
|
||||||
memcpy(&raw, &cooked, sizeof(struct termios));
|
|
||||||
raw.c_lflag &=~ (ICANON | ECHO);
|
|
||||||
raw.c_cc[VEOL] = 1;
|
|
||||||
raw.c_cc[VEOF] = 2;
|
|
||||||
tcsetattr(kfd, TCSANOW, &raw);
|
|
||||||
|
|
||||||
puts("Reading from keyboard");
|
|
||||||
puts("Use WASD keys to control the robot");
|
|
||||||
puts("Press Shift to move faster");
|
|
||||||
|
|
||||||
struct pollfd ufd;
|
|
||||||
ufd.fd = kfd;
|
|
||||||
ufd.events = POLLIN;
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
boost::this_thread::interruption_point();
|
|
||||||
|
|
||||||
// get the next event from the keyboard
|
|
||||||
int num;
|
|
||||||
|
|
||||||
if ((num = poll(&ufd, 1, 250)) < 0)
|
|
||||||
{
|
|
||||||
perror("poll():");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if(num > 0)
|
|
||||||
{
|
|
||||||
if(read(kfd, &c, 1) < 0)
|
|
||||||
{
|
|
||||||
perror("read():");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (dirty == true)
|
|
||||||
{
|
|
||||||
stopRobot();
|
|
||||||
dirty = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(c)
|
|
||||||
{
|
|
||||||
case KEYCODE_W:
|
|
||||||
max_tv = walk_vel_;
|
|
||||||
speed = 1;
|
|
||||||
turn = 0;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
case KEYCODE_S:
|
|
||||||
max_tv = walk_vel_;
|
|
||||||
speed = -1;
|
|
||||||
turn = 0;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
case KEYCODE_A:
|
|
||||||
max_rv = yaw_rate_;
|
|
||||||
speed = 0;
|
|
||||||
turn = 1;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
case KEYCODE_D:
|
|
||||||
max_rv = yaw_rate_;
|
|
||||||
speed = 0;
|
|
||||||
turn = -1;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case KEYCODE_W_CAP:
|
|
||||||
max_tv = run_vel_;
|
|
||||||
speed = 1;
|
|
||||||
turn = 0;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
case KEYCODE_S_CAP:
|
|
||||||
max_tv = run_vel_;
|
|
||||||
speed = -1;
|
|
||||||
turn = 0;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
case KEYCODE_A_CAP:
|
|
||||||
max_rv = yaw_rate_run_;
|
|
||||||
speed = 0;
|
|
||||||
turn = 1;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
case KEYCODE_D_CAP:
|
|
||||||
max_rv = yaw_rate_run_;
|
|
||||||
speed = 0;
|
|
||||||
turn = -1;
|
|
||||||
dirty = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
max_tv = walk_vel_;
|
|
||||||
max_rv = yaw_rate_;
|
|
||||||
speed = 0;
|
|
||||||
turn = 0;
|
|
||||||
dirty = false;
|
|
||||||
}
|
|
||||||
cmdvel_.linear.x = speed * max_tv;
|
|
||||||
cmdvel_.angular.z = turn * max_rv;
|
|
||||||
pub_.publish(cmdvel_);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue