< >
Home » ROS2与webots入门教程 » ros2与webots入门教程-创建自己驱动包

ros2与webots入门教程-创建自己驱动包

ros2与webots入门教程-创建自己驱动包

说明: 

  • 介绍如何创建自己的机器人驱动包,利用 webots_ros2_driver 功能创建 ROS 2 自定义包(带有 Webots 模拟)所需的主要元素。

webots_ros2_driver

  • 从 webots_ros2 1.1.0 开始,该软件包包含了 webots_ros2_driver。
  • webots_ros2_driver主要目标是:
  • 它会自动从 Webots 机器人模型中创建一个 ROS 2 界面。
  • 它允许用户在 URDF 文件中配置 ROS 2 接口。
  • 它允许用户使用 pluginlib 插件机制扩展接口。

项目结构

  • 在使用 Webots 模拟创建自定义 ROS 2 包时,我们建议使用以下项目结构:
.
├── launch
│   └── robot_launch.py
├── resource
│   ├── webots_robot_description.urdf
│   └── ros2_control_configuration.yml
├── worlds
    └── webots_world_file.wbt
├── webots_ros2_package_example
│   └── __init__.py
├── package.xml
└── setup.py
  • 您的 ROS 2 包可能有更多文件(甚至更少),但这些文件与典型的 Webots ROS 2 模拟最相关。
  • launch/robot_launch.py 文件包含 ROS 2 启动指令(请参阅启动文件部分)。
  • resource/webots_robot_description.urdf 文件包含 ROS 2 接口配置(参见 URDF 标签部分)。
  • resource/ros2_control_configuration.yml 文件包含 ros2_control 配置。
  • worlds/webots_world_file.wbt 文件包含 Webots 世界描述。 该文件通常在 Webots 世界编辑器中创建。

URDF Tag

  • 下面提供了一个 Webots ROS 2 接口配置文件 (webots_robot_description.urdf) 的示例:
<?xml version="1.0" ?>
<robot name="RobotName">
    <webots>
       <!-- Whole Webots-related configuration is placed under the <webots> tag -->

       <!-- For almost all Webots devices a ROS 2 interface will be created automatically. -->
       <!-- If a ROS 2 interface for a device is not explicitly configured (e.g. update rate, topic name, and frame name) then configuration will be assumed. -->
       <!-- The ROS 2 interface configuration is specified within a <device> tag. -->
       <!-- * The `reference` attribute matches the Webots device `name` parameter. -->
       <!-- * The configuration under the <ros> tag is a ROS 2 specific device configuration. -->
        <device reference="LDS-01">
            <ros>
                <topicName>/scan</topicName>
            </ros>
        </device>

        <!-- The `webots_ros2_driver` package creates a ROS 2 interface for most devices available in Webots. -->
        <!-- However, if there is no adequate Webots ROS 2 interface then you can create a custom plugin. -->
        <!-- The `webots_ros2` package already comes with a few predefined plugins that you can use as an example. -->
        <!-- For example, the IMU combines Webots InertialUnit, Gyro, and Accelerometer. -->
        <!-- When using a plugin it is necessary to specify the type attribute in the <plugin> tag. -->
        <!-- The tag matches the type attribute in the <class> tag defined by the pluginlib. -->
        <plugin type="webots_ros2_driver::Ros2IMU">
            <frameName>imu_link</frameName>
            <inertialUnitName>inertial_unit</inertialUnitName>
            <gyroName>gyro</gyroName>
            <accelerometerName>accelerometer</accelerometerName>
        </plugin>

        <!-- The ros2_control implementation is provided as another out-of-the-box plugin. -->
        <plugin type="webots_ros2_control::Ros2Control" />
    </webots>

    <!-- Other URDF tags can freely coexist with the <webots> tag in the same URDF file. -->
    <ros2_control name="WebotsControl" type="system">
        <hardware>
            <!-- When using Webots ros2_control implementation it is necessary to specify the following line in the ros2_control configuration. -->
            <plugin>webots_ros2_control::Ros2ControlSystem</plugin>
        </hardware>
        <joint name="right wheel motor">
            <state_interface name="position"/>
            <command_interface name="velocity"/>
        </joint>
        <joint name="left wheel motor">
            <state_interface name="position"/>
            <command_interface name="velocity"/>
        </joint>
    </ros2_control>
</robot>

Launch File

  • 在下面的启动文件中,我们解释了 Webots ROS 2 模拟中最常用的元素:
import os
import pathlib
import launch
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
from webots_ros2_driver.webots_launcher import WebotsLauncher
from webots_ros2_driver.webots_launcher import Ros2SupervisorLauncher # Only with the develop branch!


