Bootstrap

Qt(二)

在PyQt完成Hello World应用程序之后,我们可以讨论一个用于控制ChefBot的GUI。 构建GUI的主要用途是创建一种更容易的方式来控制机器人,例如,如果将机器人部署在酒店中以提供食物,则控制该机器人的人不需要了解复杂命令的启动, 停止这个机器人 因此为ChefBot构建GUI可以降低复杂性并使用户更容易。 我们计划使用PyQt,ROS和Python接口构建GUI。 ChefBot ROS软件包可以在GitHub上获得,链接如下:

https://github.com/qboticslabs/Chefbot_ROS_pkg.git

如果还没有克隆代码,现在可以使用以下命令:

git clone https://github.com/qboticslabs/Chefbot_ROS_pkg.git

名为robot_gui.py的GUI代码放置在包中的scripts文件夹中。
以下屏幕截图显示了我们为ChefBot设计的GUI:
这里写图片描述
GUI具有以下功能:

它可以监控机器人电池状态和机器人状态。 机器人状态指示机器人的工作状态,例如,如果机器人遇到错误,则会在该GUI上显示错误。 它可以命令机器人移动到桌子位置,以传送食物。 在GUI上有一个旋转框小部件来输入表格位置。 目前,我们正在为九个桌面设计这个GUI,但是我们可以根据要求将其扩展成任何数量。 输入表号后,可以通过点击Go按钮命令机器人去表格。 机器人将进入该位置。 如果我们要将机器人返回到初始位置,我们可以点击主页按钮。 如果要取消当前的机器人运动,单击取消以停止机器人。 这个GUI应用程序的工作如下:
当我们必须在酒店中部署ChefBot时,我们要做的第一个步骤是创建房间的地图。 在正确映射整个房间后,我们必须将地图保存在机器人的PC上。 机器人只做一次映射,映射后我们可以运行本地化和导航程序,并命令机器人进入地图上的位置。 ChefBot ROS套装配有一个类似酒店的环境的地图和仿真模型。 我们现在可以运行这个模拟和本地化来测试GUI,在下一章中,我们可以讨论如何使用GUI来控制硬件。 如果您在本地系统上安装ChefBot ROS软件包,我们可以模拟酒店环境并测试GUI。
使用以下命令,以类似酒店的方式启动ChefBot模拟:

roslaunch chefbot_gazebo chefbot_hotel_world.launch

在启动ChefBot模拟之后,我们可以使用已经建立的地图来运行本地化和导航例程。 地图放在chefbot_bringup包中。 我们可以在这个包中看到一个地图文件夹。 在这里,我们将使用此地图进行此测试。 我们可以使用以下命令加载本地化和导航例程:

roslaunch chefbot_gazebo amcl_demo.launch map_file:=/home/lentin/catkin_ws/src/chefbot/chefbot_bringup/map/hotel1.yaml

地图文件的路径可以在不同的系统中更改,因此使用系统中的路径代替此路径。
如果所提到的路径正确,它将开始运行ROS导航堆栈。 如果我们想要在地图上看到机器人位置或手动设置机器人的初始位置,我们可以使用以下命令使用RViz:

roslaunch chefbot_bringup view_navigation.launch

在RViz中,我们可以使用2D Nav Goal按钮命令机器人去任何地图坐标。
我们可以使用编程命令机器人去任何地图坐标。 ROS导航堆栈正在使用ROS actionlib库。 ROS actionlib库用于执行可抢占的任务,类似于ROS服务。 与ROS服务相比,我们可以在当时不想要的时候取消请求。
在GUI中,我们可以使用Python actionlib库命令机器人去映射坐标。 我们可以使用以下技术在地图上获取表格的位置。
启动模拟器和AMCL节点后,启动键盘远程操作,并将机器人移动到每个桌子附近。 使用以下命令获取机器人的平移和旋转:

rosrun tf tf_echo /map /base_link

当我们点击Go按钮时,该位置被馈送到导航堆栈,机器人计划其路径并达到目标。 我们甚至可以随时取消任务。 所以ChefBot GUI作为一个actionlib客户端,它将映射坐标发送到actionlib服务器,即导航堆栈。
我们现在可以运行机器人GUI来使用以下命令来控制机器人:

rosrun chefbot_bringup robot_gui.py

我们可以选择一个表号,然后点击Go按钮将机器人移动到每张桌子。
假设您克隆了文件并获取了robot_gui.py文件,我们可以讨论我们为actionlib客户端添加到Ui_Form()类中的主要插槽,并获取电池电量和机器人状态的值。
我们需要为此GUI应用程序导入以下Python模块:

import rospy import actionlib
from move_base_msgs.msg import * 
;