跳转到内容

雷达数据通信示例

找一个地方放工作空间(以主目录为例),在主目录下打开终端,输入:

Terminal window
git clone https://github.com/Livox-SDK/livox_ros_driver2.git ws_livox/src/livox_ros_driver2

克隆livox_ros_driver2

解释: 在打开终端位置克隆 livox_ros_driver2 包,并新建工作空间 ws_livox,在工作空间 ws_livox 的 src 目录下安装。

目录结构

安装 cmake(如果已安装可跳过)

Section titled “安装 cmake(如果已安装可跳过)”
Terminal window
sudo apt install cmake

在 ws_livox 的 src 目录下打开终端,执行:

Terminal window
git clone https://github.com/Livox-SDK/Livox-SDK2.git

现在 livox_ros_driver2 包和 Livox-SDK2 包在同一目录下的。

Terminal window
cd ./Livox-SDK2/
mkdir build
cd build
cmake .. && make -j
Terminal window
sudo make install

至此,Livox-SDK2 安装完毕。

以ROS1(melodic)为例:

Terminal window
source /opt/ros/melodic/setup.sh
./build.sh ROS1
Terminal window
source ~/ws_livox/devel/setup.bash

永久配置 Livox 工作空间环境变量(可选)

Section titled “永久配置 Livox 工作空间环境变量(可选)”
Terminal window
echo "source ~/ws_livox/devel/setup.bash" >> ~/.bashrc
Terminal window
source ~/.bashrc
Terminal window
rospack find livox_ros_driver2

若能输出包的路径,则说明 ROS 已识别 Livox-ros-driver2 驱动包。

参考地址:GitHub - Livox-SDK/livox_ros_driver2

X30 的激光雷达话题如下:

话题名描述消息类型频率
/livox/lidar览沃激光雷达自定义格式点云数据livox_ros_driver2/CustomMsg10Hz
/lidar_points通用格式点云数据sensor_msgs/PointCloud210Hz

其中话题 /livox/lidar 的消息类型 livox_ros_driver2/CustomMsg 是自定义消息类型:

std_msgs/Header header
uint32 seq
time stamp
string frame_id
uint64 timebase
uint32 point_num
uint8 lidar_id
uint8[3] rsvd
livox_ros_driver2/CustomPoint[] points
uint32 offset_time
float32 x
float32 y
float32 z
uint8 reflectivity
uint8 tag
uint8 line

若要在机器狗终端使用 rostopic echo 命令查看该话题消息,需要执行:

Terminal window
source ~/jy_cog/drivers/setup.bash

若要在本地终端使用 rostopic echo 命令查看该话题消息,需要先完成 Livox-ros-driver2 驱动包的安装。

开发者如需在自己的程序中订阅该话题,需要在程序中定义该自定义消息的结构。

以下示例演示如何订阅 /livox/lidar 话题并解析点云数据:

#include "ros/ros.h"
#include "livox_ros_driver2/CustomMsg.h"
int g_count = 0;
void lidarCallback(const livox_ros_driver2::CustomMsg::ConstPtr& msg)
{
g_count++;
ROS_WARN("\n===== cycle:%d =====", g_count);
ROS_WARN("header: ");
ROS_WARN(" seq: %u", msg->header.seq);
ROS_WARN(" stamp: ");
ROS_WARN(" secs: %u", msg->header.stamp.sec);
ROS_WARN(" nsecs: %u", msg->header.stamp.nsec);
ROS_WARN(" frame_id: \"%s\"", msg->header.frame_id.c_str());
ROS_WARN("timebase: %lu", msg->timebase);
ROS_WARN("point_num: %u", msg->point_num);
ROS_WARN("lidar_id: %hhu", msg->lidar_id);
ROS_WARN("rsvd: [%hhu, %hhu, %hhu]", msg->rsvd[0], msg->rsvd[1], msg->rsvd[2]);
ROS_INFO("points: ");
for (size_t i = 0; i < msg->points.size(); ++i) {
const auto& point = msg->points[i];
ROS_INFO(" - ");
ROS_INFO(" offset_time: %u", point.offset_time);
ROS_INFO(" x: %f, y: %f, z: %f", point.x, point.y, point.z);
ROS_INFO(" reflectivity: %hhu, tag: %hhu, line: %hhu",
point.reflectivity, point.tag, point.line);
}
ROS_WARN("---");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "lidar_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("/livox/lidar", 1000, lidarCallback);
ros::spin();
return 0;
}
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
message_generation
livox_ros_driver2
)
add_message_files(FILES CustomMsg.msg)
generate_messages(DEPENDENCIES std_msgs livox_ros_driver2)
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime livox_ros_driver2
)
add_executable(lidar_subscriber src/lidar_subscriber.cpp)
target_link_libraries(lidar_subscriber ${catkin_LIBRARIES})
add_dependencies(lidar_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<build_depend>livox_ros_driver2</build_depend>
<exec_depend>livox_ros_driver2</exec_depend>
Terminal window
source devel/setup.bash
rosrun livox_custom lidar_subscriber