一、打开一个终端,输入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米左右,
三十二、点击移动图标,再点击书柜,再点击红色坐标轴移动书柜
三十三、发现测距值发生了改变,可见这个测距值就是机器人正前方障碍物的距离