|
|
@ -16,61 +16,60 @@ |
|
|
* along with Hand Control. If not, see <http://www.gnu.org/licenses/>.
|
|
|
* along with Hand Control. If not, see <http://www.gnu.org/licenses/>.
|
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <ros/ros.h> |
|
|
#include <ros/ros.h> |
|
|
#include <ros/time.h> |
|
|
#include <ros/time.h> |
|
|
#include <locale.h> |
|
|
#include <locale.h> |
|
|
#include "display.h" |
|
|
|
|
|
|
|
|
|
|
|
#include <std_msgs/Empty.h> |
|
|
#include <std_msgs/Empty.h> |
|
|
#include <geometry_msgs/Twist.h> |
|
|
#include <geometry_msgs/Twist.h> |
|
|
#include <ardrone_autonomy/Navdata.h> |
|
|
#include <ardrone_autonomy/Navdata.h> |
|
|
|
|
|
|
|
|
class NavdataCallback |
|
|
#include "./display.h" |
|
|
{ |
|
|
|
|
|
|
|
|
class NavdataCallback { |
|
|
private: |
|
|
private: |
|
|
boost::shared_ptr<Curses> term; |
|
|
boost::shared_ptr<Curses> term; |
|
|
|
|
|
|
|
|
public: |
|
|
public: |
|
|
NavdataCallback(const boost::shared_ptr<Curses>& terminal) : |
|
|
explicit NavdataCallback(const boost::shared_ptr<Curses>& terminal) : |
|
|
term(terminal) {} |
|
|
term(terminal) {} |
|
|
|
|
|
|
|
|
void operator()(const ardrone_autonomy::Navdata::ConstPtr& msg) { |
|
|
void operator()(const ardrone_autonomy::Navdata::ConstPtr& msg) { |
|
|
term->update_nav_data(msg->batteryPercent, msg->state, msg->tm); |
|
|
term->update_nav_data(msg->batteryPercent, msg->state, msg->tm); |
|
|
} |
|
|
} |
|
|
}; // class NavdataCallback
|
|
|
}; |
|
|
|
|
|
|
|
|
class CmdVelCallback |
|
|
class CmdVelCallback { |
|
|
{ |
|
|
|
|
|
private: |
|
|
private: |
|
|
boost::shared_ptr<Curses> term; |
|
|
boost::shared_ptr<Curses> term; |
|
|
|
|
|
|
|
|
public: |
|
|
public: |
|
|
CmdVelCallback(const boost::shared_ptr<Curses>& terminal) : |
|
|
explicit CmdVelCallback(const boost::shared_ptr<Curses>& terminal) : |
|
|
term(terminal) {} |
|
|
term(terminal) {} |
|
|
|
|
|
|
|
|
void operator()(const geometry_msgs::Twist::ConstPtr& msg) { |
|
|
void operator()(const geometry_msgs::Twist::ConstPtr& msg) { |
|
|
term->update_topic(msg); |
|
|
term->update_topic(msg); |
|
|
} |
|
|
} |
|
|
}; // class CmdVelCallback
|
|
|
}; |
|
|
|
|
|
|
|
|
class Run |
|
|
class Run { |
|
|
{ |
|
|
|
|
|
private: |
|
|
private: |
|
|
std_msgs::Empty empty; |
|
|
std_msgs::Empty empty; |
|
|
ros::NodeHandle n; |
|
|
ros::NodeHandle n; |
|
|
ros::Rate loop_rate; |
|
|
ros::Rate loop_rate; |
|
|
ros::Publisher cmd, pub_takeoff, pub_land, pub_reset; |
|
|
ros::Publisher cmd, pub_takeoff, pub_land, pub_reset; |
|
|
ros::Subscriber data_subscriber, cmdvel_subscriber; |
|
|
ros::Subscriber data_subscriber, cmdvel_subscriber; |
|
|
void land() { pub_land.publish(empty); }; |
|
|
void land() { pub_land.publish(empty); } |
|
|
void takeoff() { pub_takeoff.publish(empty); }; |
|
|
void takeoff() { pub_takeoff.publish(empty); } |
|
|
void reset() { pub_reset.publish(empty); }; |
|
|
void reset() { pub_reset.publish(empty); } |
|
|
float x_speed, y_speed, z_speed, turn; |
|
|
float x_speed, y_speed, z_speed, turn; |
|
|
boost::shared_ptr<Curses> term; |
|
|
boost::shared_ptr<Curses> term; |
|
|
NavdataCallback data_callback; |
|
|
NavdataCallback data_callback; |
|
|
CmdVelCallback cmdvel_callback; |
|
|
CmdVelCallback cmdvel_callback; |
|
|
|
|
|
|
|
|
public: |
|
|
public: |
|
|
Run(const boost::shared_ptr<Curses>& terminal) : |
|
|
explicit Run(const boost::shared_ptr<Curses>& terminal) : |
|
|
data_callback(terminal), |
|
|
data_callback(terminal), |
|
|
cmdvel_callback(terminal), |
|
|
cmdvel_callback(terminal), |
|
|
term(terminal), |
|
|
term(terminal), |
|
|
@ -79,12 +78,18 @@ class Run |
|
|
y_speed(0.1), |
|
|
y_speed(0.1), |
|
|
z_speed(0.1), |
|
|
z_speed(0.1), |
|
|
turn(0.1) { |
|
|
turn(0.1) { |
|
|
cmd = n.advertise<geometry_msgs::Twist>("/cmd_vel",1); |
|
|
cmd = n.advertise<geometry_msgs::Twist>("/cmd_vel", 1); |
|
|
pub_takeoff = n.advertise<std_msgs::Empty>("/ardrone/takeoff", 1); |
|
|
pub_takeoff = n.advertise<std_msgs::Empty>("/ardrone/takeoff", 1); |
|
|
pub_land = n.advertise<std_msgs::Empty>("/ardrone/land", 1); |
|
|
pub_land = n.advertise<std_msgs::Empty>("/ardrone/land", 1); |
|
|
pub_reset = n.advertise<std_msgs::Empty>("/ardrone/reset", 1); |
|
|
pub_reset = n.advertise<std_msgs::Empty>("/ardrone/reset", 1); |
|
|
data_subscriber = n.subscribe<ardrone_autonomy::Navdata>("/ardrone/navdata", 1, data_callback); |
|
|
|
|
|
cmdvel_subscriber = n.subscribe<geometry_msgs::Twist>("/cmd_vel", 1, cmdvel_callback); |
|
|
data_subscriber = |
|
|
|
|
|
n.subscribe<ardrone_autonomy::Navdata>( |
|
|
|
|
|
"/ardrone/navdata", 1, data_callback); |
|
|
|
|
|
|
|
|
|
|
|
cmdvel_subscriber = |
|
|
|
|
|
n.subscribe<geometry_msgs::Twist>( |
|
|
|
|
|
"/cmd_vel", 1, cmdvel_callback); |
|
|
|
|
|
|
|
|
term->update_cmd_speed('x', x_speed); |
|
|
term->update_cmd_speed('x', x_speed); |
|
|
term->update_cmd_speed('y', y_speed); |
|
|
term->update_cmd_speed('y', y_speed); |
|
|
@ -97,10 +102,8 @@ class Run |
|
|
term->update_nav_data(a, s, time); |
|
|
term->update_nav_data(a, s, time); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void operator()() |
|
|
void operator()() { |
|
|
{ |
|
|
while (ros::ok()) { |
|
|
while (ros::ok()) |
|
|
|
|
|
{ |
|
|
|
|
|
ros::spinOnce(); |
|
|
ros::spinOnce(); |
|
|
|
|
|
|
|
|
geometry_msgs::Twist::Ptr msg(new geometry_msgs::Twist()); |
|
|
geometry_msgs::Twist::Ptr msg(new geometry_msgs::Twist()); |
|
|
@ -109,187 +112,158 @@ class Run |
|
|
|
|
|
|
|
|
char c = term->getchar(); |
|
|
char c = term->getchar(); |
|
|
|
|
|
|
|
|
switch(c) |
|
|
switch (c) { |
|
|
{ |
|
|
case 'k' : { // hover
|
|
|
case 'k' : |
|
|
|
|
|
{// hover
|
|
|
|
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("hover !"); |
|
|
term->log_sent("hover !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'i' : |
|
|
case 'i' : { // forward
|
|
|
{// forward
|
|
|
|
|
|
msg->linear.x = x_speed; |
|
|
msg->linear.x = x_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("forward !"); |
|
|
term->log_sent("forward !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case ';' : |
|
|
case ';' : { // backward
|
|
|
{// backward
|
|
|
|
|
|
msg->linear.x = -x_speed; |
|
|
msg->linear.x = -x_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("backward !"); |
|
|
term->log_sent("backward !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'h' : |
|
|
case 'h' : { // translate left
|
|
|
{//translate left
|
|
|
|
|
|
msg->linear.y = -y_speed; |
|
|
msg->linear.y = -y_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("translate left !"); |
|
|
term->log_sent("translate left !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'm' : |
|
|
case 'm' : { // translate right
|
|
|
{//translate right
|
|
|
|
|
|
msg->linear.y = y_speed; |
|
|
msg->linear.y = y_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("translate right !"); |
|
|
term->log_sent("translate right !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'j' : |
|
|
case 'j' : { // rotate left
|
|
|
{//rotate left
|
|
|
|
|
|
msg->angular.z = turn; |
|
|
msg->angular.z = turn; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("rotate left !"); |
|
|
term->log_sent("rotate left !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'l' : |
|
|
case 'l' : { // rotate right
|
|
|
{//rotate right
|
|
|
|
|
|
msg->angular.z = -turn; |
|
|
msg->angular.z = -turn; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("rotate right !"); |
|
|
term->log_sent("rotate right !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'u' : |
|
|
case 'u' : { // turn left
|
|
|
{//turn left
|
|
|
|
|
|
msg->angular.z = turn; |
|
|
msg->angular.z = turn; |
|
|
msg->linear.x = x_speed; |
|
|
msg->linear.x = x_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("forward left !"); |
|
|
term->log_sent("forward left !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'o' : |
|
|
case 'o' : { // turn right
|
|
|
{//turn right
|
|
|
|
|
|
msg->angular.z = -turn; |
|
|
msg->angular.z = -turn; |
|
|
msg->linear.x = x_speed; |
|
|
msg->linear.x = x_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("forward right !"); |
|
|
term->log_sent("forward right !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case ',' : |
|
|
case ',' : { // turn left backward
|
|
|
{//turn left backward
|
|
|
|
|
|
msg->angular.z = turn; |
|
|
msg->angular.z = turn; |
|
|
msg->linear.x = -x_speed; |
|
|
msg->linear.x = -x_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("backward left !"); |
|
|
term->log_sent("backward left !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case ':' : |
|
|
case ':' : { // turn right backward
|
|
|
{//turn right backward
|
|
|
|
|
|
msg->angular.z = -turn; |
|
|
msg->angular.z = -turn; |
|
|
msg->linear.x = -x_speed; |
|
|
msg->linear.x = -x_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("backward right !"); |
|
|
term->log_sent("backward right !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'y' : |
|
|
case 'y' : { // up
|
|
|
{//up
|
|
|
|
|
|
msg->linear.z = z_speed; |
|
|
msg->linear.z = z_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("up !"); |
|
|
term->log_sent("up !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'n' : |
|
|
case 'n' : { // down
|
|
|
{//down
|
|
|
|
|
|
msg->linear.z = -z_speed; |
|
|
msg->linear.z = -z_speed; |
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("down !"); |
|
|
term->log_sent("down !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 't' : |
|
|
case 't' : { // takeoff
|
|
|
{//takeoff
|
|
|
|
|
|
takeoff(); |
|
|
takeoff(); |
|
|
term->log_sent("takeoff !"); |
|
|
term->log_sent("takeoff !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'b' : |
|
|
case 'b' : { // land
|
|
|
{//land
|
|
|
|
|
|
land(); |
|
|
land(); |
|
|
term->log_sent("land !"); |
|
|
term->log_sent("land !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'g' : |
|
|
case 'g' : { // reset
|
|
|
{//reset
|
|
|
|
|
|
reset(); |
|
|
reset(); |
|
|
term->log_sent("reset !"); |
|
|
term->log_sent("reset !"); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'a' : |
|
|
case 'a' : { // + x_speed
|
|
|
{// + x_speed
|
|
|
|
|
|
x_speed *= 1.1; |
|
|
x_speed *= 1.1; |
|
|
term->update_cmd_speed('x', x_speed); |
|
|
term->update_cmd_speed('x', x_speed); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'w' : |
|
|
case 'w' : { // - x_speed
|
|
|
{// - x_speed
|
|
|
|
|
|
x_speed *= 0.9; |
|
|
x_speed *= 0.9; |
|
|
term->update_cmd_speed('x', x_speed); |
|
|
term->update_cmd_speed('x', x_speed); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'z' : |
|
|
case 'z' : { // + y_speed
|
|
|
{// + y_speed
|
|
|
|
|
|
y_speed *= 1.1; |
|
|
y_speed *= 1.1; |
|
|
term->update_cmd_speed('y', y_speed); |
|
|
term->update_cmd_speed('y', y_speed); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'x' : |
|
|
case 'x' : { // - y_speed
|
|
|
{// - y_speed
|
|
|
|
|
|
y_speed *= 0.9; |
|
|
y_speed *= 0.9; |
|
|
term->update_cmd_speed('y', y_speed); |
|
|
term->update_cmd_speed('y', y_speed); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'e' : |
|
|
case 'e' : { // + z_speed
|
|
|
{// + z_speed
|
|
|
|
|
|
z_speed *= 1.1; |
|
|
z_speed *= 1.1; |
|
|
term->update_cmd_speed('z', z_speed); |
|
|
term->update_cmd_speed('z', z_speed); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'c' : |
|
|
case 'c' : { // - z_speed
|
|
|
{// - z_speed
|
|
|
|
|
|
z_speed *= 0.9; |
|
|
z_speed *= 0.9; |
|
|
term->update_cmd_speed('z', z_speed); |
|
|
term->update_cmd_speed('z', z_speed); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'r' : |
|
|
case 'r' : { // + turn speed
|
|
|
{// + turn speed
|
|
|
|
|
|
turn *= 1.1; |
|
|
turn *= 1.1; |
|
|
term->update_cmd_speed('t', turn); |
|
|
term->update_cmd_speed('t', turn); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case 'v' : |
|
|
case 'v' : { // - turn speed
|
|
|
{// - turn speed
|
|
|
|
|
|
turn *= 0.9; |
|
|
turn *= 0.9; |
|
|
term->update_cmd_speed('t', turn); |
|
|
term->update_cmd_speed('t', turn); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
default : |
|
|
default : { |
|
|
{ |
|
|
|
|
|
cmd.publish(msg); |
|
|
cmd.publish(msg); |
|
|
term->log_sent("hover !"); |
|
|
term->log_sent("hover !"); |
|
|
} |
|
|
} |
|
|
} // switch(c)
|
|
|
} // switch(c)
|
|
|
loop_rate.sleep(); |
|
|
loop_rate.sleep(); |
|
|
} // while
|
|
|
} // while
|
|
|
} //void run()
|
|
|
} // void run()
|
|
|
|
|
|
|
|
|
}; // class Run
|
|
|
}; // class Run
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) |
|
|
int main(int argc, char** argv) { |
|
|
{ |
|
|
|
|
|
setlocale(LC_ALL, ""); |
|
|
setlocale(LC_ALL, ""); |
|
|
ros::init(argc, argv, "keyboard_cmd"); |
|
|
ros::init(argc, argv, "keyboard_cmd"); |
|
|
boost::shared_ptr<Curses> term(new Curses()); |
|
|
boost::shared_ptr<Curses> term(new Curses()); |
|
|
Run fun(term); |
|
|
Run fun(term); |
|
|
fun(); |
|
|
fun(); |
|
|
return 0; |
|
|
return 0; |
|
|
} // main
|
|
|
} |
|
|
|
|
|
|
|
|
|