Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <termios.h>
00019 #include <signal.h>
00020 #include <stdio.h>
00021 #include <stdlib.h>
00022
00023 #include "ros/ros.h"
00024
00025 #include <sensor_msgs/Joy.h>
00026
00027
00028
00029
00030 #define KEYCODE_N 0x6E //run
00031 #define KEYCODE_M 0x6D //mode
00032 #define KEYCODE_H 0x68 //help
00033
00034
00035
00036 #define KEYCODE_A 0x61
00037 #define KEYCODE_D 0x64
00038 #define KEYCODE_S 0x73
00039 #define KEYCODE_W 0x77
00040 #define KEYCODE_Q 0x71
00041 #define KEYCODE_E 0x65
00042
00043
00044
00045 #define KEYCODE_1 0x31
00046 #define KEYCODE_2 0x32
00047 #define KEYCODE_3 0x33
00048 #define KEYCODE_4 0x34
00049 #define KEYCODE_5 0x35
00050 #define KEYCODE_6 0x36
00051 #define KEYCODE_7 0x37
00052 #define KEYCODE_8 0x38
00053
00054
00055
00056
00057 #define KEYCODE_R 0x72
00058 #define KEYCODE_T 0x74
00059 #define KEYCODE_Z 0x7A
00060 #define KEYCODE_U 0x75
00061 #define KEYCODE_I 0x69
00062
00063
00064
00065
00066 #define KEYCODE_S 0x73
00067 #define KEYCODE_D 0x64
00068 #define KEYCODE_F 0x66
00069 #define KEYCODE_G 0x67
00070
00071 #define KEYCODE_Y 0x79
00072 #define KEYCODE_X 0x78
00073 #define KEYCODE_C 0x63
00074 #define KEYCODE_V 0x76
00075 #define KEYCODE_B 0x62
00076
00077
00078
00079 const int PUBLISH_FREQ = 5.0;
00080
00081 int kfd = 0;
00082 struct termios cooked, raw;
00083
00084 bool fast_toggle,mode;
00085
00086 void quit(int sig)
00087 {
00088 tcsetattr(kfd, TCSANOW, &cooked);
00089 exit(0);
00090 }
00091
00092
00093 void composeJoyMessage(sensor_msgs::Joy &msg, char c)
00094 {
00095 msg.buttons[5]=0;
00096
00097 if(fast_toggle)
00098 msg.buttons[7]=1;
00099
00100 if(mode)
00101 {
00102 switch(c)
00103 {
00104
00105 case KEYCODE_1:
00106 msg.buttons[0]=1;
00107 msg.axes[4]=1.0;
00108 msg.buttons[5]=1;
00109 break;
00110 case KEYCODE_2:
00111 msg.buttons[0]=1;
00112 msg.axes[5]=1.0;
00113 msg.buttons[5]=1;
00114 break;
00115 case KEYCODE_3:
00116 msg.buttons[1]=1;
00117 msg.axes[4]=1.0;
00118 msg.buttons[5]=1;
00119 break;
00120 case KEYCODE_4:
00121 msg.buttons[1]=1;
00122 msg.axes[5]=1.0;
00123 msg.buttons[5]=1;
00124 break;
00125 case KEYCODE_5:
00126 msg.buttons[2]=1;
00127 msg.axes[4]=1.0;
00128 msg.buttons[5]=1;
00129 break;
00130 case KEYCODE_6:
00131 msg.buttons[2]=1;
00132 msg.axes[5]=1.0;
00133 msg.buttons[5]=1;
00134 break;
00135 case KEYCODE_7:
00136 msg.buttons[3]=1;
00137 msg.axes[4]=1.0;
00138 msg.buttons[5]=1;
00139 break;
00140 case KEYCODE_8:
00141 msg.buttons[3]=1;
00142 msg.axes[5]=1.0;
00143 msg.buttons[5]=1;
00144 break;
00145 case KEYCODE_Y:
00146 msg.buttons[6]=1;
00147 msg.axes[4]=1.0;
00148 msg.buttons[5]=1;
00149 break;
00150 case KEYCODE_S:
00151 msg.buttons[6]=1;
00152 msg.axes[5]=1.0;
00153 msg.buttons[5]=1;
00154 break;
00155 case KEYCODE_C:
00156 msg.buttons[4]=1;
00157 msg.axes[4]=1.0;
00158 msg.buttons[5]=1;
00159 break;
00160 case KEYCODE_F:
00161 msg.buttons[4]=1;
00162 msg.axes[5]=1.0;
00163 msg.buttons[5]=1;
00164 break;
00165
00166
00167
00168
00169
00170
00171
00172 case KEYCODE_Q:
00173 msg.buttons[0]=1;
00174 msg.axes[4]=-1.0;
00175 msg.buttons[5]=1;
00176 break;
00177 case KEYCODE_W:
00178 msg.buttons[0]=1;
00179 msg.axes[5]=-1.0;
00180 msg.buttons[5]=1;
00181 break;
00182 case KEYCODE_E:
00183 msg.buttons[1]=1;
00184 msg.axes[4]=-1.0;
00185 msg.buttons[5]=1;
00186 break;
00187 case KEYCODE_R:
00188 msg.buttons[1]=1;
00189 msg.axes[5]=-1.0;
00190 msg.buttons[5]=1;
00191 break;
00192 case KEYCODE_T:
00193 msg.buttons[2]=1;
00194 msg.axes[4]=-1.0;
00195 msg.buttons[5]=1;
00196 break;
00197 case KEYCODE_Z:
00198 msg.buttons[2]=1;
00199 msg.axes[5]=-1.0;
00200 msg.buttons[5]=1;
00201 break;
00202 case KEYCODE_U:
00203 msg.buttons[3]=1;
00204 msg.axes[4]=-1.0;
00205 msg.buttons[5]=1;
00206 break;
00207 case KEYCODE_I:
00208 msg.buttons[3]=1;
00209 msg.axes[5]=-1.0;
00210 msg.buttons[5]=1;
00211 break;
00212 case KEYCODE_A:
00213 msg.buttons[6]=1;
00214 msg.axes[4]=-1.0;
00215 msg.buttons[5]=1;
00216 break;
00217 case KEYCODE_X:
00218 msg.buttons[6]=1;
00219 msg.axes[5]=-1.0;
00220 msg.buttons[5]=1;
00221 break;
00222 case KEYCODE_D:
00223 msg.buttons[4]=1;
00224 msg.axes[4]=-1.0;
00225 msg.buttons[5]=1;
00226 break;
00227 case KEYCODE_V:
00228 msg.buttons[4]=1;
00229 msg.axes[5]=-1.0;
00230 msg.buttons[5]=1;
00231 break;
00232
00233
00234
00235
00236
00237 }
00238 }
00239 else
00240 {
00241 switch(c)
00242 {
00243 case KEYCODE_W:
00244 msg.axes[1]=1.0;
00245 msg.buttons[5]=1;
00246 break;
00247 case KEYCODE_S:
00248 msg.axes[1]=-1.0;
00249 msg.buttons[5]=1;
00250 break;
00251 case KEYCODE_A:
00252 msg.axes[0]=1.0;
00253 msg.buttons[5]=1;
00254 break;
00255 case KEYCODE_D:
00256 msg.axes[0]=-1.0;
00257 msg.buttons[5]=1;
00258 break;
00259 case KEYCODE_Q:
00260 msg.axes[2]=1.0;
00261 msg.buttons[5]=1;
00262 break;
00263 case KEYCODE_E:
00264 msg.axes[2]=-1.0;
00265 msg.buttons[5]=1;
00266 break;
00267 }
00268 }
00269 }
00270
00271
00272 void showHelp()
00273 {
00274 puts("");
00275 puts("Reading from keyboard");
00276 puts("---------------------------");
00277 puts("Use 'm' to toggle modes (joint/platform)");
00278 puts("Use 'n' to toggle run");
00279 puts("---------------------------");
00280 puts("In platform_mode");
00281 puts("Use 'wasd' to translate");
00282 puts("Use 'qe' to yaw");
00283 puts("---------------------------");
00284 puts("In joint_mode");
00285 puts("Use '1'-'7' and 'q'-'u' for arm");
00286 puts("Use '8' and 'i' for tray");
00287 puts("Use 'a'-'f' and 'y'-'v' for torso");
00288 puts("---------------------------");
00289 puts("Use 'h' to show this help");
00290 puts("Hit 'SPACE' to stop movement");
00291 puts("");
00292 }
00293
00294
00295 int main(int argc, char **argv)
00296 {
00297 ros::init(argc, argv, "keyboard_publisher");
00298 ros::NodeHandle n;
00299
00300 puts("");
00301 puts("Reading from keyboard");
00302 puts("---------------------------");
00303 puts("Use 'm' to toggle modes (joint/platform)");
00304 puts("Use 'n' to toggle run");
00305 puts("---------------------------");
00306 puts("In platform_mode");
00307 puts("Use 'wasd' to translate");
00308 puts("Use 'qe' to yaw");
00309 puts("---------------------------");
00310 puts("In joint_mode");
00311 puts("Use '1'-'7' and 'q'-'u' for arm");
00312 puts("Use '8' and 'i' for tray");
00313 puts("Use 'a'-'f' and 'y'-'v' for torso");
00314 puts("---------------------------");
00315 puts("Use 'h' to show this help");
00316 puts("Hit 'SPACE' to stop movement");
00317 puts("");
00318
00319 signal(SIGINT,quit);
00320
00321
00322 tcgetattr(kfd, &cooked);
00323 memcpy(&raw, &cooked, sizeof(struct termios));
00324 raw.c_lflag &=~ (ICANON | ECHO);
00325
00326 raw.c_cc[VEOL] = 1;
00327 raw.c_cc[VEOF] = 2;
00328
00329
00330 tcsetattr(kfd, TCSANOW, &raw);
00331
00332
00333 fast_toggle=false;
00334 mode=false;
00335
00336 ros::Publisher keyboard_pub = n.advertise<sensor_msgs::Joy>("joy", 1);
00337 char c;
00338
00339 while (ros::ok())
00340 {
00341 ros::spinOnce();
00342
00343 sensor_msgs::Joy msg;
00344 msg.axes.resize(6);
00345 msg.buttons.resize(12);
00346
00347
00348 if(read(kfd, &c, 1) < 0)
00349 {
00350 perror("read():");
00351 exit(-1);
00352 }
00353
00354
00355
00356 switch(c)
00357 {
00358
00359 case KEYCODE_N:
00360 if(fast_toggle)
00361 {
00362 fast_toggle=false;
00363 ROS_INFO("fast_mode: OFF");
00364 }
00365 else
00366 {
00367 fast_toggle=true;
00368 ROS_INFO("fast_mode: ON");
00369 }
00370 break;
00371
00372 case KEYCODE_M:
00373 if(mode)
00374 {
00375 mode=false;
00376 ROS_INFO("Mode: Platform_Mode");
00377 }
00378 else
00379 {
00380 mode=true;
00381 ROS_INFO("Mode: Joint_Mode");
00382 }
00383 break;
00384 case KEYCODE_H:
00385 showHelp();
00386 break;
00387 }
00388
00389
00390 composeJoyMessage(msg, c);
00391
00392 keyboard_pub.publish(msg);
00393 }
00394
00395
00396 return 0;
00397 }
00398