< >
Home » ROS2与webots入门教程 » ros2与webots入门教程-E-puck使用

ros2与webots入门教程-E-puck使用

ros2与webots入门教程-E-puck使用

说明: 

  • 介绍如何使用 e-puck ROS2 API 的说明。
  • 该文档适用于真机 (epuck_ros2) 和模拟 (webots_ros2_epuck) 机器人。
  • 请确保您的机器人驱动程序正在运行。 这将确保通过 ROS2 API 公开对传感器和执行器的访问

步骤:

  • 启动仿真
ros2 launch webots_ros2_epuck robot_launch.py
  • 为方便起见,您还可以启动robot_with_tools_launch.py,其中包括robot_launch.py 和robot_tools_launch.py
  • 例如:
ros2 launch webots_ros2_epuck robot_with_tools_launch.py rviz:=true
  • 启动真机
ros2 launch epuck_ros2 robot_launch.py
  • E-puck2外观图

请输入图片描述

红外传感器

  • E-puck2 有 8 个红外传感器(命名为 ps0-7),所有这些传感器都映射到 sensor_msgs/Range 类型的同名 ROS2 话题。
  • 打印红外传感器话题:
ros2 topic echo /ps1

距离传感器

  • 除了红外传感器外,e-puck2 还升级了一个位于相机上方的远程 ToF 传感器。
  • 此传感器的数据也通过名为 tof 的 sensor_msgs/Range 话题公开。
  • 所有距离传感器组合在一起创建 sensor_msgs/LaserScan,因此您可以直接在 SLAM 包中使用它。
  • 打印距离传感器话题:
ros2 topic echo /scan

光传感器

  • 相同的红外线传感器充当光传感器。
  • 在 ROS2 驱动程序中,来自传感器的数据以 sensor_msgs/Illuminance 消息的形式发布(单位为勒克斯)
  • 打印光传感器话题:
ros2 topic echo /ls1
  • 请注意,在上图中,机器人周围有 8 个 LED 灯。 LED LED0、LED2、LED4 和 LED6 只能打开或关闭,而 LED LED1、LED3、LED5 和 LED7 具有可控的 RGB 分量。 因此,在二进制 LED 的情况下,您可以将它们测试为:
ros2 topic pub /led0 std_msgs/Int32 '{ "data": 1 }'
ros2 topic pub /led0 std_msgs/Int32 '{ "data": 0 }'
  • 设置RGB:
ros2 topic pub /led1 std_msgs/Int32 '{ "data": 0xFF0000 }'
ros2 topic pub /led1 std_msgs/Int32 '{ "data": 0x000000 }'
  • 其中 Int32 的 3 个低字节表示 R、G 和 B 分量的 3 个字节。

速度控制

  • 名称为 /cmd_vel 的标准 geometry_msgs/Twist 主题公开用于速度控制。
ros2 topic pub /cmd_vel geometry_msgs/Twist "linear:
  x: 0.1
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"
  • 请注意,e-puck2 是一个差动轮式机器人,只有 linear.x 和 angular.z 作用.

Odometry

  • 标准 ROS2 消息 nav_msgs/Odometry 用于发布里程计数据您可以通过以下方式订阅它:
ros2 topic echo /odom
  • 如果您对协方差矩阵不感兴趣,可以使用 --no-arr 参数隐藏数组:
ros2 topic echo --no-arr /odom
  • 您还可以在 rviz 中可视化里程计:
ros2 launch webots_ros2_epuck robot_tools_launch.py rviz:=true

Camera

  • 摄像头数据和细节通过摄像头(类型sensor_msgs/Image)和摄像头/camera_info(类型sensor_msgs/CameraInfo)主题进行描述。 与物理机器人驱动程序相比,没有sensor_msgs/CompressedImage,因为图像并不意味着通过网络传输。

  • 您可以运行 rqt ,导航到Plugins > Visualization > Image View,然后为话题选择 /camera。

  • 请注意,图像编码是 BGRA。

IMU

  • e-puck2 上有 3D 加速度计和 3D 陀螺仪硬件。 您可以通过 imu 话题(类型 sensor_msgs/Imu)访问此数据,
  • 例如:
