最近想要实现点云可视化的目标检测,故开始考虑使用点云在ros的rviz中进行实验。
参考文章:
ROS1结合自动驾驶数据集Kitti开发教程(一)Kitti资料介绍和可视化 - 古月居
最后实验效果(本文实现点云,图像发布,后续笔记更新边界框等信息发布):
该文首先记录 在rviz中实现视屏以及点云的话题发布,后需笔记在更新边界框、小车模型的加载
本机相关环境:ubutnu20.04 ros_neotic
pytorch(后续进行点云实时检测会用到,这里不会使用)环境:
具体操作:
准备数据:本文用到的数据是:kitti官网中raw data下的2011 数据集0005(需要登陆才能看到第二张图的数据集),下载[synced+rectified data] [calibration]两个文件夹(嫌麻烦留邮箱,我直接发也可以)
下载后我的解压路径如下:
代码准备: 准备两个python文件(1个用于程序入口,一个具体实现)
input_ros_kitti.py中代码:
import rospy
from sensor_msgs.msg import Image,PointCloud2
from cv_bridge import CvBridge
import numpy as np
import os
import cv2
from pub_publish import *
# 保存解压后数据的地方
DATA_PATH='/home/t/t/Row_Data/2011_09_26/2011_09_26_drive_0005_sync/'
if __name__=='__main__':
rospy.init_node('kitti_node',anonymous=True)
cam_pub=rospy.Publisher('kitti_cam',Image,queue_size=10)
pcl_pub=rospy.Publisher('kitti_pcl',PointCloud2,queue_size=10)
bridge=CvBridge()
rate=rospy.Rate(10)
frame=0
# 循环播放,通过frame控制帧数
while not rospy.is_shutdown():
img=cv2.imread(os.path.join(DATA_PATH,'image_02/data/%010d.png'%frame))
pcl=np.fromfile(os.path.join(DATA_PATH,'velodyne_points/data/%010d.bin'%frame),dtype=np.float32).reshape(-1,4)
publish_camera(cam_pub,bridge,img)
publish_pcl(pcl_pub,pcl)
rospy.loginfo('published')
rate.sleep()
frame+=1
frame%=154
pub_publish.py中代码:
from std_msgs.msg import Header
import rospy
import sensor_msgs.point_cloud2 as pcl2
FRAME_ID='map'
def publish_camera(cam_pub,bridge,image):
cam_pub.publish(bridge.cv2_to_imgmsg(image,'bgr8'))
def publish_pcl(pcl_pub,point_cloud):
header=Header()
header.stamp=rospy.Time.now()
header.frame_id=FRAME_ID
pcl_pub.publish(pcl2.create_cloud_xyz32(header,point_cloud[:,:3]))
运行时先运行roscore,再在vscode中直接运行input_ros_kitti.py即可(注意安装代码中的包,可以在anaconda虚拟环境下运行)
右下角是我的python环境
结果显示: