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

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


总结

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

相关推荐
学机械的鱼鱼2 小时前
PX4与ROS2通信原理与仿真环境搭建教程
笔记·学习·px4·ros2
郝学胜-神的一滴2 小时前
CMake 011:跨平台动态库编译
开发语言·c++·嵌入式硬件·qt·程序人生·cmake·liunx
坤坤藤椒牛肉面2 小时前
EXIT外部中断
单片机·嵌入式硬件
xiangw@GZ3 小时前
射频信号隔离度量化分析及优化措施
单片机·嵌入式硬件
╰ㄣ浮华若梦︶ _3 小时前
51单片机的DS1302使用
单片机·嵌入式硬件·51单片机·ds1302·8051
启芯硬件3 小时前
用AI解决电源最复杂PDN问题的实战设计案例
人工智能·经验分享·嵌入式硬件·硬件工程·高速仿真
崇山峻岭之间3 小时前
单片机USART实验
单片机·嵌入式硬件
m0_377108143 小时前
stm32软件i2c
stm32·单片机·嵌入式硬件
殷忆枫3 小时前
基于STM32和LD3320语音模块串口交互
stm32·单片机·嵌入式硬件