4、使用ROS
Webots使用ROS
有两种方法在Webots中使用ROS
[robot_name_space]/[device_name]/[service/topic_name].[robot_name_space]:ROS命名空间对服务、话题和参数进行分组。[device_name]:由于同一个函数可以引用不同的设备,因此此字段将显示它引用的设备。[service/topic_name]:此字段与其对应的Webots函数相同或非常接近。对于话题,它后面跟着采样周期。对于服务,它也是相应srv文件的名称。在教程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函数的前缀参数。在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将允许您使用找到的控制器/节点。