当前位置: 首页 > news >正文

ROS-激光雷达-消息包格式-获取激光雷达数据-激光雷达避障

文章目录

  • 激光雷达
    • 原理
  • 消息包格式
  • 获取激光雷达数据
  • 激光雷达避障

激光雷达

原理

激光雷达(LiDAR) 是一种利用激光进行距离测量和环境感知的传感器。它通过发射激光束并接收反射光来测量物体的距离,生成点云数据,用于构建环境的三维模型。激光雷达在机器人、自动驾驶、无人机等领域有广泛应用。

RViz 是 ROS(Robot Operating System)中的一个可视化工具,用于显示和调试机器人数据。它支持多种数据类型,包括机器人模型、传感器数据、点云、图像等。

Gazebo 是一个物理仿真器,用于模拟机器人在虚拟环境中的行为。它支持多种机器人模型和传感器,并提供物理仿真功能。

roslaunch wpr_simulation  wpb_simple.launchroslaunch wpr_simulation wpb_rviz.launch

在这里插入图片描述

消息包格式

雷达信息消息包https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/LaserScan.html
https://docs.ros.org/en/noetic/api/sensor_msgs/html/

rostopic echo /scan --noarr 是一个 ROS(Robot Operating System)命令,用于订阅并显示 /scan 话题上的消息内容。–noarr 参数用于简化输出,不显示数组的完整内容,而是显示数组的类型和长度。

llk@LLK:~$ rostopic echo /scan --noarr
header:seq: 14445stamp:secs: 1533nsecs: 920000000frame_id: "laser"
angle_min: -3.141590118408203
angle_max: 3.141590118408203
angle_increment: 0.017501894384622574
time_increment: 0.0
scan_time: 0.0
range_min: 0.23999999463558197
range_max: 6.0
ranges: "<array type: float32, length: 360>"
intensities: "<array type: float32, length: 360>"
---
  1. header
    seq: 消息的序列号,用于标识消息的顺序。在这个例子中,seq: 14445 表示这是第 14445 条消息。
    stamp: 消息的时间戳,表示消息的生成时间。
    secs: 时间戳的秒部分,secs: 1533 表示消息生成于 1533 秒。
    nsecs: 时间戳的纳秒部分,nsecs: 920000000 表示消息生成于 920,000,000 纳秒。
    frame_id: 消息的参考坐标系,frame_id: “laser” 表示消息的参考坐标系是 laser。
  2. angle_min 和 angle_max
    angle_min: 扫描的起始角度,单位为弧度。angle_min: -3.141590118408203 表示扫描从 -π 弧度(即 -180 度)开始。
    angle_max: 扫描的结束角度,单位为弧度。angle_max: 3.141590118408203 表示扫描到 π 弧度(即 180 度)结束。
  3. angle_increment
    angle_increment: 扫描的角度增量,单位为弧度。angle_increment: 0.017501894384622574 表示每个扫描点之间的角度增量约为 1 度(0.0175 弧度)。
  4. time_increment 和 scan_time
    time_increment: 扫描中相邻两个测量之间的时间增量,单位为秒。time_increment: 0.0 表示相邻两个测量之间的时间增量为 0 秒,通常用于静态扫描。
    scan_time: 完成一次完整扫描所需的时间,单位为秒。scan_time: 0.0 表示扫描时间为 0 秒,通常用于静态扫描。
  5. range_min 和 range_max
    range_min: 激光雷达可以可靠测量的最小距离,单位为米。range_min: 0.23999999463558197 表示最小测量距离为 0.24 米。
    range_max: 激光雷达可以可靠测量的最大距离,单位为米。range_max: 6.0 表示最大测量距离为 6 米。
  6. ranges 和 intensities
    ranges: 一个浮点数数组,包含从激光雷达到各个障碍物的距离。ranges: “<array type: float32, length: 360>” 表示数组中有 360 个浮点数,每个浮点数表示一个特定角度的距离。
    intensities: 一个浮点数数组,包含与 ranges 数组中的距离对应的反射强度值。intensities: “<array type: float32, length: 360>” 表示数组中有 360 个浮点数,每个浮点数表示一个特定角度的反射强度。

