一、获取激光雷达数据
在做激光slam的时候,我们首先要获取雷达的基础信息。再使用hector
_mapping或gmapping等算法建图。
二、了解激光雷达消息包格式
首先登录 index.ros.org 网站搜索一下sensor_msgs消息包。您也可以直接搜这个网址sensor_msgs - ROS Wiki ,在里面您可以看到各种类型,我们选择LaserScan。
这里的数据在下面我们会使用
rostopic echo /scan --noarr来查看非数组信息。
三、创建功能包编译执行代码
1、创建功能包
cd ~/catkin_ws/src
catkin_creat_pkg learning_laser roscpp rospy sensor_msgs
这里您也可以看到为什么依赖要带sensor_msgs了。
2、编写激光雷达代码
cd ~/catkin_ws/src/learning_laser/src
touch laser_scan.cpp
编写代码:
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sensor_msgs/LaserScan.h>
void LidarCallback(const sensor_msgs::LaserScan msg)
{
int nNum = msg.ranges.size();
int nMid = nNum/2;
float fMidDist = msg.ranges[nMid];
ROS_INFO("Forward ranges[%d] = %f M", nMid, fMidDist);
}
int main(int argc, char** argv)
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"demo_lidar_data");
ros::NodeHandle n;
ros::Subscriber lidar_sub = n.subscribe("/scan", 10, &LidarCallback);
ros::spin();
}
值得一提的是激光雷达的起始点和终止点实际上都是在激光雷达的正后方,也就是-y轴的方向,所以可以看到回调函数里面,先取了数组总长,再/2就是正前方y轴方向。
3、修改CMakeList.txt编译规则
add_executable(laser_scan src/laser_scan.cpp)
target_link_libraries(laser_scan ${catkin_LIBRARIES})
4、编译代码并运行代码
cd ~/catkin_ws
catkin_make
source devel/setup.bash 值得一提的是,这一步如果您按照了之前的文章来做,可以省略。(《Ubuntu20.04环境下的ROS学习笔记4》-CSDN博客)到这里编译结束。
这里获取激光雷达的数据,我们先要打开仿真环境gazebo。
roslaunch wpr_simulation wpb_simple.launch
ctrl + shift + O 可以水平分屏如果您是超级终端Terminator的话(《Ubuntu20.04环境下的ROS进阶学习1》-CSDN博客)
rostopic echo /scan --noarr
这里您可以去掉--noarr来查看数组内容。
rosrun learning_laser laser_scan
这里您也可以移动书柜来看看距离是否改变。
四、参考
23. ROS系统中的激光雷达消息包格式_哔哩哔哩_bilibili
24.在ROS中,用C++实现获取激光雷达数据_哔哩哔哩_bilibili