【6. 激光雷达接入ROS】

这篇具有很好参考价值的文章主要介绍了【6. 激光雷达接入ROS】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】🥳🥳🥳
  • 2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号👻👻👻,座右铭:脚踏实地,仰望星空🛹🛹🛹
  • 本文章属于《Ubuntu学习》和《ROS机器人学习》
    :围绕Ubuntu系统基本配置及相关命令行学习记录!机器人操作系统 (ROS) 是一组软件库和工具,可帮助您构建机器人应用程序。👍👍👍

1. 前言

Ubuntu环境搭建
【经典Ubuntu20.04版本U盘安装双系统教程】
【Windows10安装或重装ubuntu18.04双系统教程】
【Ubuntu同步系统时间】
【Ubuntu中截图工具】
【Ubuntu安装QQ】
【Ubuntu安装后基本配置】
【Ubuntu启动菜单的默认项】
【ubuntu系统中修改hosts配置】
【18.04Ubuntu中解决无法识别显示屏】
ROS学习笔记
【1. Ubuntu18.04安装ROS Melodic】
【2. 在Github上寻找安装ROS软件包】
【3. 初学ROS,年轻人的第一个Node节点】
【4. ROS的主要通讯方式:Topic话题与Message消息】
【5. ROS机器人的运动控制】

接下来学习激光雷达如何接入ros机器人,激光雷达是用来探测周围障碍物的分布状况!
【6. 激光雷达接入ROS】

2. 激光雷达分类

其按照测量的维度可以分为单线雷达和多线雷达

【6. 激光雷达接入ROS】
按照测量原理分为三角测距雷达和TOF雷达

【6. 激光雷达接入ROS】
根据工作方式分为机械旋转雷达和固态雷达

【6. 激光雷达接入ROS】
激光雷达虽各有不同,但是在ROS中呈现的数据格式是一样的,只是在数据完整度和精度上会有所差异。下面就选取TOF激光雷达作为例子

3. TOF和三角测距激光雷达

3.1 何为飞行时间测距(TOF)?

简单来说,就是计算光的“飞行时间”。

【6. 激光雷达接入ROS】

由激光器发射一个激光脉冲,通过计时器记录下光的出射和回返的时间,两个时间相减即可得到光的“飞行时间”,而光速是固定的,根据已知速度和时间就可以计算出距离。

3.2 何为三角测距?

三角测距采用激光器发射激光,在照射到物体之后,反射光会由线性CCD接收,因为激光器和探测器间隔了一段距离,所以根据光学路径,不同距离的物体将会在CCD上成像在不同的位置,按照三角公式进行计算,就可以推导出被测物体的距离。
【6. 激光雷达接入ROS】

3.3 激光雷达测距

TOF激光雷达计算如下
【6. 激光雷达接入ROS】

【6. 激光雷达接入ROS】

4. 使用RViz观测传感器数据

RViz这个工具的全名叫做 The Robot Visualization Tool

【6. 激光雷达接入ROS】

4.1 运行模板样机

打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rviz

首先把这个Fixed Frame修改成base_footprint

【6. 激光雷达接入ROS】
状态栏添加机器人模型,最后点击ok
【6. 激光雷达接入ROS】
选择激光雷达的话题名称/scan

【6. 激光雷达接入ROS】
调整size为0.03
【6. 激光雷达接入ROS】
调整RViz和Gazebo分屏

【6. 激光雷达接入ROS】
Gazebo是模拟真实机器人发出传感器数据的工具
RViz显示的是机器人实际能探测到的环境状况
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
另外一点就是RViz并不参与机器人算法的运行,它只是一个为了方便人类进行观测的工具而已
即使没有RViz,也不影响机器人的ROS系统的运行
只有需要观察某些数据实时变化的时候,才会打开RViz
下面添加虚拟环境的圆柱体障碍物
【6. 激光雷达接入ROS】

【6. 激光雷达接入ROS】

4.2 保存RViz配置

点击file菜单,选择Save Config As
【6. 激光雷达接入ROS】
选择保存地址,方便后期直接加载
【6. 激光雷达接入ROS】
然后关闭所有终端
打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rviz

然后在RViz中的file菜单,选择Open Config
【6. 激光雷达接入ROS】
然后选择刚保存的位置

【6. 激光雷达接入ROS】

4.3 自动加载rviz配置文件

还可以在launch文件里自动加载rviz配置文件
先关闭RViz,然后打开终端输入

roslaunch wpr_simulation wpb_rviz.launch

【6. 激光雷达接入ROS】
关闭摄像头,保留激光雷达
【6. 激光雷达接入ROS】
调整视角
【6. 激光雷达接入ROS】

5. ROS系统中的激光雷达消息包格式

5.1 运行模板样机

