ROS开发专栏---激光雷达数据获取仿真实验+ RViz2使用教程--适配Ubuntu 22.04

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《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)

三、激光雷达数据获取

3.1、创建包

3.2、lidar_data.cpp编写

3.3、CMakeLists.txt编写

3.4、package.xml

3.5、编译软件包

3.6、运行节点

总结


前言

前几期博客我们完成了节点、话题、运动控制 /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

运行后,终端会持续打印前方障碍物距离,如下图所示:


总结

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

相关推荐
西城微科方案开发8 小时前
多品类电子秤一体化PCBA整体方案
单片机·嵌入式硬件·电子秤
火花页.9 小时前
【正点原子ZYNQ领航者7020】PS端GPIO中断→按键控制LED实验
单片机·嵌入式硬件
ye150127774559 小时前
4.2V升6V1A同步升压WT3213
单片机·嵌入式硬件·其他·硬件工程
嵌入式小站10 小时前
STM32 可移植教程 02:按键状态机,消抖、长按、释放一行也不用多写(实战篇)
chrome·vscode·stm32·单片机·嵌入式硬件
Szime10 小时前
AD9694 国产替代方案:四通道高速 ADC 在通信与雷达项目中的选型参考
单片机·嵌入式硬件·fpga开发
fanged11 小时前
Datasheet学习6(光机)
嵌入式硬件
芯岭技术郦12 小时前
高性能的 32 位 ARM® Cortex®-M0+内核PY32F002A
单片机·嵌入式硬件
破晓单片机12 小时前
060、STM32项目分享:养老智能手环系统
stm32·单片机·嵌入式硬件
H__Rick12 小时前
C51学习-DAY4
嵌入式硬件·学习·51单片机·硬件工程
csg110713 小时前
PIC16F1947驱动CH376芯片实现SD卡数据存储
单片机·嵌入式硬件·物联网·自动化