项目实训 - 智能车系统 - 第八周记录

2023-05-16

项目实训 - 智能车系统 - 第八周记录

日期:4.11 – 4.17

项目进度

本周工作进展:

  • 完成了雷达驱动的编写(未测试)
  • 完成imu驱动的编写(未测试)
  • 与可视化部分进行对接

1、速腾rslidar驱动编写(二次开发)

通过阅读ROS二次开发的rslidar驱动后,决定延用之前移植项目的做法,在ros二次开发的版本的基础上进行修改,将发布的数据修改我们自定义的类型,并且发布数据。

另一个节点rs_to_velodyne订阅上面发布的消息,将数据转换成velodyne的点云格式,然后进行发布,被项目订阅。

具体移植过程不做记录,这里记录一下开发过程中的一些问题。

可能产生的问题记录

由于封校原因,暂时无法拿到雷达,所以无法直接对编写好的驱动进行测试,所以记录了一下移植后可能产生的问题:

  • height和width的问题
    • rslidar发布的点云数据是有序的(height!=1 ),但是阅读lio-sam后,发现lio-sam获取的数据是无序的(height == 1 ),二者出现了差异
    • 我的做法是在驱动中直接将点云数据按照heght=1的情况进行存储,然后发布
  • point.at的问题
    • 也是上面的问题,由于点云存储方式的不同,定位到每个点的时候,也可能出现乱序的情况
  • 时间戳的起始问题
    • 获取数据包中的时间信息,进行解析
  • 时间数据流的大端法和小端法
    • 这个是传入的数据流的存储方式问题,根据雷达手册暂时无法区分
    • 需要具体测试
  • 从参数服务器中获取tf参数
    • 这个貌似是没用的,不需要tf的相关信息
  • 将ros的时间戳改成系统时间戳 input
    • 这里在ros的二次开发版本中,是使用ROS::time获取当前时间戳
    • 我的做法是获取了系统时间戳(system time),通过c++标准库实现
  • getPacket传入的参数是不是指针
  • 配置文件可能不全
    • 去网上搜到了一些配置文件,需要实际调试

时间戳处理问题

要注意的是,传出的数据包中,实际上包含了两个时间戳的信息:

  • 整个数据包的时间戳(获取系统时间戳)
  • 数据包中,点云中包含的timestamp信息

希望得到的时间戳

  • double类型,以sec为单位
  • 小数点后精确到us

分析雷达返回的时间格式

  • 后4byte数据可以直接拼出us部分
    • ms * 1e6 + us
  • 前6byte无法简单地得到sec部分,需要调用c标准库time.h

文档:https://en.cppreference.com/w/c/chrono/time_t

简单学习后,总结如下信息:

  • 头文件 <time.h>

  • 时间戳类:time_t,给类型返回一个整数,代表标准UTC时间戳,精确到sec

  • tm,一个结构体,成员如下:

    在这里插入图片描述

  • mktime:函数,将一个tm类型变量转换成time_t类型

demo实例:

#include <stdio.h>
#include <time.h>
#include <locale.h>
 
int main()
{
 
        // struct tm my_time = { .tm_year=112, // = year 2012
        //                   .tm_mon=9,    // = 10th month
        //                   .tm_mday=9,   // = 9th day
        //                   .tm_hour=8,   // = 8 hours
        //                   .tm_min=10,   // = 10 minutes
        //                   .tm_sec=20    // = 20 secs
        //                     };

    struct tm my_time;
    my_time.tm_year = 112;
    my_time.tm_mon = 9;
    my_time.tm_mday = 9;
    my_time.tm_hour = 8;
    my_time.tm_min = 10;
    my_time.tm_sec = 21;
    printf("Today is           %s", asctime(&my_time));
    printf("(DST is %s)\n", my_time.tm_isdst ? "in effect" : "not in effect");
    //my_time.tm_mon -= 100;  // tm_mon is now outside its normal range
    time_t timet = mktime(&my_time);       // tm_isdst is not set to -1; today's DST status is used
    // printf("100 months ago was %s", asctime(&my_time));
    // printf("(DST was %s)\n", my_time.tm_isdst ? "in effect" : "not in effect");
    printf("%ld\n", timet);


}

输出结果:

在这里插入图片描述

可以使用如上函数来处理得到需要的sec信息

定义了一个raw_time结构体,存储原始时间数据

/**
 * @brief 自定义用于解析数据包中的时间信息
 * raw data
 * 
 */
struct raw_time
{
  uint8_t year;
  uint8_t month;
  uint8_t day;
  uint8_t hour;
  uint8_t minute;
  uint8_t second;
  uint16_t msecond;
  uint16_t usecond;
}

接口

/**
 * @brief convert raw time info to timestamp(double, uint: s)
 * 
 * @param raw_time_data 
 * @return double 
 */
double RawData::get_timestamp(raw_time raw_time_data)
{
  //处理sec
  struct tm cur_time;
  cur_time.tm_year = raw_time_data.year + 100;
  cur_time.tm_mon = raw_time_data.month - 1;
  cur_time.tm_mday = raw_time_data.day;
  cur_time.tm_hour = raw_time_data.hour;
  cur_time.tm_min = raw_time_data.minute;
  cur_time.tm_sec = raw_time_data.second;

  uint32_t sec = mktime(&tm);

  //处理nsec
  uint32_t nsec = raw_time_data.msecond * 1e6 + raw_time_data.usecond;

  //得到double类型时间戳
  return (static_cast<double>(sec) + 1e-9*static_cast<double>(nsec));
}

测试基本没啥问题

  • 问题:需要判断雷达得到的数据流是大端法还是小端法
  • 会丢失一点us的精度

2、imu驱动编写

这个部分有学长提供的imu手册,对照着直接编写即可,不做具体记录

3、与可视化的对接

这个部分比较顺利,因为之前的接口已经定义好的,所以运行项目和可视化之后,直接就可以正常运行了,效果图如下(因为之前订阅的是registered_raw点云数据,没有经过降采样,所以看起来有点糊)

右边是rivz的运行效果,左侧是自定义效果

在这里插入图片描述

流程(接收端暂时还是使用ros的机制):

  • rosbag启动数据包
  • lio-sam项目启动,接收数据,处理后发布数据
  • 可视化接收lio-sam发布的数据,继续渲染

技术难点

socket通信

bug记录

没啥大bug

其他

下周预计完全去除项目中的ros相关的东西(之前方便调试,有些变量函数都没有删除),重写一个cmake文件。这样一整个流程基本上就可以实现了。

安利一波新番 测不准的阿波连同学,萌翻了家人们。,。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

