睿抗-ROS 仿真赛实验一接受雷达消息得到最近和最远障碍物距离


记录菜鸟学习ROS过程:第2次博客
本次博客是观看bilibili机器人工匠阿杰进行的归纳应用。

一、激光雷达工作原理

激光雷达(LIDAR,Light Detection and Ranging)是一种利用红外光束进行发射、反射和接收来探测物体的技术。其工作原理主要基于以下步骤:
1.发射激光
2.接受回波
3.计算距离
我们选取原理最为直观的TOF激光雷达为例子

在这里插入图片描述
在雷达的头部设置了一个红外激光发射器和红外激光接收器。当雷达工作的时候会在雷达发射器发出激光,遇到障碍物后反射回接收器。通过计时测量激光发射和接收的间隔时长乘以光速得出飞行长度,飞行长度除以2,得出障碍物距离。
在这里插入图片描述

激光雷达测完一个方向的障碍物距离后,会旋转一个角度距离测量,直至探测头旋转360度

在这里插入图片描述

这个探测任务会周而复始的进行,只要激光探测的频率足够高,就是实时更新对周围事物的探测,所有在ROS的RViz中就能看到障碍物的轮廓点阵分布图:
在这里插入图片描述

在这里插入图片描述

二、激光雷达消息包格式

激光雷达数据类型:
在这里插入图片描述
我们结合ROS仿真来分析
在终端中输入:

rostopic echo /scan --noarr

显示scan话题中的消息,加入参数noarr把数组折叠起来以免被刷屏。
**

Header

**
在这里插入图片描述
Header是LaserScan消息中的一个结构体,它包含seq,stamp,frame_id。

  • seq:一个序列号,通常用于标识消息的唯一性,每次扫描时递增。
  • stamp:时间戳,记录了扫描开始的时间点。
  • frame_id:参考坐标系的ID,指明了数据属于哪个坐标系。

**

angle_min 、angle_max

**
在这里插入图片描述
扫描的起始角度(angle_min)、结束角度(angle_max),单位弧度制。
这里ROS中:起始角度(angle_min)= -90°,结束角度(angle_max)=90°。
按照此仿真环境中,激光雷达扫描应为这样:
在这里插入图片描述
此时并没有实现360°扫描。
在这里插入图片描述
不过在现实中的激光雷达实现的都是360°全扫描,应为:
在这里插入图片描述

angle_increment、time_increment

每次扫描增加的角度(angle_increment)、测量的时间间隔(time_increment)。
激光射出去再回来这就完成了一次测距行为,然后雷达旋转一个角度后再射出激光再回来,这两次测距行为的角度称为:angle_incremen。time_increment为两次测距的时间差。
在这里插入图片描述

**

scan_time

**
scan_time:一次完整扫描所需的时间。主要用来计算雷达的扫描频率,一秒钟除以scan_time就可以计算出雷达一秒钟转了几圈,即扫描的频率。

**

range_min 、range_max

**
在这里插入图片描述

range_min:有效测距的最小距离, range_max有效测距的最大距离。只有在这两个数值间的距离是有效的。
在这里插入图片描述
**

ranges

**
在这里插入图片描述

ranges:本次扫描的所有测距值。数组成员类型是32位浮点数,数组长度为720,720表明在一次完整扫描过程中测量的距离个数,本次仿真环境测量范围为180度,所以每次旋转0.25度进行1次测距行为。720对应为每0.25度方向的障碍物距离,数组的数值是按照扫描从起始角度到终止角度排列的。

intensities

intensities:测距返回信号强度。数值越大表示这次测距的信号强度越强,得到的测距数值越可靠。

三、获取激光雷达最近和最远障碍物节点

在ROS系统中,激光雷达通常会有一个对应的节点。这个节点负责从雷达获取测距数据,然后将这些数据封装成消息包(sensor_msgs::LaserScan)发布到一个特定的topic(话题名为scan)中。用户只需要通过订阅/scan话题就可获取并处理激光雷达的数据。
在这里插入图片描述
1.构建软件包,包名叫做lidar_pkg
2.在软件包中新建一个节点,节点名叫做lidar_node
3.在节点中,向ROS大管家NodeHandle申请订阅话题/scan,并设置回调函数为LidarCallback()
4.构建回调函数LidarCallback(),用来获取雷达消息中,最近和最远障碍物距离
5.调用ROS_INFO显示雷达距离

1.构建软件包,包名叫做lidar_pkg

进入工作空间src目录

cd ros_workspace/src

2.在软件包中新建一个节点,节点名叫做lidar_node

创建功能包

catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs

3编写node节点

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>

void LidarCallback(const sensor_msgs::LaserScan msg)
{
  float closest = msg.range_min;
  float further = msg.range_max;
  ROS_INFO("closest = %f meter and further = %f meter ",closest,further);

}


int main(int argc,char *argv[])
{
  ros::init(argc,argv,"lidar_node");

  ros::NodeHandle n;
  ros::Subscriber lidar_sub = n.subscribe("/scan",10,&LidarCallback);

  ros::spin();

  return 0;



}

修改编译规则

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

回到工作空间编译

cd ros_workspace/src
catkin_make

首先启动仿真环境(可以自己在网上寻找开源的仿真环境)

roslaunch bobac2_description gazebo.launch

启动节点

rosrun lidar_pkg lidar_node

在这里插入图片描述

参考:bilibili机器人工匠阿杰
bilibili机器人工匠阿杰
激光雷达(图片):思岚TOF激光雷达RPLIDAR-S1
激光雷达照片出处

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个非常有趣的问题!首先,让我们来了解一下ROS和Gazebo。 ROS机器人操作系统)是一个用于机器人开发的开源框架,它提供了一系列工具和库,使得机器人软件开发更加简单和高效。 Gazebo是一个基于物理的仿真平台,可以用于仿真机器人、车辆、飞行器等。它提供了高度可配置的物理引擎、传感器模型和环境模型,使得用户可以快速构建各种仿真场景。 现在,我们可以开始回答你的问题了。对于移动机器人的导航和避障仿真,通常需要以下步骤: 1. 构建机器人模型 在Gazebo中,我们可以使用URDF(通用机器人描述格式)来定义机器人模型。可以使用各种工具如SolidWorks、Blender等来创建URDF文件,也可以使用ROS提供的工具如URDF编辑器等。 2. 添加传感器 为了使机器人能够感知环境,我们需要添加各种传感器,如激光雷达、摄像头等。在Gazebo中,可以使用ROS提供的各种传感器模型,或者自己编写传感器模型。 3. 编写控制程序 在ROS中,可以使用ROS Navigation Stack来实现机器人的导航和避障功能。该软件包提供了各种算法和工具,如SLAM(同时定位和地图构建)、路径规划、障碍物检测等。 4. 运行仿真 一旦完成了机器人模型、传感器和控制程序的编写,我们可以在Gazebo中运行仿真。可以使用ROS提供的launch文件来启动仿真,并且可以通过ROS的可视化工具RViz来监视机器人的状态和环境。 通过这些步骤,我们可以在不同场景下对移动机器人进行导航和避障仿真。同时,我们可以根据需要调整机器人模型、传感器和控制程序,以便更好地适应不同的应用场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值