
🎬 渡水无言 :个人主页渡水无言
❄专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》
❄专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》
❄专栏传送门 :《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏》
⭐️流水不争先,争的是滔滔不绝
📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生
| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生
在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连
目录
[一、ROS2 激光雷达数据基础](#一、ROS2 激光雷达数据基础)
[二、在 RViz2 中查看激光雷达数据](#二、在 RViz2 中查看激光雷达数据)
[2.1. 启动仿真环境](#2.1. 启动仿真环境)
[2.2、打开 RViz2](#2.2、打开 RViz2)
前言
前几期博客我们完成了节点、话题、运动控制 /cmd_vel。而机器人要自主移动,那就得有个眼睛,必须看得见障碍物 ,而激光雷达就是一个很常用的机器人的 "眼睛"。本期博客我们就来介绍一下激光雷达的原理,并进行激光雷达数据的获取仿真实验。
一、ROS2 激光雷达数据基础
激光雷达的旋转部分搭载激光测距探头,其在旋转的过程中每隔一定角度就会测量一次距离值。当其旋转一圈时,刚好可以对周围障碍物进行均匀的测距采样,这么一组测距值就是激光雷达的输出数值。 如下图所示:

标准约定
话题名:/scan(REP‑138 标准)
消息类型:sensor_msgs::msg::LaserScan
LaserScan 消息关键字段
cpp
header # 时间戳与坐标系
angle_min # 起始角度(弧度)
angle_max # 终止角度(弧度)
angle_increment # 角度步长
range_min # 最小测距(m)
range_max # 最大测距(m)
ranges[] # 距离数组(核心数据)
intensities[] # 信号强度
我们最常用的就是:ranges 数组,里面存着每个角度的障碍物距离。
二、在 RViz2 中查看激光雷达数据
2.1. 启动仿真环境
输入代码如下:
cpp
ros2 launch wpr_simulation2 wpb_simple.launch.py
如下图所示:

2.2、打开 RViz2
在ROS2中,提供了一个图形化工具,可以直观的查看传感器的数值。这个工具名字叫RViz2
打开第2个终端子窗口。,输入以下代码:
cpp
source ~/ros2_ws/install/setup.bash
rviz2
如下图所示:

软件弹窗如下所示:

2.3、使用rviz2
注意:使用这个软件前要开启wpr_simulation2仿真环境
cpp
ros2 launch wpr_simulation2 wpb_simple.launch.py
然后再使用如下命令,打开rviz2
cpp
rviz2
先修改fix那一栏,再点左下角的add,再选择robot,再点ok,然后再点击RobotModel 下面的 Description Topic,把它改成:
cpp
/robot_description
这样就能看到机器人的模型了。

鼠标可拖动转换观看视角。
我们可以加一条激光雷达的显示条目,还是在add里添加,如下图所示:

然后我们要修改相关的配置,把laserscan里的topic选择为如下图所示,还能看到前边出现一排红点:

现在看到这个红点太小了,咱们可以修改size,把他改大一点,可以看到红点变大了:

2.4、RViz和Gazebo的区别和联系


Gazebo增加了正方柱体、圆柱体,可以在RViz同步看到红色点。,如上图所示:
Gazebo = 真实的赛道
机器人在这里跑,会撞到墙、会打滑、会被障碍物挡住,一切都是 "真实的"。
RViz = 监控室里的显示屏
你看不到机器人本身,只能看到它的位置、雷达扫到的障碍物、运动轨迹,用来调试和监控。可以直观看到机器人模型和雷达点云,确认数据是否正常

2.5、rviz2的保存
我们可以把刚才的配置保存一下,如下图所示,

然后保存文件,如下图所示:

然后我们可以重新启动rviz2,再如下图点击

选择刚才咱们保存的配置文件

咱们可以看到之前咱们保存的配置回来了,如下图所示:

2.6、重新打开之前保存的RViz2文件
cpp
rviz2 -d ~/lidar.rviz
指令指令执行后,会弹出RViz2窗口对话框,这时候的RViz2直接显示为之前保存配置时的样子。如下图所示:

三、激光雷达数据获取
我们创建一个功能包 lidar_pkg,订阅雷达数据并打印正前方距离。
3.1、创建包
输入以下代码:
cpp
cd ~/ros2_zice/src
ros2 pkg create lidar_pkg
3.2、lidar_data.cpp编写
代码如下:
cpp
#include <rclcpp/rclcpp.hpp>
#include <sensor_msgs/msg/laser_scan.hpp>
std::shared_ptr<rclcpp::Node> node;
// 雷达回调函数
void LidarCallback(const sensor_msgs::msg::LaserScan::SharedPtr msg)
{
// 获取雷达数据总个数
int nNum = msg->ranges.size();
// 正前方角度对应的索引
int nMid = nNum / 2;
// 正前方障碍物距离
float fMidDist = msg->ranges[nMid];
// 只打印距离值,nMid 是索引,不用打印
RCLCPP_INFO(node->get_logger(), "前方距离 = %f m", fMidDist);
}
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
node = std::make_shared<rclcpp::Node>("lidar_data_node");
// 订阅 /scan 话题
auto lidar_sub = node->create_subscription<sensor_msgs::msg::LaserScan>(
"/scan", 10, LidarCallback);
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
3.3、CMakeLists.txt编写
输入以下代码:
cpp
cmake_minimum_required(VERSION 3.8)
project(lidar_pkg)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# 查找依赖
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
# 只编译雷达数据获取节点
add_executable(lidar_data src/lidar_data.cpp)
ament_target_dependencies(lidar_data
rclcpp
sensor_msgs
)
# 只安装这一个节点
install(TARGETS
lidar_data
DESTINATION lib/${PROJECT_NAME}
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
3.4、package.xml
修改软件包信息,如下所示:
cpp
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>lidar_pkg</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="duan@todo.todo">duan</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>sensor_msgs</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
3.5、编译软件包
cpp
cd ~/ros2_ws
colcon build
//加载环境
source install/setup.bash
3.6、运行节点
代码如下:
cpp
ros2 run lidar_pkg lidar_data
运行后,终端会持续打印前方障碍物距离,如下图所示:

总结
本期博客我们就来介绍一下激光雷达的原理,并进行激光雷达数据的获取仿真实验。