项目实训 - 智能车系统 - 第八周记录 的相关文章

  • 视觉SLAM理论——位姿的理解与间接求解

    目录 xff1a 位姿的定义位姿与变换矩阵的区别与联系位姿的求解方法 位姿的定义 在SLAM中 xff0c 位姿是世界坐标系到相机坐标系的变换 xff0c 包括旋转与平移 根据以上定义可以衍生以下几个问题 xff1a 1 世界坐标系在哪 x
  • 线性最小均方误差算法(LMSE),最小二乘法(LS)

    目录 背景正交投影引理LMSE算法LS算法直线拟合 背景 对于一个系统 xff0c 在给予一定的输入 xff0c 那么通常都会产生相对应的输出 在实际的系统中 xff0c 这样的输出必然伴随着噪声 xff0c 这样被噪声污染的输出通常是传感
  • 无人机,动力系统建模

    建模目的 无人机动力系统包括 xff1a 螺旋桨 电机 电调及电池 建模流程图如下 xff08 图片来源 多旋翼飞行器设计与控制 M 全权 xff09 xff1a 经过误差结算后 xff0c 将误差信息转换为螺旋桨的升力与转矩 xff0c
  • 寻找APM中EKF的五大公式

    EKF核心代码位置 AP NavEKF2 cpp 进入该函数 进入该函数 xff0c 然后可以看到关键部分 xff0c 也即卡尔曼五个公式的地方 下面介绍每个公式的具体位置 28状态值 首先要知道选用的状态值有哪些 xff0c 28状态值
  • 【PX4 EKF simulink仿真程序解析】(一)初始化

    PX4 EKF simulink仿真程序解析 xff08 一 xff09 初始化 整体框架如下 xff1a 进入InertialNavFliter xff0c 整体框架如下 xff1a 初始化过程包括协方差初始化 状态向量初始化 其中包括测
  • C++——三种继承方式与三种访问权限的相互组合

    三种访问权限 public 可以被任意实体访问 protected 只允许子类及本类的成员函数访问 private 只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 private 继承 组合结果 基类中 继
  • 小米路由器部分机型刷原生Openwrt系统

    小米路由器的部分机型在官网没有开发版的固件 xff0c 不支持直接开启ssh xff0c 可以通过OpenWRTInvasion工具解决 本文以小米路由器4为例 xff1a 在openwrt官网的设备列表中找到对应型号 xff0c 按照页面
  • qt的安装与卸载

    通常情况下 xff0c 有两种安装方法 xff1a 1 直接在命令行安装 sudo apt span class hljs keyword get span install qt5 span class hljs keyword defau
  • 固件提取

    前言使用工具识别芯片一 摘取芯片二 制作U盘编程器三 RT809H编程器读取eMMC芯片数据四 总结 前言 无处不在的物联网设备 xff0c 也可能成为无所不在的安全隐患 xff0c 物联网安全问题一直是困扰物联网快速发展的一大难题 作为安
  • xshell评估过期解决办法,非常简单

    首先 xff0c 你的xshell不要卸载 xff0c 不需要动任何地方 进官网 https www netsarang com zh xff0c 翻到最下面 xff0c 下载那里点家庭 学校免费 然后会跳转到下面这个界面 xff0c 按图
  • vscode配置markdown,安装插件

    一 概述 最近迷上了MarkDown xff0c 所以进行了学习 xff0c 首先是编辑器的选择 xff0c 可以参考这篇文章 xff1a 好用的MARKDOWN编辑器一览 我本人并没有选择其中的任意一款进行尝试 xff0c 因为我个人十分
  • Vs2019重新生成解决方案时报错

    解决办法 xff1a Release模式下 gt 属性 gt 高级 gt 高级属性 gt 全程序优化 将这里的默认项 使用链接时间代码生成 改为 无全程序优化 xff0c 接下来就可以运行了
  • 指针常量和常量指针

    参考 xff1a C语言 常量指针 指针常量以及指向常量的指针常量三者区别详解 望崖的博客 CSDN博客 常量指针和指针常量的区别
  • LW_OOPC 宏配置及使用指南

    LW OOPC 宏配置及使用指南 摘抄 xff1a https github com Akagi201 lw oopc LW OOPC 是一套轻量级的面向对象 C 语言编程框架 它是一套 C 语言的宏 xff0c 总共 1 个 h 文件 如
  • 十个值得学习的c开源项目(嵌入式)

    开源世界有许多优秀的开源项目 xff0c 我选取其中十个最优秀的 最轻量级的C语言的项目 xff0c 希望可以为C语言开发人员提供参考 十个最值得阅读学习的C开源项目代码 1 Webbench 2 Tinyhttpd 3 cJSON 4 C
  • 树莓派开机无法进入桌面的解决办法

    1 初次开机会出现 34 raspi config 34 这个界面 xff0c xff08 如下图 xff09 如果不是初装的系统 xff0c 也可以输入命令 xff1a sudo raspi config xff0c 调出此界面 2 如果
  • Xshell 6, 7 已过期的解决方案

    公开版的Xshell一段时间后就评估失效 xff0c 很麻烦 xff0c 下面的方法可以在官网下载个人免费版本 xff0c 常用功能都有亲测有效 xff01 就算之前安装过已经过期的Xshell也没关系 1 首先进入 xff1a https
  • C语言网络编程(1)— UDP通信

    C语言网络编程 xff08 1 xff09 UDP通信 一 socket 我们要进行网络通信 xff0c 那么就要用到socket xff0c socket即网络套接字 xff0c 应用程序可以通过它发送或接收数据 xff0c 可对其进行像
  • C语言网络编程(2)— TCP通信

    C语言网络编程 xff08 2 xff09 TCP通信 一 TCP客户端 1 建立连接 我们要使用到socket xff0c 首先首先我们添加要使用的头文件 span class token macro property span clas
  • 搭建kubernetes v1.21.5 和 kubesphere v3.2.1

    一 准备一台干净的centos7 6机器 二 关闭防火墙打上相关补丁和相关系统软件 systemctl stop firewalld yum span class token function install span openssh op

