跳到主要内容

代码实现

建图功能

搭建行驶场地

在空旷的场地中,将小车放置在中间并在小车周围放置障碍物,例如:垃圾桶、纸箱等。需要保证两个障碍物之间有充足的空间,保证小车可以自由穿梭,示例环境如下所示。

图1 场地示意图

编译工作空间

  1. 进入导航车代码目录下。

    cd /home/HwHiAiUser/E2Esamples/SLAM/ascend_slam_ws/
  2. 在ascend_slam_ws目录下执行命令。

    colcon build

启动建图

  1. 在两个工作空间编译完成后,新开启一个终端,以root用户登录开发者套件,输入命令启动RVIZ界面。

    rviz2
  2. 再开启一个终端,以root用户登录开发者套件,执行以下命令。

    ros2 launch ascend_slam launch_robot.launch.py

    回显如下:

    图2 命令回显

    查看RVIZ2界面,可以看到小车出现。

    图3 RVIZ2界面

  3. 再开启一个终端,以root用户登录开发者套件,执行以下命令启动激光雷达。

    ros2 launch rplidar_ros view_rplidar_a2m12_launch.py serial_port:=/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 frame_id:=laser_frame angle_compensate:=true scan_mode:=Standard baud_rate:=115200

    回显如下:

    图4 命令回显

    此时查看RVIZ2可视化界面,则可查看点云数据。

    图5 RVIZ2界面

  4. 再开启一个终端,以root用户登录开发者套件,执行以下命令进行建图初始化。

    ros2 launch ascend_slam online_async_launch.py params_file:=/home/HwHiAiUser/E2Esamples/SLAM/ascend_slam_ws/install/ascend_slam/share/ascend_slam/config/mapper_params_online_async.yaml use_sim_time:=false

    回显如下:

    图6 命令回显

    再次查看RVIZ2窗口,可看到一张初始化的未完成构建的地图出现在小车周围。

    图7 RVIZ2界面

  5. 开始扫描建图。

    1. 执行如下命令,控制小车对当前区域进行建图。

      ros2 run teleop_twist_keyboard teleop_twist_keyboard

      根据以下指令,控制小车在地图中移动,完成建图。

      • i:前进
      • j:左转
      • l:右转
      • k:暂停

      控制小车在地图中障碍物附近移动,此时地图会逐渐完整。

      图8 移动小车扫描建图

      图9 移动小车扫描建图

      由上图可见,地图中间由两个黑色边框的椭圆和一个黑色边框的长方体。两椭圆对应两个垃圾桶的位置,而长方体则对应纸箱位置。当三个障碍物在地图中清晰可见后,即可完成建图。

    2. 单击左上角的Panels图标,单击“Add New Panel”按钮。

      图10 单击Add New Panel

    3. 在弹出的窗口中双击最下方的SlamToolboxPlugin,随后RVIZ2界面的左下方即会出现插件界面。

      图11 单击SlamToolboxPlugin

    4. 在“Save Map”右侧输入“ascend_map_save”,在“Serialize Map”右侧输入“ascend_map_serial”。

      图12 配置地图信息

    5. 分别单击“Save Map”按钮和“Serialize Map”按钮。

      可在“ascend_slam_ws”目录下看到4份地图文件。

      :::note 说明 因RVIZ2窗口在本机与DK进行通信,如地图文件没及时出现,可多点击几次。 :::

      若将这些地图文件下载至本地,可使用看图软件查看ascend_map_save.pgm,可对构建的地图进行进一步查看,示例地图如下。

      图13 查看地图

父主题: 快速体验

定位功能

有了地图后,小车需要进一步了解此时此刻在地图中的初始位置。

  1. 在当前终端,执行如下指令。

    ros2 launch ascend_slam localization_launch.py map:=./ascend_map_save.yaml use_sim_time:=false

    再次查看RVIZ2可视化界面,可以看到当前小车变为白色,表示我们需要在当前地图中,给小车一个初始位置,如下图所示。

    图1 初始化小车位置

  2. 点击上方的“2D Pose Estimate”按钮,根据小车当前位置,判断在地图中的估计位置。

    图2 点击按钮

  3. 单击地图,按住鼠标左键并拉动一个车头所对准的方向,松开鼠标。随后小车会根据箭头的位置和方向,出现在箭头指向的位置。

    图3 初始化小车位置

    :::note 说明 如小车未出现在指定位置或未移动,可能由于多机通信网络原因,尝试重新单击“2D Pose Estimate”按钮并完成相应操作。 :::

父主题: 快速体验

导航功能

  1. 保持定位功能中所有终端开启并重新开启一个终端,以root用户登录开发者套件,执行以下命令。

    ros2 launch ascend_slam navigation_launch.py use_sim_time:=false map_subscribe_transient_local:=true

    在RVIZ2中此时可以看到膨胀后的地图。

    图1 RVIZ2界面

  2. 单击上方的“2D Goal Pose”按钮,单击地图,按住鼠标左键并拉动一个车头所对准的方向,松开鼠标。随后小车会根据箭头的位置和方向,出现在箭头指向的位置。

    随后可看到小车会自行规划路径,在避开障碍物的同时,行驶至指定区域内。

    图2 自动避障导航行驶

父主题: 快速体验

代码实现

.
├── asend_slam_ws
│ └── src
│ ├── ascend_slam
│ │ ├── CMakeLists.txt
│ │ ├── config
│ │ │ ├── ball_tracker_params_robot.yaml
│ │ │ ├── ball_tracker_params_sim.yaml
│ │ │ ├── drive_bot.rviz
│ │ │ ├── gazebo_params.yaml
│ │ │ ├── gaz_ros2_ctl_use_sim.yaml
│ │ │ ├── joystick.yaml
│ │ │ ├── main.rviz
│ │ │ ├── mapper_params_online_async.yaml
│ │ │ ├── map.rviz
│ │ │ ├── my_controllers.yaml
│ │ │ ├── nav2_params.yaml
│ │ │ ├── twist_mux.yaml
│ │ │ └── view_bot.rviz
│ │ ├── description
│ │ │ ├── face.xacro
│ │ │ ├── gazebo_control.xacro
│ │ │ ├── inertial_macros.xacro
│ │ │ ├── lidar.xacro
│ │ │ ├── robot_core.xacro
│ │ │ ├── robot.urdf.xacro
│ │ │ └── ros2_control.xacro
│ │ ├── launch
│ │ │ ├── ball_tracker.launch.py
│ │ │ ├── camera.launch.py
│ │ │ ├── joystick.launch.py
│ │ │ ├── launch_robot.launch.py
│ │ │ ├── launch_sim.launch.py
│ │ │ ├── localization_launch.py
│ │ │ ├── navigation_launch.py
│ │ │ ├── online_async_launch.py
│ │ │ ├── rplidar.launch.py
│ │ │ └── rsp.launch.py
│ │ ├── package.xml
│ │ ├── rviz
│ │ │ └── default.rviz
│ │ └── worlds
│ │ ├── empty.world
│ │ └── obstacles.world
│ └── diffdrive_arduino
└── ROSArduinoBridge
├── commands.h
├── diff_controller.h
├── encoder_driver.h
├── encoder_driver.ino
├── motor_driver.h
├── motor_driver.ino
├── ROSArduinoBridge.ino
├── sensors.h
├── servos.h
└── servos.ino

表1 文件介绍

文件(夹)名称说明
asend_slam_ws/src/ascend_slam/CMakeLists.txt工作空间编译文件。
asend_slam_ws/src/ascend_slam/config避障导航车配置文件。
asend_slam_ws/src/ascend_slam/description避障导航车描述文件。
asend_slam_ws/src/ascend_slam/launch避障导航车功能代码。
asend_slam_ws/src/ascend_slam/rvizrviz工具配置文件。
asend_slam_ws/worlds世界描述文件。
ROSArduinoBridge/电机代码。

在线提单