一、打开一个终端,输入cd ~/catkin_ws1,进入工作空间

二、输入source ./devel/setup.bash,将ROS工作空间的环境设置(setup)添加到当前终端会话中

三、输入roslaunch wpr_simulation wpb_simple.launch打开机器人仿真环境

四、仿真环境打开成功

五、再打开另一个终端,输入source ./devel/setup.bash

六、激光雷达的数据获取,在wpr_simulation中有一个示例程序,在终端中输入(这里我清屏了一下所以前面source看不到了)rosrun wpr_simulation demo_lidar_data

七、可以看到,激光雷达检测到机器人前方的障碍物为2.6米左右,ok,本文目的就是通过自己实现达到跟这个例子程序一样的效果

八、在机器人的ROS系统中,激光雷达通常会有一个对应的节点,这个节点通常由雷达的厂商提供

九、我们只需要简单的配置一下端口参数,就能和激光雷达的电路系统建立连接,雷达的测距数值,就从电路系统传递到雷达节点

十、雷达节点会把测距数值封装成一个消息包,发布在一个Topic话题中

十一、我们只需订阅这个话题,就能获取激光雷达的数据了


十三、发布消息包的话题名称是约定俗成的叫/scan

十四、获取激光雷达数据的实现思路

十五、输入cd ~/catkin_ws1/src进入工作空间下的src目录

十六、输入catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs创建一个软件包,包名叫做lidar_pkg,依赖项中的sensor_msgs是包含了雷达消息格式的的软件包

十七、输入code .打开VScode

十八、VScode打开成功

十九、在lidar_pkg的src文件夹下新建文件

二十、名字叫做lidar_node.cpp

二十一、在lidar_node.cpp文件总写入如下代码
#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;
}
二十二、打开CMakeLists.txt设置编译规则

二十三、在CMakeLists.txt文件末尾加入如下代码

add_executable(lidar_node src/lidar_node.cpp)
target_link_libraries(lidar_node
${catkin_LIBRARIES}
)
二十四、按Shift+Ctrl+B进行编译,选择catkin_make:build

二十五、编译成功

二十六、打开一个终端,输入cd ~/catkin_ws1进入工作空间

二十七、输入source ./devel/setup.bash

二十八、输入roslaunch wpr_simulation wpb_simple.launch,打开机器人仿真环境

二十九、机器人仿真环境打开成功

三十、再打开一个终端,输入source ./devel/setup.bash

三十一、输入rosrun lidar_pkg lidar_node启动刚才编写的lidar_node节点,可以看到机器人前方测距值为2.6米左右,

三十二、点击移动图标,再点击书柜,再点击红色坐标轴移动书柜

三十三、发现测距值发生了改变,可见这个测距值就是机器人正前方障碍物的距离
