ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
In the above answers the getchar() function blocks the ros's while loop, If you want the loop to run at a particular rate and to get inputs when it's available replace the getch() function definition with the below.
You can change the timeout.tv_sec, timeout.tv_sec to change the time to wait for user input. filedesc is 0 for taking input from keyboard, most probably it's similar to stdin but not sure.
char getch()
{
fd_set set;
struct timeval timeout;
int rv;
char buff = 0;
int len = 1;
int filedesc = 0;
FD_ZERO(&set);
FD_SET(filedesc, &set);
timeout.tv_sec = 0;
timeout.tv_usec = 1000;
rv = select(filedesc + 1, &set, NULL, NULL, &timeout);
struct termios old = {0};
if (tcgetattr(filedesc, &old) < 0)
ROS_ERROR("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(filedesc, TCSANOW, &old) < 0)
ROS_ERROR("tcsetattr ICANON");
if(rv == -1)
ROS_ERROR("select");
else if(rv == 0)
ROS_INFO("no_key_pressed");
else
read(filedesc, &buff, len );
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(filedesc, TCSADRAIN, &old) < 0)
ROS_ERROR ("tcsetattr ~ICANON");
return (buff);
}
If you require an example code visit here: keyboard_non_blocking_input_node.cpp
This link helped in implementing this: http://stackoverflow.com/a/2918709
I Hope This Helps!!!!!