网站备案接入商,网站内链怎么删除,网站tdk设置界面,采集电影做的网站文章目录 激光雷达原理 消息包格式获取激光雷达数据激光雷达避障 激光雷达
原理
激光雷达#xff08;LiDAR#xff09; 是一种利用激光进行距离测量和环境感知的传感器。它通过发射激光束并接收反射光来测量物体的距离#xff0c;生成点云数据#xff0c;用于构建环境的三… 文章目录 激光雷达原理 消息包格式获取激光雷达数据激光雷达避障 激光雷达
原理
激光雷达LiDAR 是一种利用激光进行距离测量和环境感知的传感器。它通过发射激光束并接收反射光来测量物体的距离生成点云数据用于构建环境的三维模型。激光雷达在机器人、自动驾驶、无人机等领域有广泛应用。
RViz 是 ROSRobot 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 是一个 ROSRobot Operating System命令用于订阅并显示 /scan 话题上的消息内容。–noarr 参数用于简化输出不显示数组的完整内容而是显示数组的类型和长度。
llkLLK:~$ 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
---header seq: 消息的序列号用于标识消息的顺序。在这个例子中seq: 14445 表示这是第 14445 条消息。 stamp: 消息的时间戳表示消息的生成时间。 secs: 时间戳的秒部分secs: 1533 表示消息生成于 1533 秒。 nsecs: 时间戳的纳秒部分nsecs: 920000000 表示消息生成于 920,000,000 纳秒。 frame_id: 消息的参考坐标系frame_id: “laser” 表示消息的参考坐标系是 laser。angle_min 和 angle_max angle_min: 扫描的起始角度单位为弧度。angle_min: -3.141590118408203 表示扫描从 -π 弧度即 -180 度开始。 angle_max: 扫描的结束角度单位为弧度。angle_max: 3.141590118408203 表示扫描到 π 弧度即 180 度结束。angle_increment angle_increment: 扫描的角度增量单位为弧度。angle_increment: 0.017501894384622574 表示每个扫描点之间的角度增量约为 1 度0.0175 弧度。time_increment 和 scan_time time_increment: 扫描中相邻两个测量之间的时间增量单位为秒。time_increment: 0.0 表示相邻两个测量之间的时间增量为 0 秒通常用于静态扫描。 scan_time: 完成一次完整扫描所需的时间单位为秒。scan_time: 0.0 表示扫描时间为 0 秒通常用于静态扫描。range_min 和 range_max range_min: 激光雷达可以可靠测量的最小距离单位为米。range_min: 0.23999999463558197 表示最小测量距离为 0.24 米。 range_max: 激光雷达可以可靠测量的最大距离单位为米。range_max: 6.0 表示最大测量距离为 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_datacatkin_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 nCount0;
void LidarCallback(const sensor_msgs::LaserScan msg)
{ //fmiddist 通常是指 前方中间距离Front Middle Distance的缩写。它表示激光雷达在正前方方向通常是 180 度测得的距离值float FMidDistmsg.ranges[180];ROS_INFO(前方测距 ranges[180] %f 米, FMidDist);//避障部分if(nCount0){nCount--;return; //继续保持之前的运动}geometry_msgs::Twist twist;if(FMidDist1.5) //1.5米 一个grid是1米{twist.angular.z 0.5;nCount30;}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.advertisegeometry_msgs::Twist(/cmd_vel,10);//得到scan话题里的雷达数据后选择行为ros::spin();return 0;
}#! /usr/bin/env python3
#codingutf-8import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
count0
def LidarCallback(msg):global vel_pubglobal countFMidDistmsg.ranges[180]rospy.loginfo(前方测距 ranges[180] %.2f 米,FMidDist)if count0:countcount-1returnvel_cmdTwist()if FMidDist1.5:vel_cmd.angular.z0.5count30else:vel_cmd.linear.x0.5vel_pub.publish(vel_cmd)if __name____main__:rospy.init_node(lidar_node)lidar_subrospy.Subscriber(/scan,LaserScan,LidarCallback,queue_size10)vel_pubrospy.Publisher(/cmd_vel,Twist,queue_size10)rospy.spin()