ros2 topic echo --no-arr /imu

地面传感器

  • 地面传感器作为 e-puck2 的可选模块提供。
  • 如果该模块存在,ROS2 驱动程序将自动检测它并发布数据。 您可以将它们测试为:
ros2 topic echo /gs1
  • 要放置地面传感器模块,请在 e-puck2 机器人树中选择 groundSensorsSlot,单击 + 按钮并找到 E-puckGroundSensors
  • 效果图

请输入图片描述

TF

  • 动态转换仅用于里程计,您可以将其显示为:
ros2 topic echo tf
  • 所有其他转换都是静态的,它们作为锁存主题公开,因此您可以使用以下命令显示它们:
ros2 topic echo --qos-profile services_default --qos-durability transient_local tf_static
  • 对于转换的一般访问,您可以使用 tf2_monitor:
ros2 run tf2_ros tf2_monitor
  • 或者如果您想读取树中任意两个坐标系之间的转换:
ros2 run tf2_ros tf2_echo odom map

导航

  • ROS2 Navigation2 堆栈(参见此图)允许我们通过创建全局计划并避开局部障碍物将机器人从 A 点移动到 B 点。
  • 它已集成到 e-puck 示例中,您可以通过包含 nav 参数来运行它:
ros2 launch webots_ros2_epuck robot_tools_launch.py rviz:=true nav:=true
  • 或者没有 RViz2,您可以只发布所需的姿势:
ros2 topic pub -1 /goal_pose geometry_msgs/PoseStamped \"
pose:
  position:
    x: 0.3
    y: 0.0
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: 0.0
    w: 1.0
  • 默认情况下,导航将使用 /webots_ros2_epuck/resource 中提供的 epuck_world_map.yaml 地图。
  • 要更改地图,您必须使用 map 参数:
ros2 launch webots_ros2_epuck robot_tools_launch.py rviz:=true nav:=true map:=/path/to/your/map.yaml

建图 

  • 不幸的是,默认的 SLAM 实现不适用于 e-puck。
  • 因此,我们创建了一个纯粹依赖里程计的简单映射节点。
  • 您可以通过添加 mapper 参数将其作为 e-puck 示例启动文件的一部分启动:
ros2 launch webots_ros2_epuck robot_tools_launch.py rviz:=true mapper:=true
  • 驾驶机器人四处走动(使用例如 teleop_twist_keyboard)以发现尽可能多的地图。
  • 效果图

请输入图片描述

  • 对结果满意后,您可以将地图另存为:
ros2 run nav2_map_server map_saver_cli -f $HOME/Pictures/map

差速器校准

  • 根据每个轮子的转速和两个常数,轮子之间的距离和轮子半径,我们可以计算出机器人在局部坐标系中的位置。 因此,位置估计的精度很大程度上取决于车轮之间的距离和车轮半径。 这些常数可能因机器人而异,在这里我们提供了一种工具来帮助您对其进行校准(该技术与“移动机器人系统里程计误差的测量和校正”中提出的技术非常相似)。

  • 首先,我们要测量车轮半径,我们可以通过让机器人直线运动来实现:

ros2 run webots_ros2_epuck drive_calibrator --ros-args -p type:=linear
  • 如果机器人超出给定距离(默认 0.1335m),我们应该增加轮子半径,否则减少它:
ros2 param set /epuck_driver wheel_radius 0.0215
  • 其次,为了校准轮子之间的距离,我们可以让机器人在原地旋转:
ros2 run webots_ros2_epuck drive_calibrator --ros-args -p type:=angular
  • 如果超调,给定的转数(默认为 4)然后减少轮子之间的距离,否则增加它。
ros2 param set /epuck_driver wheel_distance 0.0514
  • 第三,重复这两个步骤,直到您对精度满意为止。

  • 请注意,您可以通过工具(例如尺子)测量距离,这是一个很好的初步猜测,但使用上述技术,您将获得更好的结果。

  • 根据该论文,此类技术可以显着减少系统误差(第 4 页和第 23 页)。

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

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


标签: ros2与webots入门教程