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
- 下面提供了一个 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仿真机器人
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号