参考链接
实现
第一版
读了一下驱动程序说明书
创建了ros环境,创建了demo功能包,创建了类,订阅话题
"/livox/lidar"
激光雷达数据,不处理直接发布,发布话题
"/full"
在rviz中查看。
说明书
首先,览沃 ROS 驱动程序可以看到广播码说明,luanch配置文件,我需要的是livox_lidar_rviz.launch
连接览沃雷达设备,
向外发布 pointcloud2 格式的点云数据,自动加载rviz
览沃 ROS 驱动程序中的所有内部参数都位于 launch 文件中,常用的三个参数
参数名 | 详细说明 | 默认值 |
---|---|---|
publish_freq | 设置点云发布频率 浮点数据类型,推荐值 5.0,10.0,20.0,50.0 等。 | 10.0 |
multi_topic | LiDAR 设备是否拥有独立的 topic 发布点云数据 0 -- 所有 LiDAR 设备共同使用同一个 topic 发送点云数据 1 -- 每个 LiDAR 设备各自拥有独立的 topic 发布点云数据 | 0 |
xfer_format | 设置点云格式 0 -- 览沃 pointcloud2(PointXYZRTL) 点云格式 1 -- 览沃自定义点云数据格式 2 -- PCL库中标准 pointcloud2(pcl::PointXYZI) 点云格式 | 0 |
览沃 pointcloud2(PointXYZRTL) 点云格式,详细说明如下:
float32 x # X axis, unit:m
float32 y # Y axis, unit:m
float32 z # Z axis, unit:m
float32 intensity # the value is reflectivity, 0.0~255.0
uint8 tag # livox tag
uint8 line # laser number in lidar
直接连接 LiDAR 时,使用 livox_lidar_config.json
来配置 LiDAR 参数,可以把broadcast_code
改为自己的设备
livox.launch中可以看到,
<node pkg="loam_livox" type="livox_scanRegistration" name="livox_scanRegistration">
<remap from="/laser_points_0" to="/livox/lidar" />
</node>
仅仅查看订阅到的数据
#include "extract_feature.hpp"
void laserCloudHandler(const sensor_msgs::PointCloud2ConstPtr &laserCloudMsg) {
ROS_INFO("牛");
}
int main(int argc, char** argv) {
ros::init(argc, argv, "extract_feature");
ros::NodeHandle nh;
setlocale(LC_ALL, "");
// Laser_feature laser_feature;
ros::Subscriber sub = nh.subscribe("/livox/lidar", 1000, laserCloudHandler);
/*应该先订阅,回调函数处理,再发布呀构造函数中有三个话题*/
ros::spin();
return 0;
}
launch
文件一句话,原神,启动!!!!
<node pkg="demo" type="extract_feature" name="extract_feature" output="screen" />
订阅后直接发布
创建一个类Laser_feature
,在其中进行相关操作。主函数变为
#include "extract_feature.hpp"
int main(int argc, char** argv) {
ros::init(argc, argv, "extract_feature");
Laser_feature laser_feature;
ros::spin();
return 0;
}
就是整了个构造函数初始化,发布者和订阅者拿成员变量接收。直接将原始点云接收后发出。
int init_ros_env(){
ros::NodeHandle nh;
m_sub_point_cloud = nh.subscribe<sensor_msgs::PointCloud2>("/livox/lidar", 10000, boost::bind(&Laser_feature::laserCloudHandler, this, _1));
m_pub_livox_full = nh.advertise<sensor_msgs::PointCloud2>("/full", 10000);
return 0;
}
void laserCloudHandler(const sensor_msgs::PointCloud2ConstPtr &laserCloudMsg){
m_pub_livox_full.publish(*laserCloudMsg);
}
此时打开rviz
查看,可以将rviz
的配置文件保存下来,保存到当前功能包的config
文件夹下,然后在launch
文件中增加
<arg name="rviz" default="true" />
<group if="$(arg rviz)">
<node launch-prefix="nice" pkg="rviz" type="rviz" name="rviz" args="-d $(find demo)/config/default.rviz" />
</group>
那么好,现在下面要做的就是在回调函数中处理数据,编写laserCloudHandler
函数