tips:请在使用该系统前安装好相应的库文件(详见附录二),并在不同控制台分别运行roscore(ros操作系统内核)、rosbag play –loop –pause all.bag(ros数据包展示)和rosrun gmapping slam_gmapping(任务四建图处理进程)
该系统程序名为final_system,使用以下命令克隆git仓库:
1 | git clone https://github.com/Asgard-Tim/ROS-Coding.git |
安装好相关库文件后可通过以下命令运行系统程序:
1 | //项目构建 |
完整代码已上传至Github平台,URL地址:Asgard-Tim/ROS-Coding: 重庆大学明月科创实验班软件设计课程作业 (github.com)
Bilibili同步上传系统演示视频Demo,链接:重庆大学明月科创实验班软件设计作业–ROS数据展示系统_哔哩哔哩_bilibili
程序主要结构与算法分析
在**main()**函数中:
创建ROS节点和节点句柄。
调用**initialize()**函数显示初始菜单:提示用户选择登录、注册或退出系统。
定义一个user类,用于保存用户的用户名和密码信息;根据用户选择执行不同的操作:
- 登录:要求用户输入用户名和密码,然后检查是否匹配存储在文件中的用户信息。
- 注册:要求用户输入新的用户名和密码,然后将用户信息保存到文件中。
- 退出系统:结束程序运行。
如果登录成功,调用**systeminitialize()**函数显示登录成功后的菜单:提示用户选择不同的数据可视化选项或退出系统。
根据用户选择执行不同的数据可视化操作:
任务一:用命令行窗口显示小车的IMU和里程计(odometry)数据
IMU数据:订阅IMU数据的ROS话题,将数据传递给回调函数callback1进行处理。
回调函数callback1,处理IMU数据:
- 从接收到的IMU消息中获取线性加速度和角速度信息。
- 使用std::cout打印出线性加速度和角速度信息。
里程计数据:订阅里程计数据的ROS话题,将数据传递给回调函数callback2进行处理。
回调函数callback2,处理里程计数据:
- 从接收到的里程计消息中获取位置和姿态信息。
- 使用std::cout打印出位置和姿态信息。
任务二:用图形界面显示颜色相机和深度相机的数据(利用OpenCV库)
颜色相机数据:订阅颜色相机数据的ROS话题,将数据传递给回调函数callback3进行处理。
回调函数callback3,处理颜色相机数据:
- 将接收到的彩色图像消息转换为OpenCV的图像格式。
- 使用OpenCV的窗口显示彩色图像。
深度相机数据:订阅深度相机数据的ROS话题,将数据传递给回调函数callback4进行处理。
回调函数callback4,处理深度相机数据:
- 将接收到的深度图像消息转换为OpenCV的图像格式。
- 使用OpenCV的窗口显示深度图像。
任务三:用图形界面显示激光雷达的点云数据(利用PCL库)
点云数据:订阅点云数据的ROS话题,将数据传递给回调函数callback5进行处理。
**pcl::visualization::CloudViewer viewer(“Cloud Viewer”);**:创建一个PCL点云可视化器。
回调函数callback5,处理点云数据:
- 将接收到的点云消息转换为PCL的点云格式。
- 使用PCL的可视化器显示点云。
任务四:自行选择一种高级算法(例如语义分割、三维重建、导航定位(SLAM)等),实现该算法(可以直接利用第三方库),将其集成到系统中
- 选择Gmapping算法(一个基于2D激光雷达使用RBPF(Rao-Blackwellized Particle Filters)算法完成二维栅格地图构建的SLAM算法)
- 占据栅格地图数据:订阅占据栅格地图数据的ROS话题,将数据传递给回调函数callback6进行处理。
- 回调函数callback6,处理占据栅格地图数据:
- 从接收到的占据栅格地图消息中获取分辨率、宽度和高度等信息。
- 创建一个OpenCV的图像对象,用于绘制地图。
- 遍历地图的每个栅格,根据栅格的值绘制不同的颜色圆点。
- 使用OpenCV的窗口显示地图。
各功能部分构建过程与实现效果
1.系统界面
(1)登录界面
(2)功能选择界面
2.各部分功能
整体架构思路(以imu数据显示为例,其余任务基本一致):
(1)在运行rosbag后利用rostopic list指令查看当前开放的所有话题
(2)找到所需数据所对应的话题(如imu数据对应的是/imu/data_raw这一topic),利用rostopic info指令查看其消息类型(如图中Type所示)