目标:用障碍物避让节点扩展机器人模拟。
教程级别:高级
时间:20 分钟
目录
背景
先决条件
任务
1 更新
my_robot.urdf
2 创建一个 ROS 节点以避免障碍物
3 更新附加文件
4 测试避障代码
摘要
下一步
背景
在本教程中,您将扩展教程第一部分中创建的软件包:设置机器人模拟(基础)。目的是实现一个使用机器人距离传感器避开障碍物的 ROS 2 节点。本教程重点介绍使用具有 webots_ros2_driver
接口的机器人设备。
先决条件
这是教程第一部分的延续:设置机器人模拟(基础)。必须从第一部分开始设置自定义包和必要的文件。
本教程兼容 webots_ros2
版本 2023.1.0 和 Webots R2023b 以及即将发布的版本。
任务
1 更新 my_robot.urdf
如设置机器人模拟(基础)中所述, webots_ros2_driver
包含可将大多数 Webots 设备直接与 ROS 2 连接的插件。这些插件可以使用机器人的 URDF 文件中的 <device>
标签加载。 reference
属性应与 Webots 设备的 name
参数匹配。所有现有接口及相应参数的列表可以在设备参考页面 https://github.com/cyberbotics/webots_ros2/wiki/References-Devices 上找到。对于未在 URDF 文件中配置的可用设备,接口将自动创建,并且 ROS 参数将使用默认值(例如 update rate
、 topic name
和 frame name
)。
在 my_robot.urdf
中替换整个内容为:
Python:
<?xml version="1.0" ?>
<robot name="My robot">
<!-- 定义机器人的名称为 "My robot" -->
<webots>
<!-- Webots 机器人仿真器相关配置 -->
<device reference="ds0" type="DistanceSensor">
<!-- 定义一个名为 ds0 的距离传感器设备 -->
<ros>
<!-- ROS 相关配置 -->
<topicName>/left_sensor</topicName>
<!-- 定义 ROS 话题名称为 /left_sensor -->
<alwaysOn>true</alwaysOn>
<!-- 设置传感器设备始终开启 -->
</ros>
</device>
<device reference="ds1" type="DistanceSensor">
<!-- 定义另一个名为 ds1 的距离传感器设备 -->
<ros>
<!-- ROS 相关配置 -->
<topicName>/right_sensor</topicName>
<!-- 定义 ROS 话题名称为 /right_sensor -->
<alwaysOn>true</alwaysOn>
<!-- 设置传感器设备始终开启 -->
</ros>
</device>
<plugin type="my_package.my_robot_driver.MyRobotDriver" />
<!-- 加载自定义插件 my_package.my_robot_driver.MyRobotDriver -->
</webots>
</robot>
C++:
<?xml version="1.0" ?>
<robot name="My robot">
<webots>
<device reference="ds0" type="DistanceSensor">
<ros>
<topicName>/left_sensor</topicName>
<alwaysOn>true</alwaysOn>
</ros>
</device>
<device reference="ds1" type="DistanceSensor">
<ros>
<topicName>/right_sensor</topicName>
<alwaysOn>true</alwaysOn>
</ros>
</device>
<plugin type="my_robot_driver::MyRobotDriver" />
</webots>
</robot>
除了您的自定义插件, webots_ros2_driver
将解析指向 DistanceSensor 节点的 <device>
标签,并使用 <ros>
标签中的标准参数来启用传感器并命名它们的主题。
2 创建一个 ROS 节点以避免障碍物
Python: 定义了一个名为ObstacleAvoider
的类,继承自Node
类。该类初始化时创建了两个订阅者,分别订阅left_sensor
和right_sensor
话题,并定义了相应的回调函数。在回调函数中,根据传感器的距离值,发布控制机器人运动的Twist
消息。主函数中,初始化rclpy,创建ObstacleAvoider
节点对象,并进入循环等待消息。
机器人将使用标准的 ROS 节点来检测墙壁并发送电机命令以避开它。在 my_package/my_package/
文件夹中,创建一个名为 obstacle_avoider.py
的文件,并使用以下代码: