1 无人驾驶机器人产品简介

普蓝机器人DR100是一款四轮四驱差速转向的可编程移动机器人底盘,专为复杂环境下的移动机器人应用而设计。该底盘具有以下核心特性:

1.1 产品硬件特点

  • 驱动系统:搭载4个400W大扭矩伺服电机,提供强劲动力
  • 悬挂系统:四轮独立双横臂悬挂,确保在不平整地面的稳定性
  • 运动能力
    • 零半径原地旋转,灵活转向
    • 150mm越障能力,适应复杂地形
    • ≥25°爬坡能力,应对斜坡环境
  • 电源系统:内置30Ah高密度磷酸铁锂电池,提供持久续航
  • 安全设计:车体两侧配备带高亮指示灯的急停按钮,紧急情况下快速断电并实时反馈状态

1.2 对外接口与扩展

DR100底盘尾部提供丰富的扩展接口,满足各种传感器和设备的接入需求:

  • 电源输出:48V/19V电源输出
  • 通信接口:数字I/O、CAN总线、RS-485、USB等
  • 开发支持:配套SDK、ROS驱动与仿真工具、高能开源固件

1.3 适用场景

DR100底盘广泛适用于多种应用场景:

  • 教育教学:机器人课程实验平台
  • 科学研究:移动机器人算法验证
  • 厂区巡检:自主巡检机器人
  • 无人驾驶:自动驾驶技术研究

DR100底盘

1.4 SLAM系统概述

基于DR100底盘的无人驾驶SLAM(Simultaneous Localization and Mapping)系统,通过集成激光雷达、IMU等传感器,实现同时定位与地图构建功能。本系统采用ROS(Robot Operating System)作为软件框架,结合LeGO-LOAM等SLAM算法,构建完整的无人驾驶解决方案。

系统主要功能包括:

  • 环境感知:通过激光雷达获取周围环境的三维点云数据
  • 惯性导航:利用IMU提供姿态和运动信息
  • 地图构建:实时构建环境的三维点云地图
  • 定位导航:在已知地图中实现精确定位和路径规划
  • 运动控制:控制DR100底盘实现自主导航

2 工控机环境

2.1 硬件环境

  • 处理器:CPU-Intel i5
  • 内存:32G
  • 硬盘:128G SSD
  • 电源:DC12V
  • 接口:VGA, HDMI, LAN, USB2.0, USB3.0

2.2 软件环境

2.2.1 Ubuntu-20.04安装

首先需要从官方渠道下载Ubuntu 20.04 LTS的ISO镜像文件。进入Ubuntu官方发布页面下载Ubuntu 20.04 LTS镜像。建议选择Desktop版本,因为它包含了完整的图形界面和开发工具。

Downloiad Ubuntu

下载后,推荐使用Rufus烧录镜像到U盘,注意会清空U盘原有文件。

如图,先选择需要烧录的U盘,然后选择上一步下载的镜像文件,点击“开始”将镜像烧录到U盘

rufus

最后将U盘插入工控机,通过启动盘引导,根据需求自行安装,此部分请参考网上的Ubuntu安装相关文章,本文不再赘述。

2.2.2 ROS Noetic 安装

参考文档:

ROS WIKI:https://wiki.ros.org/noetic/Installation/Ubuntu

ROS WIKI 简体中文:https://wiki.ros.org/cn/noetic/Installation/Ubuntu

配置Ubuntu软件仓库,并设置密钥:

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

安装ROS:

sudo apt update
sudo apt install ros-noetic-desktop-full

设置环境:

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

安装后,在终端执行roscore,测试ROS:

roscore

2.2.3 GTSAM

GTSAM官方:https://github.com/borglab/gtsam

自行根据GTSAM官方安装v4.1.0

3 ROS基础教程

参考文档:

ROS教程 - ROS Wiki:https://wiki.ros.org/cn/ROS/Tutorials/NavigatingTheFilesystem

ROS(Robot Operating System)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。在某些方面ROS相当于一种“机器人框架(robot frameworks)"。

