【ROS学习】使用C++获取激光雷达数据

本文介绍了如何在ROS(RobotOperatingSystem)环境中,通过C++编写一个简单的雷达测距节点,订阅/scan话题,处理LaserScan数据,并解决中文编码问题。最后,通过roslaunch启动仿真环境并验证测距功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行roslaunch

roslaunch wpr_simulation wpb_simple.launch

启动测距观测示例程序

rosrun wpr_simulation demo_lidar_data

手搓C++程序

步骤

1、构建一个新的软件包,包名叫做lidar_pkg
2、在软件包中新建一个节点,节点的名称叫做lidar_node
3、在ROS中NodeHandle申请订阅话题/scan,并设置回调函数为LidarCallback()
4、构建回调函数LidarCallback(),并用来接收和处理雷达数据
5、调用ROS_INFO()显示雷达检查道德前方障碍物距离.

构建一个新的软件包

catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs

在这里插入图片描述
在工作空间下新建c++文件
在这里插入图片描述
雷达扫描的起始角度和终止角度。

#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;                          //召唤大管家
    //LidarCallback 回调函数
    ros::Subscriber lidar_sub = n.subscribe("/scan",10,&LidarCallback);                            //订阅话题
    
    ros::spin();
    return 0;
}

C++节点需要编译才能运行,于是要设置编译规则

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
将这两句添加到文件末尾

add_executable(${PROJECT_NAME}_node src/lidar_pkg_node.cpp)
target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
 )

在这里插入图片描述
终端进行编译
发现有报错

 in expansion of macro ‘ROS_INFO’
    7 |     ROS_INFO("前方测距 ranges[180] = %f 米",fMidDist);

在这里插入图片描述

绕了一圈,结果发现是上面写ROS_INFO函数的时候,把,写出中文的了,服了。[已订正]

然后就要去看看效果
首先启动仿真环境

roslaunch wpr_simulation wpb_simple.launch

在这里插入图片描述
运行刚刚的节点

rosrun lidar_pkg lidar_node

在这里插入图片描述
移动物体可以观察到测距值在发生变化在这里插入图片描述
可以观察相距差不多5个栅格,差不多5m左右因此这个就是测距值。在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值