1. 激光雷达
- 作用:探测周围障碍物的分布状况
- 分类:
- 虽然激光雷达的种类繁多,但在ROS中呈现的数据格式是一样的。
- 激光雷达的机械结构:
- ROS中激光雷达的数据格式,实质上是对一个障碍物轮廓点阵的具体描述。
================================================================================================
2. 使用RVIz观测传感器数据
3. 激光雷达消息包格式
================================================================================================
4. 激光雷达数据获取(订阅者节点应用)
- 在工作空间的子目录src下创建包lidar_pkg。
- 在包lidar_pkg中的src子目录下创建节点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;
}
====================================================================================================================================
5. 激光雷达避障(既是发布者节点,有时订阅者节点)
根据激光雷达的测距数值,实时调整机器人的运动速度,避开障碍物
#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;
}
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); // 订阅话题名称
vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10); // 发布话题名称
ros::spin();
return 0;
}