ROS的核心设计理念是分布式计算,通过节点(Node)之间的通信来实现复杂的机器人功能。每个节点都是一个独立的进程,负责特定的功能模块,如传感器数据采集、运动控制、路径规划等。

3.1 ROS常用命令

3.1.1 基础命令表

命令 作用 示例用法
catkin_create_pkg 创建功能包 catkin_create_pkg my_pkg rospy roscpp
rospack 获取功能包的信息 rospack find geometry_msgs
catkin_make 编译工作空间中的功能包 catkin_make -j4
rosdep 自动安装功能包依赖的其他包 rosdep install --from-paths .
roscd 功能包目录跳转 roscd geometry_msgs
roscp 拷贝功能包中的文件 roscp my_pkg config.yaml ~/backup/
rosed 编辑功能包中的文件 rosed my_pkg my_script.py
rosrun 运行功能包中的可执行文件 rosrun my_pkg my_node.py
roslaunch 运行启动文件 roslaunch my_pkg my_launch.launch

3.1.2 调试和监控命令

命令 作用 示例用法
roscore 启动ROS主节点 roscore
rosnode 查看和管理节点 rosnode list / rosnode info
rostopic 查看和操作话题 rostopic list / rostopic echo
rosservice 查看和调用服务 rosservice list / rosservice call
rosparam 参数服务器操作 rosparam list / rosparam get
rosmsg 查看消息类型 rosmsg show geometry_msgs/Twist
rossrv 查看服务类型 rossrv show std_srvs/Empty
roswtf 系统诊断工具 roswtf

3.1.3 详细命令说明

  1. 查看系统状态
# 查看所有运行的节点
rosnode list

# 查看特定节点的详细信息
rosnode info /my_node

# 查看所有话题
rostopic list

# 实时查看话题数据
rostopic echo /chatter

# 查看话题发布频率
rostopic hz /chatter

# 查看话题信息(类型、发布者、订阅者)
rostopic info /chatter
  1. 参数服务器操作
# 查看所有参数
rosparam list

# 获取参数值
rosparam get /robot_name

# 设置参数值
rosparam set /robot_name "dr100"

# 从文件加载参数
rosparam load config.yaml

# 保存参数到文件
rosparam dump params.yaml
  1. 服务操作
# 查看所有服务
rosservice list

# 查看服务类型
rosservice type /add_two_ints

# 调用服务
rosservice call /add_two_ints "a: 1, b: 2"

3.2 ROS文件系统

ROS文件系统采用层级结构,核心概念包括:

概念 说明 示例命令
工作空间 包含功能包的目录 mkdir -p ~/catkin_ws_demo/src
功能包 ROS软件的基本单元 catkin_create_pkg my_pkg rospy
节点 可执行程序(功能包中的小程序) rosrun my_pkg my_node

3.2.1 创建工作空间

步骤1:创建工作空间目录结构

# 创建工作空间根目录和src子目录
mkdir -p ~/catkin_ws_demo/src
cd ~/catkin_ws_demo

# 查看目录结构
ls -la
# 应该看到:
# drwxrwxr-x  3 user user 4096 date time .
# drwxr-xr-x 25 user user 4096 date time ..
# drwxrwxr-x  2 user user 4096 date time src

步骤2:初始化工作空间

# 在工作空间根目录执行编译(初始化)
catkin_make

# 编译成功后会生成以下目录结构:
# ~/catkin_ws_demo/
# ├── build/          # 编译过程文件
# ├── devel/          # 开发环境设置
# │   └── setup.bash  # 环境变量设置脚本
# └── src/            # 源码目录
#     └── CMakeLists.txt

步骤3:激活工作空间环境

# 激活当前会话的环境变量
source devel/setup.bash

# 验证环境是否正确设置
echo $ROS_PACKAGE_PATH
# 应该包含:/home/用户名/catkin_ws_demo/src:/opt/ros/noetic/share

# 将环境变量添加到.bashrc(可选,方便每次打开终端自动加载)
echo "source ~/catkin_ws_demo/devel/setup.bash" >> ~/.bashrc

步骤4:验证工作空间

