0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ROS中发布激光扫描消息

新机器视觉 来源:机器视觉智能检测 作者:机器视觉智能检测 2022-04-07 10:08 次阅读


	

激光雷达工作时会先在当前位置发出激光并接收反射光束,解析得到距离信息,而后激光发射器会转过一个角度分辨率对应的角度再次重复这个过程。

限于物理及机械方面的限制,激光雷达通常会有一部分“盲区”。使用激光雷达返回的数据通常可以描绘出一幅极坐标图,极点位于雷达扫描中心,0-360°整周圆由扫描区域及盲区组成。

在扫描区域中激光雷达在每个角度分辨率对应位置解析出的距离值会被依次连接起来,这样,通过极坐标表示就能非常直观地看到周围物体的轮廓,激光雷达扫描范围示意图可以参见下图。

cf45ef16-b604-11ec-aa7f-dac502259ad0.jpg

激光雷达通常有四个性能衡量指标:测距分辨率、扫描频率(有时也用扫描周期)、角度分辨率及可视范围。

测距分辨率衡量在一个给定的距离下测距的精确程度,通常与距离真实值相差在5-20mm;扫描频率衡量激光雷达完成一次完整扫描的快慢,通常在10Hz及以上;

角度分辨率直接决定激光雷达一次完整扫描能返回多少个样本点;可视范围指激光雷达完整扫描的广角,可视范围之外即为盲区。

目前,移动机器人的研究中已经大量使用激光雷达辅助机器人的避障导航。通常激光雷达会提供ROS驱动,如果没有的话我们也可以自己采集激光数据后按照ROS中定义的消息格式将信息发布出去。

首先,输入下面的指令查看LaserScan消息结构:

rosmsg show sensor_msgs/LaserScan

LaserScan消息结构如下:

std_msgs/Header header     
uint32 seq
time stamp      
string frame_id  
# in frame frame_id, angles are measured around 
the positive Z axis (counterclockwise, if Z is up)             
# with zero angle being forward along the x axis                   
float32 angle_min    
# start angle of the scan [rad]float32 angle_max    
# end angle of the scan [rad]float32 angle_increment # angular distance between measurements [rad]
float32 time_increment  
# time between measurements [seconds] - if your scanner             
# is moving, this will be used in interpolating position             
# of 3d pointsfloat32 scan_time    
# time between scans [seconds]
float32 range_min    
# minimum range value [m]float32 range_max    
# maximum range value [m]
float32[] ranges     
# range data [m] (Note: values < range_min or > range_max should be discarded)float32[] intensities  
# intensity data [device-specific units]. If your device does not provide intensities, please leave the array empty.

以下图为例,该激光雷达扫描范围为270°,角度分辨率为0.25°,扫描距离为0~20m,每扫描一圈会得到1081个点:

cf5f3f2a-b604-11ec-aa7f-dac502259ad0.jpg

那么该激光雷达发布的LaserScan消息内容如下:

angle_min= -135 * (pi/180);    
//angle correspond to FIRST beam in scan ( in rad)angle_max= 135 * (pi/180);    
//angle correspond to LAST beam in scan ( in rad)angle_increment =0.25 * (pi/180); 
// Angular resolution i.e angle between 2 beams
// lets assume sensor gives 50 scans per second. i.e every 20 milli seconds 1 scan with 1081 beams.
// Each beam is measured in (20 ms/ 1081 ) ~ = 0.0185 mstime_increment = (1 / 50) / (1081); 
scan_time = ;  
// scan is collected at which timerange_min =0 ;  
// in metersrange_max = 20; 
// scan can measure upto this range// ranges is array of 1081 floats for each laser beamranges[0] =   
//distance measure corresponds to angle -135 degranges[1] =   
//distance measure corresponds to angle -134.75 deg  
.  
.  
.ranges[1080] =  
//distance measure corresponds to angle +135 deg
// To understand Intensities // if a laser beam hits reflective surface like glass it will have intensity 1. 
// And if beam hit some surface which absorbs laser , then intensity is zero. 
// Middle values are different surfaces in between.

下面的代码模拟了激光雷达的数据,并将sensor_msgs/LaserScan消息发布到/scan话题上:

