4、使用ROS

发布时间 2023-07-27 10:40:55作者: gary_123

Webots使用ROS

有两种方法在Webots中使用ROS

 第一个也是最简单的解决方案是使用标准ROS控制器。然而,这个解决方案不适用于Windows和macOS,它只适用于Linux。它是Webots默认控制器的一部分,在任何项目中都可用。该控制器可以在Webots中的任何机器人上使用,并充当ROS节点,将所有Webots功能作为服务或主题提供给其他ROS节点。
第二个名为自定义ROS控制器的解决方案要求您构建自己的Webots控制器,该控制器也将是使用Webots和ROS库的ROS节点。除了Linux之外,此解决方案还适用于Windows和macOS(Python)。它的设置有点困难,但允许更大的灵活性。
标准的ROS控制器
该控制器使用“libCppController”库,并根据机器人的配置在ROS网络上提出可用的Webots功能。使用“roscpp”库,它主要将这些Webot功能作为ROS服务提供,并使用标准消息类型来避免对第三方包的依赖。服务和消息的列表可以在这里找到。http://docs.ros.org/en/noetic/api/webots_ros/html/index-msg.html
在模拟过程中,可能有多个机器人或设备的实例以及连接到ROS网络的其他Webot应用程序。因此,控制器使用特定语法来声明其在网络上的服务或主题:
[robot_name_space]/[device_name]/[service/topic_name].
[robot_name_space]:ROS命名空间对服务、话题和参数进行分组。
[device_name]:由于同一个函数可以引用不同的设备,因此此字段将显示它引用的设备。
[service/topic_name]:此字段与其对应的Webots函数相同或非常接近。对于话题,它后面跟着采样周期。对于服务,它也是相应srv文件的名称。
使用标准的ROS控制器
 这个名为ros的控制器是预先编译好的,你不应该编辑它。你所要做的就是把它加载到机器人的控制器字段中;您将在控制器的默认列表中找到它。为了使用它,您必须构建一个ROS节点,该节点将使用不同的可用服务与机器人进行通信。这种ROS节点的好例子可以在webots_ROS存储库中找到,它们在webots_ROS包教程中有文档记录。

在教程9一章中,您将找到使用ROS运行示例模拟的说明。 https://github.com/cyberbotics/webots_ros;http://wiki.ros.org/webots_ros/Tutorials/Sample%20Simulations;https://www.cyberbotics.com/doc/guide/tutorial-9-using-ros?tab-os=linux

在下表中,您可以找到ros控制器参数的列表
 
参数:
--ROS_MASTER_URI=<address>:指定运行roscore的计算机的URI地址。
--name=<robot_unique_name>:指定一个预定义的[robot_unique_name],用作服务和主题的命名空间。请注意,您有责任避免不同机器人控制器之间的任何名称冲突。
--synchronize:默认情况下,即使没有连接到ros节点,ros控制器也不会阻止模拟。为了使模拟与ros节点同步,可以指定--synchronize参数,这样只要不调用robot time_step服务,模拟就不会运行。
--clock:使用clock话题来发布Webots的时间;
--use-sim-time:指定Webots时间应用作ROS时间。为了正确工作,您还应该定义--clock参数,并将ROS参数use_sim_time设置为true。
--auto-publish强制控制器在启动时自动启用所有设备并创建相应的话题。
--use-ros-control:初始化来自于ros_control的controller_manager;
--robot-description[={robot_description_prefix}]:显示包含机器人URDF的robot_description ROS参数。robot_description_prefix参数是可选的,它对应于wb_robot_get_urdf函数的前缀参数。
注意:默认情况下,robot的命名空间为空,其名称后面跟着进程的ID和计算机的IP地址。在控制器参数中设置--name将设置robot名称空间和robot名称。
注意:时钟主题在全局命名空间下。因此,为了避免任何冲突,在多机器人模拟中,只有一个机器人应该设置时钟标志。
如果您想从另一台机器访问控制器,并且roscore与Webots不在同一台机器上运行,则需要编辑ROS_MASTER_URI变量。这可以通过编辑环境变量、在控制器参数中设置--ROS_MASTER_URI=<address>(见表)或使用控制器目录中的runtime.ini文件来完成。您还必须能够以两种方式使用ssh连接到每台计算机。由于ROS使用主机名查找网络上的其他计算机,您必须将其他计算机的主机名和相关的IP地址添加到每台计算机的已知主机中。您可以在名为hosts的文件中找到此列表。在Linux发行版上,您可以直接在/etc/hosts上找到它;
 
 自定义的ROS Controller
标准的ROS控制器已经被开发出来,以便在每个机器人上工作,并用于通用目的。有时,你可能无法用这个控制器做你想做的事情,或者它太复杂了。在这种情况下,您可以构建自己的自定义ROS控制器。
在Linux和macOS上使用“roscpp”库可以在C++中实现这样的ROS节点。然而,在这种情况下,您需要设置一个构建配置来处理ROS中的“catkin_make”和Webots中的“Makefile”,以便将生成的二进制文件链接到Webots“libController”和“roscpp”库。这里提供了一个示例来创建用于控制车辆的特定控制器。https://github.com/cyberbotics/webots/tree/released/projects/vehicles/controllers/ros_automobile
一个更通用的解决方案是使用外部控制器,并将控制器作为ROS侧的常规ROS节点运行。这里提供了一个非常简单的例子,https://github.com/cyberbotics/webots_ros/blob/master/scripts/ros_python.py它是用纯Python编写的,应该可以在Windows、Linux和macOS上直接使用。启动文件可用于启动具有正确世界文件、外部控制器和简单ROS节点的Webots,只要没有障碍物(使用前部DistanceSensor检测到),就可以通过以下方式启动:
 
roslaunch webots_ros webots_ros_python.launch

A second more complicated example shows how to interface a model of a Universal Robots arm in Webots with ROS using rospy.

从一个ROS包导入

Webots ROS可以使用rospack查找不同ROS包中定义的控制器、节点和PROTOS。为了让Webot找到它们,需要将以下内容添加到您的package.xml中:

<export>
    <webots_ros webots_extra_project_path="${prefix}"/>
</export>

添加导出标记后,在构建和获取包后,使用Webots.launch从Webots_ros包启动Webots将允许您使用找到的控制器/节点。

 
 用TCP/IP实现Webots与第三方软件的接口:https://www.cyberbotics.com/doc/guide/interfacing-webots-to-third-party-software-with-tcp-ip?tab-os=linux