打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
roslaunch wpr_simulation wpb_rviz.launch

【6. 激光雷达接入ROS】

在Gazebo中围绕机器人堆积障碍物
【6. 激光雷达接入ROS】

5.2 sensor_msgs中Laserscan_msgs消息属性

进入ROS Index官网搜索sensor_msgs
【6. 激光雷达接入ROS】

【6. 激光雷达接入ROS】
进入website
【6. 激光雷达接入ROS】
在消息中找到LaserScan
【6. 激光雷达接入ROS】
这就打开了激光雷达消息包的格式定义

【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】

5.3 查看scan消息

新开终端输入

rostopic echo /scan --noarr

【6. 激光雷达接入ROS】
显示对比

【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】

6. 用C++获取ROS激光雷达数据节点

6.1 运行模板样机

采用wpr_simulation开源工程,打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rosrunwpr_simulation deno_lidar_data


【6. 激光雷达接入ROS】

6.2 构思功能的思路和步骤

构思
【6. 激光雷达接入ROS】
实现步骤

  1. 构建一个新的软件包,包名叫做lidar_pkg。
  2. 在软件包中新建一个节点,节点名叫做lidar_node。
  3. 在节点中,向ROS大管家NodeHandle申请订阅话题/scan,并设置回调函数为LidarCallback()。
  4. 构建回调函数LidarCallback(),用来接收和处理雷达数据。
  5. 调用ROS_INFO()显示雷达检测到的前方障碍物距离。

6.3 创建lidar_pkg包

在工作空间src文件创建基于sensor_msgs模板的lidar_pkg

cd ~/catkin_ws/src/
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs

【6. 激光雷达接入ROS】
在lidar_pkg文件夹下src中创建lidar_node.cpp
【6. 激光雷达接入ROS】

【6. 激光雷达接入ROS】

6.4 编写订阅者节点

lidar_node源码

#include <ros/ ros.h>
#include <sensor msgs/Laserscan.h>
void Lidarcallback(const sensor_msgs::LaserScan msg)
{
	float fMidDist = msg.ranges[180] ;
	ROS_INFO("前方测距ranges [180]=%f 米", fMidDist);
}
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);
	ros::spin();
	return 0;
}


ctrl+s快捷保存

6.5 设置C++编译规则

打开CMake文件


add_executable(lidar_node src/lidar_node.cpp)
target_link_libraries(lidar_node
	${catkin_LIBRARIES}
)


ctrl+s快捷保存
【6. 激光雷达接入ROS】
ctrl+shift+b快捷编译

6.6 编译运行lidar_node节点

编译,打开终端

cd ~/catkin_ws/
catkin_make

采用wpr_simulation开源工程,打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node


【6. 激光雷达接入ROS】
前方距离2.6m,然后在Gazebo中调整书柜,选择移动靠近机器人
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
可参照可以打开.wpr_simulation里的demo_lidar_data.cpp文件

【6. 激光雷达接入ROS】

7. 用python获取ROS激光雷达数据节点

7.1 运行模板样机

采用wpr_simulation开源工程,打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun wpr_simulation deno_lidar_data.py

【6. 激光雷达接入ROS】

7.2 构思功能的思路和步骤

构思
【6. 激光雷达接入ROS】
实现步骤

  1. 构建一个新的软件包,包名叫做lidar_pkg。
  2. 在软件包中新建一个节点,节点名叫做lidar_node.py。
  3. 在节点中,向ROS大管家rospy申请订阅话题/scan,并设置回调函数为LidarCallback()。
  4. 构建回调函数LidarCallback(),用来接收和处理雷达数据。
  5. 调用loginfo()显示雷达检测到的前方障碍物距离。

7.3 创建lidar_pkg包

在工作空间src文件创建基于sensor_msgs模板的lidar_pkg,编译

cd ~/catkin_ws/src/
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs
cd ..
catkin_make

【6. 激光雷达接入ROS】

在lidar_pkg文件夹下新建script文件夹中创建lidar_node.py
【6. 激光雷达接入ROS】

【6. 激光雷达接入ROS】

7.4 编写订阅者节点

先引入python包,设置中文utf-8显示

  • ros>=20.04,采用python3
  • ros<20.04,采用python

lidar_node.py源码

#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor_msgs.msg import LaserScan
def Lidarcallback(msg):
	dist = msg.ranges [ 180]
	rospy.loginfo("前方测距 ranges [ 180] = %f 米" , dist)
if _name ="_main_":
	rospy.init_node( "lidar_node" )
	lidar_sub = rospy.Subscriber( " /scan" ,LaserScan,Lidarcallback,queue_size=10)
	rospy.spin()

ctrl+s快捷保存

7.5 添加可执行的权限

在所在文件夹打开终端

cd catkin_ws/src/lidar_pkg/scripts/
ls
chmod +x lidar_node.py
ls

