下午好,哈伯亲爱的读者们!我继续阅读有关Raspberry Pi上ROS的实际使用的系列文章(第一篇文章,第二篇文章)。在本文中,我们将使用ros-teleop堆栈中的teleop_twist_keyboard包通过按键盘上的键来控制机器人。ros-teleop堆栈除了此程序包之外,还包括其他几个用于各种控制方法(例如,使用操纵杆)的程序包。请谁准备好开始研究teleop_twist_keyboard。带tmux的多端子
同时,我想向您介绍一个技巧,该技巧使您可以在多个终端中同时通过SSH在Raspberry Pi上远程工作。为此,请在RPi上安装tmux实用程序。$ sudo apt-get install tmux
之后,运行该实用程序:$ tmux
终端窗口的底部应显示绿色条,窗口号为0。0.tmux是一种非常方便的终端窗口管理器,它允许您通过以几种不同的方式放置它们(在单独的终端窗口(窗口),窗口面板(窗格))之间进行切换很方便。按键盘上的Ctrl + B和C,另一个窗口应显示为数字1。也可以尝试按Ctrl + B和%的组合。当前的终端窗口将在中间被垂直的绿色条纹分成两个窗口(窗格)。如果按Ctrl + B组合键:,然后输入“分割窗口”,则该窗口将水平分为两个相同的窗口。要删除面板(窗格),请使用Ctrl + B,X组合键,然后按Y。要切换到同一窗口中的另一个面板,请使用Ctrl + B,O组合键。要通过窗口号在终端窗口之间切换,请使用Ctrl + B B,<窗口号>。现在,将程序的启动添加到〜/ .bashrc文件中,以在打开新终端时自动启动。将以下行添加到文件中:[[ $TERM != "screen" ]] && exec tmux
使用teleop_twist_keyboard
现在,让我们熟悉teleop_twist_keyboard软件包。从teleop_twist_keyboard包中运行teleop_twist_keyboard.py脚本作为常规ROS节点:$ roscore
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
我们得出这样的结论:Reading from the keyboard and Publishing to Twist!
---------------------------
Moving around:
u i o
j k l
m , .
q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
anything else : stop
CTRL-C to quit
让我们列出所有当前活动的主题:$ rostopic list
主题/ cmd_vel应该出现在列表中。关于此主题,每次在键盘上按下某个键时,teleop_twist_keyboard节点都会发布消息。我们显示在主题/ cmd_vel中发布的消息的输出:$ rostopic echo cmd_vel
运行rqt_graph以图形形式表示ROS计算图。计算图图显示了所有活动节点和连接它们的主题。$ rosrun rqt_graph rqt_graph
在这里,我们看到teleop_twist_keyboard节点将消息发布到主题/ cmd_vel,而rostopic节点订阅了该主题(rostopic echo命令)。让我们找出在/ cmd_vel主题上发布的消息类型:$ rostopic type /cmd_vel
该命令将输出以下行:geometry_msgs/Twist
这意味着消息是标准ROS包geometry_msgs中的Twist类型。我们还可以使用rosmsg命令获取有关消息结构的信息:$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
场“线性”负责线速度,“角”负责角速度。按下“ i”键,输出将如下所示(与前进有关):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
按“ k”键,输出将如下所示(停止):linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
按“ u”键,输出将如下所示(向左转):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0
---
最后,当您按“ o”键时,我们得到以下输出(向右转):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -1.0
---
按键“ j”和“ l”负责左右旋转(不向前移动)。使用teleop_twist_keyboard的键盘机器人控制
我已经写了用于控制机器人的十字形草图,方法是按下按键。我们只订阅主题/ cmd_vel,然后根据每个速度的接收值向运动控制器提供必要的命令(前进,停止,左转或右转)。草图可以从这里下载。让我们更详细地分析草图代码。在文件的开头,除了标准的ros.h头文件外,我们还连接了两个附加文件,它们的消息类型为geometry_msgs / Twist.h和geometry_msgs / Vector3.h:#include <geometry_msgs/Twist.h>
#include <geometry_msgs/Vector3.h>
我们声明一个节点处理程序ros :: NodeHandle:ros::NodeHandle nh;
主要值是messageCb方法:void messageCb(const geometry_msgs::Twist& message)
{
geometry_msgs::Vector3 linear = message.linear;
float forward_vel = float(linear.x);
if(forward_vel == 0) { stop(); return; }
geometry_msgs::Vector3 angular = message.angular;
float ang_vel = float(angular.z);
if(ang_vel > 0) { turnLeft(); }
else if(ang_vel < 0) { turnRight(); }
else { goForward(); }
}
在这种方法中,我们处理从cmd_vel主题收到的消息。在forward_vel变量中,我们将线性速度保持在角度变量-角中。线速度使我们能够跟踪停止命令(值0)。角速度决定旋转方向(如果大于0,则向左旋转,小于0则向右旋转,如果0则向前移动)。为主题/ cmd_vel创建订户:ros::Subscriber<geometry_msgs::Twist> sub("/cmd_vel", &messageCb);
参考消息处理方法(messageCb)和接收到的消息类型-geometry_msgs :: Twist。在脚本末尾,rosserial_arduino的标准素描方法如下:nh.initNode();
nh.subscribe(sub);
Serial.begin(57600);
运行rosserial_arduino服务器:$ rosrun rosserial_python serial_node _port:=/dev/ttyACM0
并将草图上传到Arduino开发板。切换到运行teleop_twist_keyboard节点的终端,尝试按“ u”,“ i”,“ o”和“ k”键,并在终端中检查rosserial服务器的输出。因此,使用teleop_twist_keyboard包,我们现在可以通过传输运动命令来执行对机器人的简单远程控制:前进,停止,左转或右转。将来,我们将学习如何使用操纵杆控制机器人,而使用ROS中的另一个软件包则更加方便。但是在下一篇文章中将对此进行更多介绍。