获取激光雷达数据

 roslaunch  wpr_simulation  wpb_simple.launchrosrun wpr_simulation   demo_lidar_data

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs

激光雷达避障

当接收到雷达信息后,判断是否有障碍物进行转动

在这里插入图片描述
当没有接收到新的速度数据包时,会按照原来的数据包规定的速度来运动

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
#include <geometry_msgs/Twist.h>
// geometry_msgs 是 ROS 中的一个标准消息包,它定义了几何相关的消息类型,如 Point、Vector3、Twist 等。
// sensor_msgs 包依赖于 geometry_msgs,因此当你在 find_package 中指定了 sensor_msgs 时,catkin 会自动加载 geometry_msgs 作为依赖项。
ros::Publisher vel_pub;
static int nCount=0;
void LidarCallback(const sensor_msgs::LaserScan msg)
{   //fmiddist 通常是指 前方中间距离(Front Middle Distance)的缩写。它表示激光雷达在正前方方向(通常是 180 度)测得的距离值float FMidDist=msg.ranges[180];ROS_INFO("前方测距 ranges[180] = %f 米", FMidDist);//避障部分if(nCount>0){nCount--;return;  //继续保持之前的运动}geometry_msgs::Twist twist;if(FMidDist<1.5) //1.5米 一个grid是1米{twist.angular.z = 0.5;nCount=30;}else{twist.linear.x = 0.5;  }vel_pub.publish(twist);
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"lidar_node");ros::NodeHandle n;ros::Subscriber lidar_sub = n.subscribe("/scan",10,&LidarCallback);//避障部分vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);//得到scan话题里的雷达数据后选择行为ros::spin();return 0;
}
#! /usr/bin/env python3
#coding=utf-8import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
count=0
def LidarCallback(msg):global vel_pubglobal countFMidDist=msg.ranges[180]rospy.loginfo("前方测距 ranges[180] = %.2f 米",FMidDist)if count>0:count=count-1returnvel_cmd=Twist()if FMidDist<1.5:vel_cmd.angular.z=0.5count=30else:vel_cmd.linear.x=0.5vel_pub.publish(vel_cmd)if __name__=="__main__":rospy.init_node("lidar_node")lidar_sub=rospy.Subscriber("/scan",LaserScan,LidarCallback,queue_size=10)vel_pub=rospy.Publisher("/cmd_vel",Twist,queue_size=10)rospy.spin()

相关文章:

ROS-激光雷达-消息包格式-获取激光雷达数据-激光雷达避障

文章目录 激光雷达原理 消息包格式获取激光雷达数据激光雷达避障 激光雷达 原理 激光雷达&#xff08;LiDAR&#xff09; 是一种利用激光进行距离测量和环境感知的传感器。它通过发射激光束并接收反射光来测量物体的距离&#xff0c;生成点云数据&#xff0c;用于构建环境的三…...

c++之模板进阶

在前面的文章中&#xff0c;我们已经简单的了解了模板的使用&#xff0c;在这篇文章中&#xff0c;我们将继续深入探讨模板 1.模板的特化 1.1 概念 通常情况下&#xff0c;使用模板可以实现一些与类型无关的代码&#xff0c;但对于一些特殊类型的可能会得到一些错误的结果&a…...

关于Internet Download Manager(IDM)强制下载合并相关二次开发

目录 前言 强制下载视频 强制合并 迁移下载列表 免责声明 附录 前言 那个下载工具IDM不说了&#xff0c;确实有很多便捷的功能&#xff0c;不过也有一些限制 常见的包括但不限于&#xff1a; 1.无法下载有版权保护的视频&#xff08;不管真假&#xff09; 2.有时候下载…...

鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache

OhosVideoCache 是一个专为OpenHarmony开发(HarmonyOS也可以用)的音视频缓存库&#xff0c;旨在帮助开发者轻松实现音视频的边播放边缓存功能。以下是关于 OhosVideoCache 的详细介绍&#xff1a; 1. 核心功能 边播放边缓存&#xff1a;将音视频URL传递给 OhosVideoCache 处理后…...

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…...