def generate_launch_description():
    package_dir = get_package_share_directory('webots_ros2_turtlebot')
    robot_description = pathlib.Path(os.path.join(package_dir, 'resource', 'webots_robot_description.urdf')).read_text()
    ros2_control_params = os.path.join(package_dir, 'resource', 'ros2_control_configuration.yml')

    # The WebotsLauncher is a Webots custom action that allows you to start a Webots simulation instance.
    # It searches for the Webots installation in the path specified by the `WEBOTS_HOME` environment variable and default installation paths.
    # The accepted arguments are:
    # - `world` (str): Path to the world to launch.
    # - `gui` (bool): Whether to display GUI or not.
    # - `mode` (str): Can be `pause`, `realtime`, or `fast`.
    webots = WebotsLauncher(
        world=os.path.join(package_dir, 'worlds', 'webots_world_file.wbt')
    )

    # The Ros2Supervisor node is a special node interacting with the simulation.
    # For example, it publishes the /clock topic of the simulation or permits to spawn robot from URDF files.
    # By default, its respawn option is set at True.
    ros2_supervisor = Ros2SupervisorLauncher() # Only with the develop branch!

    # The node which interacts with a robot in the Webots simulation is located in the `webots_ros2_driver` package under name `driver`.
    # It is necessary to run such a node for each robot in the simulation.
    # The `WEBOTS_ROBOT_NAME` has to match the robot name in the world file.
    # Typically, we can provide it the `robot_description` parameters from a URDF file in order to configure the interface, `set_robot_state_publisher` in order to let the node give the URDF generated from Webots to the `robot_state_publisher` and `ros2_control_params` from the `ros2_control` configuration file.
    webots_robot_driver = Node(
        package='webots_ros2_driver',
        executable='driver',
        additional_env={'WEBOTS_ROBOT_NAME': 'robot'},
        parameters=[
            {'robot_description': robot_description,
             'set_robot_state_publisher': True},
            ros2_control_params
        ],
    )

    # Often we want to publish robot transforms, so we use the `robot_state_publisher` node for that.
    # If robot model is not specified in the URDF file then Webots can help us with the URDF exportation feature.
    # Since the exportation feature is available only once the simulation has started and the `robot_state_publisher` node requires a `robot_description` parameter before we have to specify a dummy robot.
    robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        parameters=[{
            'robot_description': '<robot name=""><link name=""/></robot>'
        }],
    )

    # Standard ROS 2 launch description
    return launch.LaunchDescription([

        # Start the Webots node
        webots,

        # Start the Ros2Supervisor node
        ros2_supervisor, # Only with the develop branch!

        # Start the Webots robot driver
        webots_robot_driver,

        # Start the robot_state_publisher
        robot_state_publisher,

        # This action will kill all nodes once the Webots simulation has exited
        launch.actions.RegisterEventHandler(
            event_handler=launch.event_handlers.OnProcessExit(
                target_action=webots,
                on_exit=[launch.actions.EmitEvent(event=launch.events.Shutdown())],
            )
        )
    ])
  • 根据您正在运行的模拟,您的模拟可能或多或少复杂。 但是,提供的启动文件描述了 Webots 模拟中最常用的启动元素。

启动文件参数

  • WebotsLauncher、Ros2Supervisor 和 webots_ros2_driver 启动文件参数
  • 您可能想要参数化如何使用 WebotsLauncher 进程启动 Webots 或参数化 Ros2Supervisor 和 webots_ros2_driver 节点。
  • 这是您可以使用的所有参数的列表,以及有关此过程和这些节点的一些进一步说明。

WebotsLauncher

  • WebotsLauncher 的大多数参数将使用不同的命令行参数启动 Webots。

  • 您可以在下面找到 WebotsLauncher 的参数列表及其对命令行参数的影响:

    • gui (bool):如果为 False,则设置 --no-rendering、--stdout、--stderr 和 --minimize 标志。 默认为真。
    • mode (string):将 --mode 标志设置为相同的值。 默认为“实时”。
    • stream (bool):如果为真,则设置 --stream 标志。 默认为假。
  • world 参数指定要使用的世界的路径,它可以是文字字符串或替换,就像在这个存储库的示例中一样。

  • output (默认设置为'screen')和额外的参数将被launch.actions.ExecuteProcess的init函数使用。

Ros2Supervisor (针对开发分支)

  • 可以使用 Ros2SupervisorLauncher 类在启动文件中轻松启动 Ros2Supervisor 节点。

  • Ros2SupervisorLauncher 进程只是来自launch_ros 的Node 类上的一个额外层,设置启动Ros2Supervisor 节点所需的参数,并默认将respawn 设置为True 并输出到'screen'。

  • 注意:对于Webots的每个外部控制器,该节点必须定义一个环境变量WEBOTS_ROBOT_NAME,该变量等于将由该节点控制的机器人的名称。 机器人的名字是 Ros2Supervisor,因此没有其他机器人可以有这个名字。

  • 可以在此处的 Ros2Supervisor 节点上找到更多信息

webots_ros2_driver

  • webots_ros2_driver 节点作为标准节点启动,因此没有特定的参数。

  • 但是有两个重要的部分。

  • 第一个是使用 Additional_env 参数设置一个环境变量 WEBOTS_ROBOT_NAME 等于模拟中机器人的名称。不这样做或写错误的名称将阻止 webots_ros2_driver 节点连接到机器人。

  • 第二部分是可以定义几个参数。除了标准的 'use_sim_time': True 可以使用或配置文件 .yml 之外,还可以使用以下两个参数:

    • robot_description(string):如果设置,则 webots_ros2_driver 节点将解析字符串以配置 ROS 2 接口。例如,这包括使用插件(预制的或自定义的)、默认激活或重命名某些主题。
    • set_robot_state_publisher (bool):如果为 True,则(可能存在的)robot_state_publisher 节点的
    • robots_description 参数将被 Webots 基于模拟中的机器人生成的 URDF 文件的内容覆盖。这个 URDF 可能不如自己制作的 URDF 完整。默认为假。
  • 更详细教程,参考创建webots仿真机器人

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与webots入门教程