# 检查工作空间是否在ROS包路径中
rospack list-names | grep -i demo
# 如果有自定义包,应该能看到

# 检查当前工作空间
roscd
pwd
# 应该显示:/home/用户名/catkin_ws_demo

3.2.2 功能包结构

步骤1:创建功能包

# 进入src目录
cd ~/catkin_ws_demo/src

# 创建功能包(指定依赖项)
catkin_create_pkg my_pkg rospy roscpp std_msgs geometry_msgs

# 查看创建的功能包结构
ls -la my_pkg/

步骤2:功能包目录结构详解

my_pkg/
├── CMakeLists.txt     # 编译规则和配置
├── package.xml        # 包信息、依赖关系、元数据
├── scripts/           # Python可执行脚本(需手动创建)
├── src/               # C++源代码目录(需手动创建)
├── launch/            # 启动文件目录(需手动创建)
├── config/            # 配置文件目录(需手动创建)
├── msg/               # 自定义消息类型(需手动创建)
├── srv/               # 自定义服务类型(需手动创建)
└── include/my_pkg/    # C++头文件目录(需手动创建)

步骤3:创建常用目录

cd ~/catkin_ws_demo/src/my_pkg

# 创建Python脚本目录
mkdir -p scripts

# 创建C++源码目录
mkdir -p src

# 创建启动文件目录
mkdir -p launch

# 创建配置文件目录
mkdir -p config

# 创建自定义消息目录
mkdir -p msg

# 创建自定义服务目录
mkdir -p srv

# 验证目录结构
tree .
# 或使用 ls -la 查看

步骤4:查看和编辑包信息

# 查看package.xml内容
cat package.xml

# 编辑包信息(可选)
nano package.xml
# 或使用其他编辑器:gedit package.xml

步骤5:编译功能包

# 返回工作空间根目录
cd ~/catkin_ws_demo

# 编译特定功能包
catkin_make --pkg my_pkg

# 或编译整个工作空间
catkin_make

# 重新加载环境
source devel/setup.bash

步骤6:验证功能包

# 查找功能包
rospack find my_pkg

# 查看功能包依赖
rospack depends my_pkg

# 进入功能包目录
roscd my_pkg
pwd

3.3 节点通信模型

3.3.1 核心通信方式

  • 话题(Topic) - 异步发布/订阅模式
# 发布者示例 (Python)
pub = rospy.Publisher('chatter', String, queue_size=10)
pub.publish("Hello ROS!")
  • 服务(Service) - 同步请求/响应模式
# 服务端示例
srv = rospy.Service('add_two_ints', AddTwoInts, handle_add)

3.3.2 消息类型

类型 作用域 示例
std_msgs 基础数据类型 Int32, String
sensor_msgs 传感器数据 Image, LaserScan
geometry_msgs 几何数据 Pose, Twist

3.4 实战:创建话题通信

3.4.1 创建发布者节点

步骤1:创建Python发布者脚本

# 创建脚本文件
cd ~/catkin_ws_demo/src/my_pkg/scripts
nano talker.py

步骤2:编写发布者代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
ROS话题发布者节点示例
功能:每秒发布10次消息到'chatter'话题
"""

import rospy
from std_msgs.msg import String

def talker():
    # 创建发布者对象
    # 参数:话题名称、消息类型、队列大小
    pub = rospy.Publisher('chatter', String, queue_size=10)

    # 初始化节点
    # 参数:节点名称、是否允许匿名(添加随机数后缀)
    rospy.init_node('talker_node', anonymous=True)

    # 设置发布频率(10Hz)
    rate = rospy.Rate(10)

    # 消息计数器
    count = 0

    rospy.loginfo("Talker node started. Publishing to 'chatter' topic...")

    # 主循环
    while not rospy.is_shutdown():
        # 创建消息内容
        msg_text = "Hello ROS! Count: %d, Time: %.2f" % (count, rospy.get_time())

        # 发布消息
        pub.publish(msg_text)

        # 打印日志
        rospy.loginfo("Published: %s", msg_text)

        # 计数器递增
        count += 1

        # 按设定频率休眠
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        rospy.loginfo("Talker node terminated.")

3.4.2 创建订阅者节点

步骤1:创建Python订阅者脚本

# 创建脚本文件
cd ~/catkin_ws_demo/src/my_pkg/scripts
nano listener.py

步骤2:编写订阅者代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
ROS话题订阅者节点示例
功能:订阅'chatter'话题并打印接收到的消息
"""

