Project

General

Profile

Revision 8ecb9700

ID8ecb9700093a50b1fd55a99eeb5c63252cd3804a

Added by Alex Zirbel over 12 years ago

Added a keyboard control node.

The new file, keyboard_control.cpp, mimics the turtlesim keyboard reading. It responds to wasd, arrow keys, and "rf" (for up/down), and right now simply outputs ROS_INFO to show what was pressed.

View differences:

mikrokopter/CMakeLists.txt
27 27

  
28 28
rosbuild_add_executable(externctrl_client src/externctrl_client.cpp)
29 29
rosbuild_add_executable(wasd_nav src/wasd_nav.cpp src/nav_lib.cpp)
30
rosbuild_add_executable(keyboard_control src/keyboard_control.cpp src/nav_lib.cpp)
mikrokopter/src/keyboard_control.cpp
1
/**
2
 * @brief A node responsible for keyboard commands which will be sent to
3
 *        the MikroKopter
4
 *
5
 * @author CMU Quadrotor Project
6
 * @author Alex Zirbel
7
 */
8

  
9
#include <ros/ros.h>
10
#include <signal.h>
11
#include <termios.h>
12
#include <stdio.h>
13

  
14
#define KEYCODE_R 0x43 
15
#define KEYCODE_L 0x44
16
#define KEYCODE_U 0x41
17
#define KEYCODE_D 0x42
18
#define KEYCODE_Q 0x71
19

  
20
// Keyboard control variables
21
int kfd = 0;
22
struct termios cooked, raw;
23

  
24
class KeyboardControl
25
{
26
    public:
27
        KeyboardControl();
28
        void keyLoop();
29

  
30
    private:
31
        ros::NodeHandle n;
32
};
33

  
34
KeyboardControl::KeyboardControl()
35
{
36
}
37

  
38
void quit(int sig)
39
{
40
    tcsetattr(kfd, TCSANOW, &cooked);
41
    ros::shutdown();
42
    exit(0);
43
}
44

  
45
void KeyboardControl::keyLoop()
46
{
47
    char c;
48
    bool dirty=false;
49

  
50
    // get the console in raw mode
51
    tcgetattr(kfd, &cooked);
52
    memcpy(&raw, &cooked, sizeof(struct termios));
53
    raw.c_lflag &=~ (ICANON | ECHO);
54

  
55
    // Setting a new line, then end of file                         
56
    raw.c_cc[VEOL] = 1;
57
    raw.c_cc[VEOF] = 2;
58
    tcsetattr(kfd, TCSANOW, &raw);
59

  
60
    puts("Reading from keyboard");
61
    puts("---------------------------");
62
    puts("Use arrow keys to command the quadrotor.");
63

  
64
    while(true)
65
    {
66
        // get the next event from the keyboard  
67
        if(read(kfd, &c, 1) < 0)
68
        {
69
            perror("read():");
70
            exit(-1);
71
        }
72

  
73
        //ROS_INFO("key press: 0x%02X\n", c);
74
        //ROS_INFO("key press: %c\n", c);
75

  
76
        switch(c)
77
        {
78
            case KEYCODE_L:
79
            case 'a':
80
                ROS_INFO("W");
81
                dirty = true;
82
                break;
83
            case KEYCODE_R:
84
            case 'd':
85
                ROS_INFO("E");
86
                dirty = true;
87
                break;
88
            case KEYCODE_U:
89
            case 'w':
90
                ROS_INFO("N");
91
                dirty = true;
92
                break;
93
            case KEYCODE_D:
94
            case 's':
95
                ROS_INFO("S");
96
                dirty = true;
97
                break;
98
            case 'r':
99
                ROS_INFO("UP");
100
                break;
101
            case 'f':
102
                ROS_INFO("DOWN");
103
                break;
104
        }
105

  
106
        if(dirty)
107
        {
108
            dirty=false;
109
        }
110
    }
111

  
112
    return;
113
}
114

  
115
int main(int argc, char** argv)
116
{
117
    ros::init(argc, argv, "keyboard_control");
118
    KeyboardControl teleop_turtle;
119

  
120
    signal(SIGINT,quit);
121

  
122
    // This commands loops infinitely
123
    teleop_turtle.keyLoop();
124

  
125
    return(0);
126
}
127

  
128

  

Also available in: Unified diff