【从kitti开始自动驾驶】--2.2.python代码结构层次的优化

“心向骄阳万丈光”

  • 1. 文件结构改变
  • 2. 改进后源码
    • data_utils.py源码
    • publish_utils.py源码
    • kitti_all.py源码
  • 3. 运行和效果

本节将在上一节的基础上,先优化文件结构,然后再是功能的添加, 参考.

  • 工作空间是test3_autodrive_ws
  • python代码存在test3_autodrive_ws/src/demo1_kitti_pub_photo/scripts/ kitti_all.py(总的文件)data_utils(读取图片等数据), publish_utils(发布和制作消息等数据) 三个文件

1. 文件结构改变

  1. 抛弃原来杂糅的kitti文件,分层编写三个文件,将读取本地数据,发布数据和主功能分开编写.
  2. 步骤是在同kitti级别下,写三个新的python文件,两个头(moudle)文件和一个main函数

2. 改进后源码

data_utils.py源码

#!/usr/bin/env python3
#coding:utf-8
import os
import cv2
import numpy as np

def read_camera(path):
    return cv2.imread(path)

def read_point_cloud(path):
    return np.fromfile(path, dtype=np.float32).reshape(-1, 4)

publish_utils.py源码

#!/usr/bin/env python3
#coding:utf-8

import rospy
from std_msgs.msg import Header
from sensor_msgs.msg import Image, PointCloud2
import sensor_msgs.point_cloud2 as pcl2
from cv_bridge import CvBridge
import numpy as np

FRAME_ID = 'map'

def publish_camera(cam_pub, bridge, image):
    cam_pub.publish(bridge.cv2_to_imgmsg(image, 'bgr8'))

def publish_point_cloud(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]))

kitti_all.py源码

#!/usr/bin/env python3
#coding:utf-8
from data_utils import *
from publish_utils import *


DATA_PATH = '/home/qinsir/kitti_folder/2011_09_26/2011_09_26_drive_0005_sync/'

if __name__ == '__main__':
    frame = 0
    rospy.init_node('kitti_node', anonymous=True)   #默认节点可以重名
    cam_pub = rospy.Publisher('kitti_cam', Image, queue_size=10)
    pcl_pub = rospy.Publisher("kitti_point_cloud", PointCloud2, queue_size=10)

    bridge = CvBridge()      #opencv支持的图片和ROS可以读取的图片之间转换的桥梁

    rate = rospy.Rate(10)

    while not rospy.is_shutdown():
        #使用OS,路径串接,%010d,这个字串有10个数字(比如0000000001).png
        img = read_camera(os.path.join(DATA_PATH, 'image_02/data/%010d.png'%frame))
        point_cloud = read_point_cloud(os.path.join(DATA_PATH, "velodyne_points/data/%010d.bin"%frame))
        
        publish_camera(cam_pub, bridge, img)
        publish_point_cloud(pcl_pub, point_cloud)

        rospy.loginfo('new file publish')
        rate.sleep()
        frame += 1
        frame %= 154
        
  1. 这里有一个问题:导入自定义.py文件的python文件编写和路径都没问题,但是执行会报错,显示no …之类的,但是单独执行python文件是没有问题的,解决方法方法详见本博客链接
  2. 一定要注意,所有文件都要给予可执行权限,跳转到scrpts目录下,执行如下语句:
sudo chmod +x *.py

3. 运行和效果

优化完成!
运行和效果与上一篇博客2.1无异

你可能感兴趣的:(自动驾驶小白白,ubuntu,自动驾驶,ROS,linux)