import rospy
from std_msgs.msg import String

def callback(data):
    """
    回调函数:处理接收到的消息
    参数:data - 接收到的消息对象
    """
    rospy.loginfo("Received: %s", data.data)

    # 可以在这里添加更多的消息处理逻辑
    # 例如:数据解析、存储、转发等

def listener():
    # 初始化节点
    rospy.init_node('listener_node', anonymous=True)

    rospy.loginfo("Listener node started. Subscribing to 'chatter' topic...")

    # 创建订阅者对象
    # 参数:话题名称、消息类型、回调函数
    rospy.Subscriber("chatter", String, callback)

    # 保持节点运行,等待消息
    # spin()会阻塞程序,直到节点被关闭
    rospy.spin()

if __name__ == '__main__':
    try:
        listener()
    except rospy.ROSInterruptException:
        rospy.loginfo("Listener node terminated.")

3.4.3 设置文件权限和编译

步骤1:设置执行权限

# 给Python脚本添加执行权限
chmod +x ~/catkin_ws_demo/src/my_pkg/scripts/talker.py
chmod +x ~/catkin_ws_demo/src/my_pkg/scripts/listener.py

步骤2:编译工作空间

# 返回工作空间根目录
cd ~/catkin_ws_demo

# 编译整个工作空间
catkin_make

# 重新加载环境变量
source devel/setup.bash

3.4.4 运行节点通信测试

方法1:分别在不同终端运行

终端1:启动ROS核心

# 启动roscore(ROS主节点)
roscore

终端2:运行发布者节点

# 确保环境变量已加载
source ~/catkin_ws_demo/devel/setup.bash

# 运行发布者节点
rosrun my_pkg talker.py

终端3:运行订阅者节点

# 确保环境变量已加载
source ~/catkin_ws_demo/devel/setup.bash

# 运行订阅者节点
rosrun my_pkg listener.py

方法2:使用roslaunch同时启动(见3.5节)

节点通信示意图

3.5 使用roslaunch启动系统

3.5.1 创建launch文件

步骤1:创建launch目录和文件

# 确保launch目录存在
mkdir -p ~/catkin_ws_demo/src/my_pkg/launch

# 创建launch文件
cd ~/catkin_ws_demo/src/my_pkg/launch
nano start_demo.launch

步骤2:编写launch文件内容

<?xml version="1.0"?>
<!--
ROS Launch文件示例
功能:同时启动发布者和订阅者节点
-->
<launch>
    <!-- 启动发布者节点 -->
    <node pkg="my_pkg" type="talker.py" name="talker" output="screen" respawn="true">
        <!-- 可以在这里设置节点参数 -->
        <param name="publish_rate" value="10"/>
    </node>

    <!-- 启动订阅者节点 -->
    <node pkg="my_pkg" type="listener.py" name="listener" output="screen" respawn="true">
    </node>

    <!-- 可选:设置全局参数 -->
    <param name="robot_name" value="dr100"/>
    <param name="debug_mode" value="true"/>

    <!-- 可选:包含其他launch文件 -->
    <!-- <include file="$(find other_pkg)/launch/other.launch"/> -->
</launch>

3.5.2 launch文件参数说明

参数 说明 示例值
pkg 功能包名称 my_pkg
type 可执行文件名 talker.py
name 节点名称(运行时名称) talker
output 输出重定向 screen(终端)/ log(日志文件)
respawn 节点崩溃时自动重启 true / false
required 节点退出时关闭整个launch true / false
args 传递给节点的参数 "--verbose --config=config.yaml"

3.5.3 运行launch文件

# 终端1:启动roscore
roscore

# 终端2:运行launch文件
source ~/catkin_ws_demo/devel/setup.bash
roslaunch my_pkg start_demo.launch

