在上一篇博客中,使用了话题节点来控制无人车运动。但是该程序仅能进行固定方向的运动,因此本博客中使用键盘来控制无人车运动。使用的话题依旧是:
geometry_msgs::Twist
设定好一个固定的速度值:
double linear_speed = 1.0; // 线速度设为1 m/s
double angular_speed = 1.0; // 角速度设为1 rad/s
然后就可以获取键盘的信息,来控制无人车进行运动:
while (ros::ok())
{
int c = getch();
if (c == '\x03' || c == 'q') // 按下Ctrl+C或者q键退出
break;
switch (c)
{
case '\x1b': // 如果是转义字符,则继续读取两个字符来判断具体方向
getch(); // 忽略[
switch (getch())
{
case 'A': // 上箭头,前进
cmd_vel_msg.linear.x = linear_speed;
cmd_vel_msg.angular.z = 0.0;
break;
case 'B': // 下箭头,后退
cmd_vel_msg.linear.x = -linear_speed;
cmd_vel_msg.angular.z = 0.0;
break;
case 'C': // 右箭头,右转
cmd_vel_msg.linear.x = 0.0;
cmd_vel_msg.angular.z = -angular_speed;
break;
case 'D': // 左箭头,左转
cmd_vel_msg.linear.x = 0.0;
cmd_vel_msg.angular.z = angular_speed;
break;
}
break;
}
cmd_vel_pub.publish(cmd_vel_msg);
ros::spinOnce();
}
int getch()
{
static struct termios oldt, newt;
tcgetattr(STDIN_FILENO, &oldt); // 保存终端旧设置
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO); // 禁用标准模式和回显模式
tcsetattr(STDIN_FILENO, TCSANOW, &newt); // 应用新设置
int c = getchar(); // 读取字符
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // 恢复旧设置
return c;
}