文件名变成绿色表示权限添加成功

【6. 激光雷达接入ROS】

7.6 运行lidar_node节点

采用wpr_simulation开源工程,打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node.py


【6. 激光雷达接入ROS】

前方距离2.6m,然后在Gazebo中调整书柜,选择移动靠近机器人
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
【6. 激光雷达接入ROS】
可参照可以打开wpr_simulation里的script文件夹中创建lidar_node.py

【6. 激光雷达接入ROS】

8. 用C++编写激光雷达避障节点

【6. 激光雷达接入ROS】
基于前面学习的机器人运动控制和激光雷达数据,下面将联系这两点编写激光雷达避障节点

8.1 构思功能的思路和步骤

  1. 让大管家NodeHandle 发布速度控制话题/cmd_vel 。
  2. 构建速度控制消息包vel_cmd。
  3. 根据激光雷达的测距数值,实时调整机器人运动速度,避开障碍物。

8.2 修改lidar_node.cpp

【6. 激光雷达接入ROS】
见6.4源码
修改成如下lidar_node源码

#include <ros/ ros.h>
#include <sensor msgs/Laserscan.h>
#include <geometry msgs/Twist.h>
ros::Publisher vel_pub;

void Lidarcallback(const sensor_msgs::LaserScan msg)
{
	float fMidDist = msg.ranges[180] ;
	ROS_INFO("前方测距ranges [180]=%f 米", fMidDist);
	geometry msgs::Twist vel_cmd ;
	if( fMidDist< 1.5)
	{
		vel_cmd.angular.z = 0.3;
	}
	else
	{
		vel_cmd.linear.x = 0.05;
	}
	vel_pub.publish(vel_cmd);


}
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);
	ros::spin();
	return 0;
}


ctrl+s快捷保存

ctrl+shift+b快捷编译
【6. 激光雷达接入ROS】

8.4 运行lidar_node节点

采用wpr_simulation开源工程,打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node


【6. 激光雷达接入ROS】
机器人撞到障碍物,机器人有宽度

8.4 优化避障策略

当机器人检测前方障碍物时,最简单把转弯角度调大一点,原地转弯
lidar_node源码

#include <ros/ ros.h>
#include <sensor msgs/Laserscan.h>
#include <geometry msgs/Twist.h>
ros::Publisher vel_pub;
int ncount = 0;

void Lidarcallback(const sensor_msgs::LaserScan msg)
{
	float fMidDist = msg.ranges[180] ;
	ROS_INFO("前方测距ranges [180]=%f 米", fMidDist);
	if(ncount > 0)
	{
		ncount--;
		return;
	}

	
	geometry msgs::Twist vel_cmd ;
	if( fMidDist< 1.5)
	{
		vel_cmd.angular.z = 0.3;
		ncount = 50;
	}
	else
	{
		vel_cmd.linear.x = 0.05;
	}
	vel_pub.publish(vel_cmd);


}
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);
	ros::spin();
	return 0;
}


ctrl+s快捷保存

ctrl+shift+b快捷编译
然后在调试就OK啦
可参照开源项目wpr_simulation下的src文件夹的demo_lidar_behavior.cpp

【6. 激光雷达接入ROS】

9. 用python编写激光雷达避障节点

9.1 构思功能的思路和步骤

构思
【6. 激光雷达接入ROS】
实现步骤

  1. 让大管家rospy 发布速度控制话题/cmd_vel 。
  2. 构建速度控制消息包vel_cmd。
  3. 根据激光雷达的测距数值,实时调整机器人运动速度,避开障
    碍物。

9.2 修改lidar_node.py

打开7.4编写lidar_node.py
【6. 激光雷达接入ROS】

lidar_node.py源码

#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist

count =0

def Lidarcallback(msg):
	global vel_pub
	global count
	dist = msg.ranges [ 180]
	rospy.loginfo("前方测距 ranges [ 180] = %f 米" , dist)
	
	if count > 0:
		count = count - 1
		return
	
	vel_cmd = Twist()
	if dist< 1.5:
		vel_cmd .angular.z = 0.3
	else:
		vel_cmd.linear.x = 0.05
	vel_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()

ctrl+s快捷保存

6.6 运行lidar_node节点

采用wpr_simulation开源工程,打开三个终端分别运行三条指令

roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node.py


【6. 激光雷达接入ROS】
可参照可以打开wpr_simulation里的script文件夹中demo_lidar_behavior.py
【6. 激光雷达接入ROS】

10. 总结

本节学习了ROS机器人的激光雷达原理和数据查看,尝试C++和python两种语言编写,并且结合前面的机器人运动编写了避障节点,接下来会介绍机器人的IMU传感器的操作。🎉🎉🎉文章来源地址https://www.toymoban.com/news/detail-460015.html