#include #include 
int main(int argc, char** argv){  
ros::init(argc, argv, "laser_scan_publisher");  
ros::NodeHandle n;
  ros::Publisher scan_pub = n.advertise("scan", 50);
  unsigned int num_readings = 100;  
double laser_frequency = 40;  
double ranges[num_readings];  
double intensities[num_readings];  
int count = 0;
  ros::Rate r(1.0);
  while(n.ok())  
{    
//generate some fake data for our laser scan    
for(unsigned int i = 0; i < num_readings; ++i)    
{      
ranges[i] = count;      
intensities[i] = 100 + count;    
}    
ros::Time scan_time = ros::now();
    //populate the LaserScan message    
sensor_msgs::LaserScan scan;    
scan.header.stamp = scan_time;    
scan.header.frame_id = "base_link";    
scan.angle_min = -1.57;    
scan.angle_max = 1.57;    
scan.angle_increment = 3.14 / num_readings;    
scan.time_increment = (1 / laser_frequency) / (num_readings);    
scan.range_min = 0.0;    
scan.range_max = 100.0;    
scan.ranges.resize(num_readings);    
scan.intensities.resize(num_readings);    
for(unsigned int i = 0; i < num_readings; ++i)    
{      
scan.ranges[i] = ranges[i];      
scan.intensities[i] = intensities[i];    
}
    
scan_pub.publish(scan);
    ++count;    
r.sleep();  
}}

可以在rviz中将激光数据点显示出来:Fixed Frame修改为base_link,添加LaserScan并将Topic设为/scan

cf75df3c-b604-11ec-aa7f-dac502259ad0.gif

如果Fixed Frame为map,为了能正确显示出激光扫描点来,需要发布map和base_link之间的坐标变换关系(因为我们的激光数据是相对于base_link坐标系描述的)。

如果这两个参考系不发生相对位置变化,那么可以用static_transform_publisher工具发布两个参考系之间的静态坐标变换。

命令的格式如下:

static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_msstatic_transform_publisher x y z qx qy qz qw frame_id  child_frame_id period_in_ms

以上两种命令格式,需要设置坐标的偏移和旋转参数,偏移参数都使用相对于x、y、z三轴的坐标位移。旋转参数第一种命令格式使用以弧度为单位的 yaw/pitch/roll三个角度,第二种命令格式使用四元数表达旋转角度。发布频率以ms为单位,一般100ms比较合适。

static_transform_publisheris designed both as a command-line tool for manual use, as well as for use withinroslaunchfiles for setting static transforms. For example:

"tf" type="static_transform_publisher" 
name="link1_broadcaster" 
args="1 0 0 0 0 0 1 link1_parent link1 100" />

ROS中使用激光雷达(镭神智能)

LS01C是深圳市镭神智能系统有限公司研发的激光三角测距系统 。

在机械旋转模块的带动下,LS01C 的高频核心测距模块将进行顺时钟旋转,从而实现对周围环境进行360°扫描测距。LS01C通过uart 串口信号与外部系统通讯,默认每秒采样3600点、扫描频率10hz,最大扫描距离6m,角度分辨率为1度。

将LS01C的ROS驱动文件(官网上没有下载连接,直接打电话给客服要的)解压重命名为talker后复制到catkin_ws/src下面,然后使用catkin_make进行编译

cf9b2260-b604-11ec-aa7f-dac502259ad0.png

插入USB后在终端中输入以下命令查看USB转串口设备:

cfb1dd84-b604-11ec-aa7f-dac502259ad0.png

在发现ttyUSB0后在终端中输入下面命令给USB 转串口设置权限:

sudo chmod 666 /dev/ttyUSB0

修改launch文件中的串口名,改为我们插入的ttyUSB0

  "talker" pkg="talker" type="talker">    
"scan_topic" value="scan"/>          "laser_link" value="laser_link"/>       
"serial_port" value="/dev/ttyUSB0"/>   

然后执行launch文件

roslaunch talker talker.launch

在终端中可以看到talker节点已经开启:

cfcb636c-b604-11ec-aa7f-dac502259ad0.png

打开rviz,添加LaserScan并设置topic和参考坐标系,可以动态的显示激光扫描点:

cfdc7062-b604-11ec-aa7f-dac502259ad0.gif

还可以通过 rostopic hz命令查看激光数据发布频率,可以看出其频率为10Hz

cff04056-b604-11ec-aa7f-dac502259ad0.png  

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 激光扫描
    +关注

    关注

    0

    文章

    103

    浏览量

    11357
  • 激光雷达
    +关注

    关注

    958

    文章

    3628

    浏览量

    186515