程序代码篇---项目目录结构HSV掩膜Opencv图像处理

文章目录 前言第一部分&#xff1a;项目目录结构第二部分&#xff1a;HSV提取HSV色调&#xff08;Hue&#xff09;含义取值范围 饱和度&#xff08;Saturation&#xff09;含义取值范围 亮度&#xff08;Value&#xff09;含义取值范围 第三部分&#xff1a;Opencv图像处理1. 读…...

注解与反射基础

注解 概述 注解&#xff08;Annotation&#xff09;&#xff0c;从jdk5.0引入。 作用 不是程序本身&#xff0c;可以对程序作出解释&#xff08;这一点和注释没什么区别&#xff09;可以被其他程序读取 格式 注释是以“注释名”在代码中存在的&#xff0c;还可以添加一些…...

Vue指令v-html

目录 一、Vue中的v-html指令是什么&#xff1f;二、v-html指令与v-text指令的区别&#xff1f; 一、Vue中的v-html指令是什么&#xff1f; v-html指令的作用是&#xff1a;设置元素的innerHTML&#xff0c;内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…...

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…...

CDDIS从2025年2月开始数据迁移

CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov&#xff0c;并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。...

前端 | JavaScript中的reduce方法

1. 什么是reduce reduce 方法是 JavaScript 中数组的重要方法之一&#xff0c;用于对数组中的元素进行累积计算。它接收一个回调函数作为参数&#xff0c;并返回一个最终计算结果。reduce 在许多场景下都非常有用&#xff0c;比如求和、数组扁平化、对象计数、数据转换等。 2…...

【C++】B2124 判断字符串是否为回文

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;样例&#xff1a; &#x1f4af;方法一&#xff1a;我的第一种做法思路代码实现解析 &#x1f4af;方法二&#xff1a;我…...

人工智能学习(五)之机器学习逻辑回归算法

深入剖析机器学习逻辑回归算法 一、引言 在机器学习领域&#xff0c;逻辑回归是一种极为经典且应用广泛的算法。虽说名字里带有 “回归”&#xff0c;但它主要用于解决分类问题&#xff0c;在医学、金融、互联网等多个领域都发挥着关键作用。例如&#xff0c;在医学上辅助判断…...

Bash 基础与进阶实践指南

目录 Bash 简介与基础基本命令与文件操作权限管理与用户管理重定向与管道变量与环境变量通配符与正则表达式Shell 脚本结构与控制流常用内建命令与技巧文本处理常用命令作业控制与进程管理别名与函数实用技巧与注意事项更多 Bash 进阶话题参考资源 1. Bash 简介与基础 1.1 什…...

基于开源AI智能名片2 + 1链动模式S2B2C商城小程序视角下的个人IP人设构建研究

摘要&#xff1a;本文深入探讨在开源AI智能名片2 1链动模式S2B2C商城小程序的应用场景下&#xff0c;个人IP人设构建的理论与实践。通过剖析个人IP人设定义中的“诉求”“特质”“可感知”三要素&#xff0c;结合该小程序特点&#xff0c;阐述其对个人IP打造的影响与推动作用&…...

基于springboot+vue的航空散货调度系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…...

OSCP 渗透测试:网络抓包工具的使用指南

在 OSCP 考试和渗透测试中&#xff0c;网络数据分析是至关重要的技能。无论是嗅探明文密码、分析恶意流量&#xff0c;还是溯源攻击&#xff0c;抓包工具都是我们的得力助手。 本文将介绍 OSI 七层网络模型 及其在网络分析中的作用&#xff0c;并详细讲解 Wireshark 和 tcpdum…...

Android 进程间通信

什么是IPC&#xff1f; Android 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统&#xff0c;每个应用通常运行在自己的进程中&#xff0c;以提高安全性和…...

Kubernetes学习之通过Service访问Pod

一、基础概述 1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址&#xff0c;当controller用新的pod替代发生故障的pod时&#xff0c;新的pod会分配到新的ip地址&#xff0c;那么客户端如何稳定的找到并访问pod提供的服务。 2.创建service service从…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...