ROS在Raspberry Pi上的实际使用-第3部分

下午好,哈伯亲爱的读者们!

我继续阅读有关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中的另一个软件包则更加方便。但是在下一篇文章中将对此进行更多介绍。

Source: https://habr.com/ru/post/zh-CN390851/


All Articles