start_demo.launch

4 外设配置

4.1 Robosense RS-16激光雷达

4.1.1 硬件连接和网络配置

步骤1:物理连接

  • 将RS-16激光雷达通过网线连接到工控机的LAN口

  • 确保雷达供电正常(12V)

步骤2:设置静态IP地址

默认配备的是Robosense RS-16激光雷达,需要将雷达与本机连接的LAN口的ip设置为192.168.1.102

Robosense  RS-16 IP

4.1.2 安装驱动依赖

步骤1:更新系统包

# 更新包列表
sudo apt-get update

# 升级已安装的包(可选)
sudo apt-get upgrade

步骤2:安装编译依赖

# 安装YAML解析库
sudo apt-get install -y libyaml-cpp-dev

# 安装网络包捕获库
sudo apt-get install -y libpcap-dev

4.1.3 下载和编译驱动

RoboSense RS-16的ROS驱动可在官方Github下载:rslidar_sdk:https://github.com/RoboSense-LiDAR/rslidar_sdk

步骤1:下载源码

# 进入工作空间src目录
cd ~/catkin_ws/src

# 克隆仓库
git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git --depth 1

# 进入驱动目录
cd rslidar_sdk

步骤2:初始化子模块

# 初始化子模块
git submodule init

# 更新子模块
git submodule update

步骤3:编译驱动

# 返回工作空间根目录
cd ~/catkin_ws

# 编译特定包
catkin_make --pkg rslidar_sdk

# 或编译整个工作空间
catkin_make -j4  # 使用4个线程并行编译

# 重新加载环境
source devel/setup.bash

4.1.4 配置和运行驱动

步骤1:配置雷达参数(可选)

# 编辑配置文件(可选)
nano ~/catkin_ws/src/rslidar_sdk/config/config.yaml

步骤2:启动雷达驱动

# 确保环境变量已加载
source ~/catkin_ws/devel/setup.bash

# 启动雷达驱动
roslaunch rslidar_sdk start.launch

4.1.5 验证雷达数据

步骤1:查看点云数据

驱动加载后,可使用rostopic获取雷达数据:

# 实时查看点云数据(注意:数据量很大)
rostopic echo /rslidar_points --noarr

步骤2:使用rviz可视化

# 启动rviz
rviz

在rviz中:

  • 设置Fixed Frame为"robosense"
  • 点击Add -> By topic -> /rslidar_points -> PointCloud2

Robosense  RS-16 rviz

4.2 IMU

4.2.1 硬件介绍和连接

默认配备维特智能九轴IMU HWT906,可参考官方手册HWT906产品资料,进行配置与校准

4.2.2 安装驱动依赖

步骤1:安装Qt5串口库

# 安装Qt5串口开发库
sudo apt-get install libqt5serialport5-dev

4.2.3 下载和编译驱动

步骤1:下载源码

# 进入工作空间
cd ~/catkin_ws

# 克隆仓库到src目录
git clone --recursive https://github.com/ElettraSciComp/witmotion_IMU_ros.git src/witmotion_ros

步骤2:编译驱动

# 编译特定包
catkin_make --pkg witmotion_ros

# 重新加载环境
source devel/setup.bash

4.2.4 运行和测试IMU

步骤1:启动IMU驱动

# 确保环境变量已加载
source ~/catkin_ws/devel/setup.bash

# 启动IMU驱动
roslaunch witmotion_ros witmotion.launch

步骤2:查看IMU数据

# 查看IMU数据
rostopic echo /imu/data

IMU

5 三维仿真导航实验

5.1 工程环境

PlanRobotShenZhen Githubhttps://github.com/PlanRobotShenZhen/outdoorRobot.git或压缩包提取工程

5.1.1 工程目录结构