到了这里,关于【6. 激光雷达接入ROS】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS机器人应用(6)—— 激光雷达建图和导航

    小车开机,连接WIFI,密码:dongguan。 启动激光建图(服务端) 查看建图效果(客户端) 可以使用键盘控制、APP遥控、PS2遥控、航模遥控进行控制小车运动。 建图完成,保存地图 (服务端) 保存方法1: 保存方法2: 文件挂载,查看地图 注:地图文件可以使用PhotoShop进行编

    2024年02月02日
    浏览(33)
  • 基于ROS的自动驾驶 激光雷达点云物体检测 项目实战

    前言: 基于Apollo的preception与Autoware的lidar_apollo_cnn_seg_detect模块,并详细记录ROS系统上进行实时检测全部流程和踩坑,文章最后附上rosbag和rosbag的制作方法。参考文章:https://adamshan.blog.csdn.net/article/details/106157761?spm=1001.2014.3001.5502感谢大佬的杰作。 检测效果视频 环境 RTX 2060(

    2024年02月08日
    浏览(31)
  • 镭神智能N10激光雷达测评+ROS_Cartographer应用测试

      将N10雷达连接ROS主控(本次使用Nvidia Jetson nano+melodic系统进行测试),通过Ubuntu电脑或虚拟机查看构建好的地图。   N10雷达的扫描频率为 6~12HZ的可调区间 ,对应可实现 0.48°~0.96°的角度分辨率,N10采用TOF的测距技术,每秒4500次的高速激光测距采样能力,可以在25米半径

    2024年02月16日
    浏览(30)
  • 多传感器ROS rviz显示,TF转换(如雷达和激光雷达)

    当我们拿到不同的传感器时,我们在调试后希望将他们用ros下的rviz显示在同一页面下,相机(image)和单一的传感器显示通常比较简单,往往我们加入两个有空间坐标的传感器会报错,没有转换关系或者xx frame不存在。这是因为在ROS中,我们需要建立一个rf-tree来管理我们的传

    2023年04月13日
    浏览(38)
  • 仿真机器人-深度学习CV和激光雷达感知(项目2)day03【机器人简介与ROS基础】

    💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容是我为复试准备的第二个项目 💫欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容 🌟 预置知识:基本Python语法,基本linux命令行使用 以下的几个专栏是本人比较满意的专栏 (大部分专栏仍在持续更新

    2024年01月19日
    浏览(35)
  • 超维空间S2无人机使用说明书——11、使用3维激光雷达实现ROS无人机的精准定位

    一、视频演示 视频演示: 3D雷达定位效果展示 二、源码连接 后续补充 三、启动雷达节点,确保雷达发布数据 未出现红色报错,表明程序运行正常 launch文件详解

    2024年01月23日
    浏览(37)
  • 【EHub_tx1_tx2_A200】Ubuntu18.04 + ROS_ Melodic + 锐驰LakiBeam 1L单线激光 雷达评测

            大家好,我是虎哥,最近这段时间,又手欠入手了锐驰LakiBeam 1L激光雷达,实在是性价比太优秀,话说,最近激光雷达圈确实有点卷。锐驰官网的资料已经很丰富,我这里总结一下自己的简单测试经验,分享给大家。          LakiBeam1L是锐驰智光面向中低速场

    2024年02月03日
    浏览(29)
  • 自动驾驶感知——激光雷达基本概念|激光雷达点云|激光雷达的标定

    激光探测及测距系统(Light Detection and Ranging,LiDAR) 激光雷达是一种通过发射激光束探测目标的位置、速度等特征量 的雷达系统 激光波段位于0.5μm-10μm,以光电探测器为接收器件,以光学望远镜为天线。 特点 • 角分辨率、距离分辨率高 • 抗干扰能力强 • 三维坐标、反射率

    2024年02月02日
    浏览(33)
  • 4D毫米波雷达和3D雷达、激光雷达全面对比

              众所周知,传统3D毫米波雷达存在如下性能缺陷:         1)静止目标和地物杂波混在一起,难以区分;         2) 横穿车辆和行人多普勒为零或很低,难以检测;         3) 高处物体和地面目标不能区分,容易造成误刹,影响安全性;        

    2024年02月05日
    浏览(41)
  • 激光雷达技术路线及产业链梳理:OPA+FMCW或成为未来激光雷达终极解决方案

    前言:本文对激光雷达产业进行梳理,从上游器件、中下游终端厂商等几个部分来剖析激光雷达产业链。 激光雷达:自动驾驶的核心传感器 激光雷达是通过发射激光束作为来探测目标位置、速度、结构等特征的雷达系统。与其他雷达系统的原理类似,激光雷达是向目标发射

    2024年02月07日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包