原文标题:ROS中发布激光扫描消息

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    压电偏转镜在激光快速扫描系统控制中的应用

    激光快速扫描系统在半导体技术、航空航天、生物医学、纳米科学研究等领域得到了越来越多的应用,同时对其性能要求也越来越高,受其体积,扫描频率,扫描精度、
    的头像 发表于 03-14 10:19 220次阅读
    压电偏转镜在<b class='flag-5'>激光</b>快速<b class='flag-5'>扫描</b>系统控制中的应用

    系统镜像Ubuntu_ROS2中ROS2是什么意思,带有ROS2开发环境吗?

    请问一下,百度文库资料里面,下图所示的系统镜像Ubuntu_ROS2中ROS2是什么意思,带有ROS2开发环境吗?与前面4GB版本的镜像有什么区别?
    发表于 03-01 23:06

    蓝光三维扫描仪和激光扫描仪问题解答

    关于蓝光三维扫描仪和激光扫描仪问题解答,扫描仪厂家三本精密仪器讲解如下:问题1:蓝光和激光扫描
    的头像 发表于 12-14 15:08 329次阅读
    蓝光三维<b class='flag-5'>扫描</b>仪和<b class='flag-5'>激光</b><b class='flag-5'>扫描</b>仪问题解答

    【昉·星光 2 高性能RISC-V单板计算机体验】基于星光 2 ROS 激光雷达红外测温智能车

    基于星光 2 ROS 激光雷达红外测温智能车系统主要由3个部分组成:①环境感知。涉及多种传感器,包括烟雾、火焰、测距和温度检测传感器等。实现对烟雾和温度的实时监测。②执行机构。为了方便后期
    发表于 12-02 15:52

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布

    。 基于Python语言的通信演示案例功能:基于Python语言,启动ROS节点发布与订阅消息,实现订阅消息节点与发布消息节点之间的实时通信。请将评估板上电启动,执行如下命令,配置评估板测试环境
    发表于 11-30 16:01

    ros1和ros2的通信模型

    ros1: talker 注册 listener 注册 ROS Master 进行信息匹配 listener 发送链接请求 talker 确认请求 建立连接 talker 给 listener
    的头像 发表于 11-27 11:26 316次阅读
    <b class='flag-5'>ros</b>1和<b class='flag-5'>ros</b>2的通信模型

    ros的基本概念是什么

    基本概念: ROS是一个用于在不同进程间匿名的发布、订阅、传递信息的中间件。 ROS2系统的核心部分是ROS网络(ROS Graph)。
    的头像 发表于 11-27 11:21 912次阅读

    Unity与ROS链接介绍

    对于ROS而言,其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯,下面我们来详细介绍一下Unity
    的头像 发表于 11-17 17:22 445次阅读
    Unity与<b class='flag-5'>ROS</b>链接介绍

    如何初始化ROS并创立链接

    Simulink对机器人操作系统(ROS)的支持使我们能够创建与ROS网络一起工作的Simulink模型。ROS是一个通信层,允许机器人系统的不同组件以消息的形式交换信息。 组件通过将消息发布
    的头像 发表于 11-15 17:26 246次阅读
    如何初始化<b class='flag-5'>ROS</b>并创立链接

    为什么激光扫描能还原物体的外形?

    为什么激光扫描能还原物体的外形
    发表于 10-30 07:06

    激光三维扫描仪KSCAN-Magic全新升级!

    2023年10月24日,思看科技官宣全新升级款KSCAN-Magic系列3D扫描仪,这是同时集成了红外+蓝色激光技术的计量级复合式三维扫描仪,标配五种工作模式:红外平行激光大面幅
    的头像 发表于 10-25 17:13 392次阅读
    <b class='flag-5'>激光</b>三维<b class='flag-5'>扫描</b>仪KSCAN-Magic全新升级!

    3D三维激光扫描机的原理和特点

    随着科技的不断进步,3D三维激光扫描技术已经成为获取物体表面空间信息的重要手段。3D三维激光扫描机作为该技术的核心设备,具有精度高、效率高、分辨率高等优点,被广泛应用于各个领域。本文三
    的头像 发表于 08-29 11:30 1259次阅读
    3D三维<b class='flag-5'>激光</b><b class='flag-5'>扫描</b>机的原理和特点

    激光雷达的扫描方式主要有哪些?

    激光雷达的扫描方式主要有哪些? 激光雷达是一种利用激光束进行反射和时间测量得出目标距离和位置信息的设备,在无人驾驶、自动驾驶和地图绘制等领域有着广泛的应用。
    的头像 发表于 08-23 16:14 3105次阅读

    一文浅谈三维激光扫描

    三维激光扫描技术是利用激光测距仪的原理,通过记录被测物表面大量密集的点坐标、反射率、纹理和全景图等信息,通过计算机辅助计算,形成的三维空间点云模型。三维数字化是运用三维工具来实现模型的虚拟创建,修改
    的头像 发表于 06-12 16:42 2509次阅读
    一文浅谈三维<b class='flag-5'>激光</b><b class='flag-5'>扫描</b>仪

    激光扫描振镜的原理图

    激光扫描振镜的原理图,虽然不是3886的但原理一样,万变不离其宗
    发表于 04-24 17:07 24次下载