~/catkin_ws
├── maps
├── README.md
├── src
│   ├── bot_navigation
│   ├── CMakeLists.txt
│   ├── dr100
│   │   ├── dr100
│   │   ├── dr100_chassis_driver
│   │   ├── robosense_simulator
│   │   ├── rslidar_sdk
│   │   ├── rs_to_velodyne
│   │   ├── velodyne_simulator
│   │   └── witmotion_ros
│   ├── mapping
│   │   ├── LIO-SAM
│   │   ├── pcd2pgm
│   │   ├── SC-LeGO-LOAM
│   │   └── swap_map_xyz.py
│   └── nav_stack
│       ├── hdl
│       │   ├── fast_gicp
│       │   ├── hdl_global_localization
│       │   ├── hdl_localization
│       │   └── ndt_omp
│       └── navigation
└── tools
  • ~/catkin_ws (ROS工作空间根目录)
    • maps/:存放建图生成点云地图文件(如.pcd
    • src/:核心功能包源码目录
      • bot_navigation/:机器人导航相关功能包
      • dr100/:机器人硬件驱动与仿真
        • dr100_chassis_driver/:底盘驱动
        • robosense_simulator/ & velodyne_simulator/:激光雷达仿真
        • rslidar_sdk/ & rs_to_velodyne/:雷达驱动与数据转换
        • witmotion_ros/:IMU 驱动包
      • mapping/:SLAM建图算法包
        • LIO-SAM/ & SC-LeGO-LOAM/:激光惯性SLAM算法
        • pcd2pgm/:点云转栅格地图工具
      • nav_stack/:导航算法栈
        • hdl/:点云处理相关(如hdl_localization定位模块)
        • navigation/:传统导航算法(如代价地图、全局/局部规划)
    • tools/:辅助工具或脚本(非ROS功能包)

5.1.2 工程编译

步骤1:获取工程源码

# 方法1:从GitHub克隆
cd ~
git clone https://github.com/PlanRobotShenZhen/outdoorRobot.git catkin_ws
cd ~/catkin_ws && git submodule update --init --recursive  # 更新子模块

# 方法2:如果已有压缩包,解压到用户主目录
# unzip outdoorRobot.zip -d ~/
# mv outdoorRobot catkin_ws

# 进入工作空间
cd ~/catkin_ws

步骤2:安装系统依赖

# 更新包列表
sudo apt-get update
sudo apt-get install -y libyaml-cpp-dev
sudo apt-get install -y libpcap-dev
sudo apt-get install -y libqt5serialport5-dev
sudo apt-get install -y ros-noetic-navigation
sudo apt-get install -y ros-noetic-robot-localization
sudo apt-get install -y ros-noetic-robot-state-publisher
sudo apt-get install -y ros-noetic-navigation*
sudo apt-get install -y ros-noetic-pointcloud-to-laserscan
sudo apt-get install -y ros-noetic-teb-local-planner
sudo apt-get install -y ros-noetic-serial

注:需要根据官方文档安装gtsam v4.1.0 https://github.com/borglab/gtsam

步骤3:编译工程

# 清理之前的编译结果(如果存在),也可以用于检查是否缺少依赖
catkin_make clean

# 1. 单独编译 lego_loam 的消息文件cloud_msgs (单线程,避免依赖问题)
catkin_make --pkg cloud_msgs -j1

# 2. 编译剩余所有包
catkin_make -DCATKIN_WHITELIST_PACKAGES="" -j4 -DCMAKE_BUILD_TYPE=Release

# 重新加载环境
source devel/setup.bash

步骤4:串口设备配置

# 复制串口规则文件
sudo cp ~/catkin_ws/tools/serial/serial_rules/* /etc/udev/rules.d/

# 重新加载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger

# 将用户添加到dialout组(串口访问权限)
sudo usermod -aG dialout $USER
sudo usermod -aG dialout plan
sudo usermod -aG dialout root

# 重新登录或重启以使权限生效

注:端口设置的规则文件可根据具体情况自行修改。如果遇到编译错误,请检查依赖是否完整安装,或查看错误日志进行排查。

5.2 DR100底盘仿真

5.2.1 启动Gazebo仿真环境

运行DR100底盘仿真包dr100的run.launch:

# 确保工作空间环境已加载
source ~/catkin_ws/devel/setup.bash

roslaunch dr100 gazebo.launch

DR100 仿真

5.2.2 使用RViz可视化机器人

步骤1:启动RViz

# 新开终端,启动RViz
rviz

步骤2:配置RViz显示

在RViz界面中进行以下配置:

  1. 设置固定坐标系

    • 在左侧面板找到"Global Options"
    • 将"Fixed Frame"设置为"base_link"
  2. 添加机器人模型显示

    • 点击左下角"Add"按钮
    • 选择"RobotModel"
    • 确认"Robot Description"参数为"robot_description"
  3. 添加TF坐标系显示

    • 点击"Add" -> "TF"
    • 可以看到机器人各个坐标系的关系

rviz

DR100 仿真 rviz

5.2.3 控制机器人运动

方法1:使用键盘控制

# 安装键盘控制包(如果未安装)
sudo apt-get install ros-noetic-teleop-twist-keyboard

# 启动键盘控制
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

# 按照提示使用以下按键控制:
# u    i    o
# j    k    l
# m    ,    .
# q/z : 增加/减少最大速度
# w/x : 增加/减少线速度
# e/c : 增加/减少角速度

方法2:使用rqt_robot_steering图形控制

# 启动图形控制界面
rosrun rqt_robot_steering rqt_robot_steering

# 在界面中使用滑块或输入框控制线速度和角速度

5.3 三维建图

5.3.1 建图算法选择

启动DR100底盘仿真后,可以通过LeGO-LOAM或LIO-SAM建图算法进行建图,此处使用LeGO-LOAM进行实验。

算法对比:

  • LeGO-LOAM:轻量级激光雷达里程计和建图,适合实时性要求高的场景
  • LIO-SAM:激光惯性里程计和建图,精度更高但计算量较大

5.3.2 配置仿真时间

步骤1:修改LeGO-LOAM配置

首先需要让系统采用仿真时间,即修改~/catkin_ws/src/mapping/SC-LeGO-LOAM/SC-LeGO-LOAM/LeGO-LOAM/launch/run.launch中的/use_sim_time参数为true

gedit ~/catkin_ws/src/mapping/SC-LeGO-LOAM/SC-LeGO-LOAM/LeGO-LOAM/launch/run.launch

修改内容:

<!-- 在launch文件中找到并修改以下参数 -->
<param name="/use_sim_time" value="true" />

use sim time

5.3.3 启动建图系统

启动LeGO-LOAM建图

# 新开终端,加载环境
source ~/catkin_ws/devel/setup.bash

# 启动LeGO-LOAM建图算法
roslaunch lego_loam run.launch

5.3.4 控制机器人进行建图

使用rqt_robot_steering图形控制,在界面中使用滑块或输入框控制线速度和角速度

rosrun rqt_robot_steering rqt_robot_steering

rqt_robot_steering

LeGO-LOAM 建图

5.3.5 保存建图结果

步骤1:完成建图

当建图完成后,在LeGO-LOAM终端按Ctrl+C停止建图,系统会自动保存点云地图

步骤2:查看保存的地图

# 检查地图保存目录
ls -la ~/catkin_ws/maps/LeGO-LOAM/

# 应该看到类似文件:
# finalCloud.pcd          # 最终点云地图
# globalMap.pcd           # 全局地图
# trajectory.pcd          # 轨迹点云

步骤3:使用PCL工具查看点云

# 安装PCL工具(如果未安装)
sudo apt-get install pcl-tools

# 查看最终点云地图
pcl_viewer ~/catkin_ws/maps/LeGO-LOAM/finalCloud.pcd

点云地图

5.4 地图转换

5.4.1 点云转栅格地图

3D点云图保存成功后,需将3D点云图转为2D的栅格地图。本文使用pcd2pgm进行转换。

首先根据具体情况修改~/catkin_ws/src/mapping/pcd2pgm/pcd2pgm/launch/run.launch的参数

image-20250613153134785

然后打开三个终端分别运行以下命令,将栅格地图保存到本地,将生成栅格地图finalCloud.pgm与配置finalCloud.yaml

# 终端一: roscore
roscore
# 终端二: 启动pcd2pgm
roslaunch pcd2pgm run.launch
# 终端三: 保存栅格地图到当前目录,注意不要加.pgm
rosrun map_server map_saver -f finalCloud

5.4.2 参数说明

  • file_directory: 存放pcd文件的路径
  • file_name: pcd文件名称,默认为 finalCloud
  • thre_z_min: 选取的范围最小高度
  • thre_z_max: 选取的范围最大高度
  • flag_pass_through: 选取高度范围内的标志,0 表示保留范围内,1 表示保留范围外
  • thre_radius: 半径滤波的半径
  • thres_point_count: 半径滤波的要求点数个数
  • MeanK: 统计学滤波的半径
  • StddevMulThresh: 统计学滤波的要求点数个数
  • map_resolution: 存储的栅格map的分辨率
  • map_topic_name: 转换后发布的二维地图的topic
  • use_passthrough_filter: 直通滤波开关
  • use_radius_filter: 半径滤波开关
  • use_statistical_filter: 统计学滤波开关

5.4.3 编辑栅格地图(可选)

GIMP官网https://www.gimp.org/downloads/

3D点云图转换成的2D栅格地图可能存在噪点或障碍物边缘断层等问题,可以使用Adobe Photoshop、GIMP等修图软件进行处理。进行擦除噪点、障碍物描边等操作。本文使用GIMP为例:

GIMP

5.5 三维导航

5.5.1 替换地图

三维导航需要3D点云图与2D的栅格地图,需要将finalCloud.pcdfinalCloud.pgmfinalCloud.yaml复制到~/catkin_ws/src/bot_navigation/map/3d/lego文件夹下

cp finalCloud.pcd ~/catkin_ws/src/bot_navigation/map/3d/lego/
cp finalCloud.pgm ~/catkin_ws/src/bot_navigation/map/3d/lego/
cp finalCloud.yaml ~/catkin_ws/src/bot_navigation/map/3d/lego/

5.5.2 启动DR100底盘

参考 5.2 DR100底盘

5.5.3 启动导航程序

打开一个新终端启动导航程序

roslaunch bot_navigation navigation.launch

navigation

5.5.4 启动ROS导航交互软件

ROS导航交互软件:https://github.com/chengyangkj/Ros_Qt5_Gui_App

cd ~/catkin_ws/tools/ros_rqt_gui
./ros_qt5_gui_app

可以点击左上角,拖动机器人进行重定位

ROS导航交互软件

可以点击编辑地图,添加目标点,进行导航

ROS导航交互软件

6 三维实机导航实验

6.1 工程环境

参考 5.1 工程环境

6.2 DR100底盘

需要确保激光雷达、IMU正常链接,然后启动底盘驱动

roslaunch  dr100  run.launch

dr100_run

参考 5.2 DR100底盘仿真

6.3 三维建图

参考 5.3 三维建图

注意与仿真实验中存在区别,需要把仿真时间禁用

display: block; margin: 0 auto;

6.4 地图转换

参考 5.4 地图转换

6.5 三维导航

参考 5.5 三维导航

7 结论

本文介绍了基于DR100无人驾驶平台的SLAM系统搭建与实现过程。从工控机环境配置开始,涵盖了Ubuntu 20.04、ROS Noetic的安装配置,为后续开发奠定了坚实基础。

通过ROS基础教程的学习,掌握了ROS文件系统、节点通信模型等核心概念,并通过实际的话题通信示例加深了理解。在外设配置方面,成功集成了Robosense RS-16激光雷达和维特智能九轴IMU,为SLAM系统提供了必要的传感器数据支持。

在三维仿真导航实验中,利用Gazebo仿真环境验证了LeGO-LOAM建图算法的有效性,并通过pcd2pgm工具实现了3D点云到2D栅格地图的转换,最终构建了完整的导航系统。实机导航实验进一步验证了系统在真实环境中的可行性和稳定性。

整个系统实现了从环境感知、地图构建到路径规划的完整无人驾驶功能链条,为后续的无人驾驶技术研究和应用提供了重要参考。

results matching ""

    No results matching ""