Apollo数据集转rosbag

本文主要介绍将Apollo开源的数据集,转化为ros可以订阅的rosbag。小白刚刚开始接触slam,没有在网上找到像转化Kitti数据集一样的工具,自己简单写了一下转化代码。

1.点云数据处理:主要是读出Apollo数据集中的PCD文件和时间戳(TXT)文件。

文件格式如下:

pcd文件:

 时间戳文件:

 

PCD文件读取代码如下(定义好PCL的输入输出头文件,以及点云格式头文件):

//PCD 数据转化为点云(PointXYZ)
 sensor_msgs::PointCloud2 read_filelists(string dir_path,int num)
{
    pcl::PointCloud<pcl::PointXYZI> cloud;
    sensor_msgs::PointCloud2 output;
    stringstream getFiles;
    getFiles<<dir_path<<num<<".pcd";
    string path_final=getFiles.str();
    pcl::io::loadPCDFile (path_final, cloud); //修改自己pcd文件所在路径
    //Convert the cloud to ROS message
        
        pcl::toROSMsg(cloud, output);//PCD TO cloudpoint
        return output;
 }

时间戳文件读取如下(定义好数据流读取的头文件);

while(getline(timeFile,syz))//获取每一行
        {

            stringstream ap;
            ap.clear();
            ap.str(syz);//时间戳赋值给数据流
            // while (!ap.eof())
            // {
                while (ap >> pcd_time)//读取时间戳的序号,与PCD文件序号对齐
                {
                if (num1==0)
                {
                int num2=atoi(pcd_time.c_str());//序号给numb vector
                numb.push_back(num2);
                num1++;
                continue;
                }
                if (num1==1)//时间戳信息
                {
                time=atof(pcd_time.c_str());//时间戳给 time_list vector
                times_lists.push_back(time); 
                num1=0;  /* code */
                continue;
                }
                }
        }

2.读取出imu文件:

imu数据也放在TXT文件中,格式如下,Apollo数据集的imu文件只有时间戳,加速度,角速度。

 

imu数据读取代码如下:

while (getline(fin, str))//得到每一行数据。放入定义格式的vector中
            {
            is.clear();
            is.str(str);
            while (is >> s){//这地方我的思路是循环读出每一个数据,然后每一个字符串转换成double类型的数据放入数组中,每一行结束时放入一个vec中。代码写的感觉很蠢,就只放最后一次。adad为vector(std::vector<Position> adad;)。
                if (i == 6)
                {
                   
                        double r = atof(s.c_str());    
                        temp_data[6]=r;
                        adad.push_back(Position(temp_data));
                        i=0;
                        continue;
                }

}

3.GPS数据

Apollo的GPS数据也放在TXT文件中,数据格式如下,时间戳,和车辆位姿。数据读取与IMU相同,只是多定义了一个变量。


                

4 rosbag文件读取:

首先打开

rosbag::Bag bag;
bag.open( "apollo.bag", rosbag::bagmode::Write); 

然后循环写入所需要的点云,imu,pcd数据。写入数据不区分先后,rosbag是按照时间戳发布信息。只要对应好消息的时间戳。rosbag就可以发布。

最后注意消息格式。以及对应好消息的头文件。

imu消息格式如下:

imu_data.header.stamp= ros::Time().fromSec(position[i].time);
            imu_data.header.frame_id = "imu_base_link";

            imu_data.angular_velocity.x = position[i].ax;
            imu_data.angular_velocity.y = position[i].ay;
            imu_data.angular_velocity.z = position[i].az;
    
            imu_data.linear_acceleration.x = position[i].gx;
            imu_data.linear_acceleration.y = position[i].gy;
            imu_data.linear_acceleration.z = position[i].gz;

            bag.write("imu_data", imu_data.header.stamp, imu_data);//写入rosbag

GPS消息格式如下:

            odom_data.header.stamp= ros::Time().fromSec(odomposition[i].time);
            odom_data.header.frame_id = "odom_link";

            odom_data.pose.pose.position.x = odomposition[i].x;
            odom_data.pose.pose.position.y = odomposition[i].y;
            odom_data.pose.pose.position.z = odomposition[i].z;
    
            odom_data.pose.pose.orientation.x = odomposition[i].qx;
            odom_data.pose.pose.orientation.y = odomposition[i].qy;
            odom_data.pose.pose.orientation.z = odomposition[i].qz;
            odom_data.pose.pose.orientation.w = odomposition[i].qw;

            bag.write("odom_data", odom_data.header.stamp, odom_data);//写入rosbag

点云数据只需对应好时间戳与PCD的序号之后将返回的output写入rosbag即可。

            bag.write("velodyne_points", output.header.stamp, output);//写入rosbag

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: rosbagROS(Robot Operating System)中用于记录和回放机器人数据的工具,而cyberbagApollo自动驾驶开发平台中的数据记录和回放工具。 要将rosbag换为cyberbag,需要执行以下步骤: 1. 安装Apollo软件,并将ROS数据包放置在Apollo工作区。 2. 打开终端,切换到Apollo工作区目录。 3. 运行以下命令将rosbag文件换为cyberbag文件: ``` cyber_recorder rosbag2cyber -i /path/to/rosbag/file -o /path/to/cyberbag/file ``` 其中,`/path/to/rosbag/file`是rosbag文件的路径,`/path/to/cyberbag/file`是cyberbag文件的路径。 4. 执行完命令后,cyberbag文件将被生成并保存到指定路径。 请注意,要将rosbag换为cyberbag,您需要在安装Apollo软件后才能执行上述步骤。 ### 回答2: rosbagROS(机器人操作系统)中的数据记录和回放工具,用于记录和回放ROS话题(topics)中的消息。而CyberRT是阿里巴巴开源的分布式计算框架,用于构建高性能实时系统。在ROS2中,引入了一种新的数据记录和回放格式,叫做cyberbag,以支持CyberRT框架。 将rosbag换为cyberbag可以通过以下步骤进行: 1. 从ROS中收集rosbag文件。可以使用以下命令记录ROS话题的消息: ``` $ ros2 bag record -o <output_file> <topic> ``` 2. 安装ROS2的cyberbag换工具包。可以使用以下命令进行安装: ``` $ sudo apt install ros-<distribution>-cyberdog_tools ``` 3. 使用cyberdog_tools中的rosbag2cyber命令将rosbag换为cyberbag。命令格式如下: ``` $ rosbag2cyber <rosbag_file> <cyberbag_output_file> ``` 4. 执行以上命令后,rosbag文件将被换为cyberbag文件。 换完成后,cyberbag文件可以在CyberRT框架中使用,以实现高性能实时系统的构建。CyberRT框架提供了一系列API和工具,用于处理这些cyberbag文件,并实现实时数据发布、订阅和处理等功能。 总之,将rosbag换为cyberbag可以方便地将ROS数据换为CyberRT可用的数据格式,以支持在CyberRT框架下构建高性能实时系统。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值