随机推荐

  • js定时器

    一 定时器概述 开发时用到的js定时器主要分为两种 xff1a 1 一次性的定时器setTimeOut方法 xff0c 通过设置一定的时间 xff0c 时间到就执行 var timer 61 setTimeout fun 毫秒数 清除的方法
  • UNIX 环境高级编程

    与你共享 xff0c 与你共舞 xff01 UNIX环境高级编程 xff08 第3版 xff09 是被誉为UNIX编程 圣经 xff1b 书中除了介绍UNIX文件和目录 标准I O库 系统数据文件和信息 进程环境 进程控制 进程关系 信号
  • ROS的CMakeList编写

    参考这位博主 我的cmakelist包 在 home xxx catkin Drone src Flight Control ROS CMakeLists txt cmake minimum required span class toke
  • Ubuntu18.04 NX下用ZED2 双目立体相机进行SLAM

    NX下的ZED2开发 安装流程问题开始了看效果安装ZED2 ROS工具 新故事篇章 zed2测距开始实现 安装流程 了解zed参数 因为网上的安装流程还是不太完整 xff0c 我补充一下 希望对其他人也有帮助 部分流程参考这位 xff1a
  • ubuntu16.04备份和迁移

    ubuntu16 04备份和迁移 背景实践1 备份整个系统2 重装Ubuntu16 043 恢复系统 题外话 xff1a 修改主机名参考文章 背景 此文用来快速记录备份和恢复的过程步骤 xff0c 具体命令意思不做过多介绍 因为不想新设备重
  • Ubuntu apt-get报错

    昨天晚上更新源 xff0c 居然报错了 zcidcs 64 ubuntu sudo apt get upgrade sudo password for zcidcs Reading package lists Done Building d
  • 2014阿里巴巴面试总结

    刚结束的一面 xff0c 可能昨天笔试题目做得还行 xff0c 今天中午电话我叫我1 30去面试 xff0c 时间紧急 xff0c 我吃完饭赶紧回宿舍小休息一会儿 xff0c 然后奔赴文三路的华星时代大厦 人太多了 xff0c 等到了2 2
  • 基类指针,子类指针,虚函数,override与final

    一 xff1a 基类指针与子类指针 span class token macro property span class token directive keyword include span span class token strin
  • web开发中实现页面记忆的几种方式

    一 前言 在前段时间公司有个需求是对前一个页面的操作进行记忆 xff0c 例如分页的样式 xff0c 选中的条件等 之前是用的session去存储记忆数据 xff0c 老大让我调研一下目前比较合理的方式然后分析一下 xff0c 这里以本篇博
  • 基于VINS与FastPlanner的无人机自主飞行Gazebo仿真

    项目来源及展示 xff1a https www bilibili com video BV1WK4y1V7um from 61 search amp seid 61 12548150687335659873 基本思路 xff1a 采用Gaz
  • RGB-D SLAM 相关总结

    目录 一 RGB D SLAM是什么 xff1f 二 D435i说明 三 RGB D SLAM研究现状 1 现有的RGB D SLAM方法 1 1 前端 1 2 后端 1 3 闭环检测 1 4 制图 2 优秀RGB D SLAM介绍 2 1
  • VINS-Mono学习(一)——数据预处理

    void push back double dt const Eigen Vector3d amp acc const Eigen Vector3d amp gyr dt buf push back dt acc buf push back
  • VINS-Mono学习(四)——回环检测与重定位

    目录 1 闭环检测常用方法有哪些 xff1f 2 ORB SLAM2中Loop Closing的具体实现流程是怎样的 xff1f 3 VINS回环检测与重定位 四自由度位姿图优化 3 1 第一部分 xff1a 回环检测与重定位 3 1 1
  • LADRC的学习——总概

    作者 xff1a 墨心 日期 xff1a 2019 7 25 xff1b 学习LADRC结构 xff1a 1 学习PID的相关知识 xff0c 作为学习ADRC的基础铺垫 xff0c 在simulink中搭建模块 xff0c 通过调节参数
  • LADRC的学习——PID的学习

    PID部分的学习 上文介绍了ADRC的理论 xff0c 并试着按照自己的理解用Matab编程实现韩老师论文中的算法 xff0c 但是对调节参数和一些地方还不太懂 xff0c 因此我打算从头开始理解 xff0c 从PID的好坏开始学习理解 x
  • LADRC的学习——换被控对象进行仿真测试

    LADRC控制器的检验 用不同的被控对象测验 一 前文总结 这篇文章主要根据清华大学的硕士陈星写的论文 xff1a 自抗扰控制器参数整定方法及其热工过程中的应用 进行学习 参考文献为 xff1a 1 Zhiqiang Gao Scaling
  • ROS-3DSLAM(二)lvi-sam项目认识

    2021SC 64 SDUSC xff08 二 xff09 lvi sam项目认识 一 SLAM简介 SLAM是Simultaneous Localization and Mapping xff08 同时定位 43 建图 xff09 独立的
  • KMP算法——字符串匹配问题

    贴上原址 xff1a http www ruanyifeng com blog 2013 05 Knuth E2 80 93Morris E2 80 93Pratt algorithm html 感觉这篇文章讲得很不错 xff0c 很容易懂
  • ROS-3DSLAM(十六)lvi-sam项目总结

    2021SC 64 SDUSC 学习内容概览 本次的项目lvi sam主要分为两个大的模块 xff1a lidar模块和visual模块 我们小组学习先进行了lidar模块的学习 xff0c 然后进行的visual模块 每个模块都分成了若干
  • 项目实训 - 智能车系统 - 第八周记录

    项目实训 智能车系统 第八周记录 日期 xff1a 4 11 4 17 项目进度 本周工作进展 xff1a 完成了雷达驱动的编写 xff08 未测试 xff09 完成imu驱动的编写 xff08 未测试 xff09 与可视化部分进行对接 1