Imu_heading源码阅读(一)——common.h

comon.h解读:主要功能是读取数据文件所在的目录文件,并对文件中的数据格式进行统一化处理,方便进行后续的数据处理。

#pragma once一般由编译器提供保证:同一个文件不会被包含多次。这里所说的”同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。无法对一个头文件中的一段代码作#pragma once声明,而只能针对文件。

#include "math.h"中包含的函数说明:

#include<math.h>中包含的函数说明_若诗余的博客-CSDN博客_includemathh包含哪些库函数求取绝对值的函数intabs(int i);//返回整型数i的绝对值; 例如int abs(-3.5) == 3.5;//double cabs(struct complex znum);//返回复数znum绝对值;double fabs(double x);//返回双精度数x的绝对值;例如double fabs(-103.5) == 103.5;long labs(long n);//返回长整型n的绝...https://blog.csdn.net/weixin_44643510/article/details/111694169?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165951726416781432980783%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165951726416781432980783&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-111694169-null-null.142%5Ev39%5Econtrol&utm_term=%23include%20math.h&spm=1018.2226.3001.4187#include <chrono>:chrono处理时间和日期的库函数,chrono 库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。

C++ 使用 chrono 库处理日期和时间_程序员编程指南的博客-CSDN博客C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono 库主要包含三种类型的类:时间间隔duratio...https://blog.csdn.net/weixin_41055260/article/details/120124634?ops_request_misc=&request_id=&biz_id=102&utm_term=?ops_request_misc=&request_id=&biz_id=102&utm_term=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-120124634.142%5Ev39%5Econtrol&spm=1018.2226.3001.4187#include%20%3Cchrono%3E&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-120124634.142%5Ev39%5Econtrol#include <cstdlib>:是一些常用的函数,但是又不知道把它们放到哪里合适,因此就都放到了stdlib.h这个头文件中。

#include的解释_阿酱在点点点的博客-CSDN博客_#include 是一些常用的函数,但是又不知道把它们放到哪里合适,因此就都放到了stdlib.h这个头文件中。stdlib.h可以提供一些函数与符号常量,具体如下:根据ISO标准,stdlib.h提供以下类型:size_t, wchar_t, div_t, ldiv_t, lldiv_t常量NULL, EXIT_FAILURE, EXIT_SUCESS, RAND_MAX, MB_CUR_MAX函https://blog.csdn.net/Iaired/article/details/78700180?ops_request_misc=&request_id=&biz_id=102&utm_term=?ops_request_misc=&request_id=&biz_id=102&utm_term=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-78700180.nonecase&spm=1018.2226.3001.4187#include%20%3Ccstdlib%3E&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-78700180.nonecase#include <ctime>:

c++标准库--ctime学习_antRain的博客-CSDN博客_c++ ctimectime学习宏类型:函数获取当地时间源代码输出结果计时源代码输出结果宏CLOCKS_PER_SEC:每秒时钟周期数的表达式。类型:clock_t:表示时钟滴答计数的类型。size_t:其中一个基本无符号整数类型的别名,是一种能够以字节为单位表示任何对象大小的类型time_t:表示时间的类型struct tm:包含日历日期和时间的结构体会员类型含义范围...https://blog.csdn.net/qq_41146650/article/details/96190682?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-6-96190682-blog-82223600.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-6-96190682-blog-82223600.pc_relevant_aa&utm_relevant_index=9#include <stdio.h>:

告诉编译器把stdio.h中的内容包含在当前程序中。

stdio.h是c编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。

#include <unistd.h>:

unistd.h是用于linux/unix系统的调用。

  #include <unistd.h>是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数。

#define,主要指代宏定义:

#define用法详解_白河、愁的博客-CSDN博客_#define 函数1.#define 的作用在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C或C++语言中,“宏”分为有参数和无参数两种。2. 无参宏定义无参宏的宏名后不带参数。其定义的一般形式为:#define 标识符 字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的https://blog.csdn.net/qq_41282070/article/details/108635403?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165952046916782248593294%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165952046916782248593294&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-108635403-null-null.142%5Ev39%5Econtrol&utm_term=%23define&spm=1018.2226.3001.4187constexptr用法:

C++之constexpr详解_C咖咖的博客-CSDN博客_constexprconstexpr表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:constexpr int mf = 20; //20是常量表达式constexpr int limit = mf + 1; // mf + 1是常量表达式constexpr int sz = size(); //之后当siz...https://blog.csdn.net/janeqi1987/article/details/103542802?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-103542802-blog-110470363.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-103542802-blog-110470363.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=2    C++中constexpr函数_棉猴的博客-CSDN博客_c++ constexpr1 简介constexpr函数指的是在编译的时候就能得到其返回值的函数,也就是说编译器将constexpr函数直接转换成其返回值,因此,constexpr函数都是被隐式地定义为内联函数。使用constexpr关键字来修饰constexpr函数。2 使用方法有如下代码:constexprintmyFunc(){ return1;}constexprinti = myFunc() * 4;此时,编译器会将myFunc()函数用其返回值1来代替,在编译时就可知i的值是4。...https://blog.csdn.net/hou09tian/article/details/110470363?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165952526516780357229164%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165952526516780357229164&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-110470363-null-null.142%5Ev39%5Econtrol&utm_term=constexpr&spm=1018.2226.3001.4187inline的用法:
inline的用法_Lzg_na的博客-CSDN博客_inline使用一、extern1、同一文件在.c或者.cpp文件中,可能有多个函数和变量。以main函数为例,在main函数内部定义的为局部变量/局部函数,只在函数体内生效;在main函数外部定义的为全部变量/全部函数,(当然也不能定义在其他函数体内),在本文件都生效,但是作用范围只在定义位置到结束,如果之前有函数要使用该变量会出错,那怎么使用呢?就是要使用extern关键字!!!如图所示,定义的m,这样在main函数里cout<<m使用会报错,在使用它之前添加extern int m;https://blog.csdn.net/qq_34799070/article/details/108117650?ops_request_misc=&request_id=&biz_id=102&utm_term=inline&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-108117650.142%5Ev39%5Econtrol&spm=1018.2226.3001.4187readlink()函数:

readlink 函数用法_Q328333568的博客-CSDN博客_readlink函数相关函数: stat, lstat, symlink表头文件: #include 定义函数:ssize_t readlink(const char *path, char *buf, size_t bufsiz);函数说明:readlink()会将参数path的符号链接内容存储到参数buf所指的内存空间,返回的内容不是以\000作字符串结尾,但会将字符串的字符数返回,这使得添加\000https://blog.csdn.net/JK198310/article/details/41596775?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165952632816781685358519%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165952632816781685358519&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-41596775-null-null.142%5Ev39%5Econtrol&utm_term=readlink%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187substr()函数:

substr函数用法详解_临渊慎行的博客-CSDN博客_substr函数用法substr(string,start<,length>)从string 的start位置开始提取字符串length:待提取的字符串的长度,若length为一下情况时,返回整个字符串的所有字符。1、length不指定2、length为空3、length为负值4、length大于字符串的长度data dat;str="wqerwtweafs";str1=substr(str,5);str2=substr(str,5,"");str3=substr(str,5,-3);str4https://blog.csdn.net/zq9955/article/details/121643591?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165952680516782248579150%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165952680516782248579150&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-121643591-null-null.142%5Ev39%5Econtrol&utm_term=substr%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187rfind()函数:

c++ string中rfind()与find()的简单学习使用_HalfCoke的博客-CSDN博客_c++ rfind以下分析仅仅从使用角度考虑,没有查看过内部实现一、rfind()1. rfind(str)rfind(str)是从字符串右侧开始匹配str,并返回在字符串中的位置(下标);附上测试代码:# include&lt;string&gt;# include&lt;iostream&gt;using namespace std;int main(){string str = "12...https://blog.csdn.net/qq_42446432/article/details/88086259?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165952698916781818791151%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165952698916781818791151&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-88086259-null-null.142%5Ev39%5Econtrol&utm_term=rfind&spm=1018.2226.3001.4187

#pragma once

#include "math.h"
#include <chrono>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <stdint.h>
#include <stdio.h>
#include <string>
#include <unistd.h>

//宏定义一些参数,简化输出部分的代码
#define SHOWDETAIL                                                             \
  printf("\tline: %d;file: %s\n\tdate: %s %s\n", __LINE__, __FILE__, __DATE__, \
         __TIME__)
#define LOGINFO(msg) printf("\033[32m[INFO] %s\033[0m\n", msg)
#define LOGWARN(msg)                                                           \
  printf("\033[33m[WARN] %s\033[0m\n", msg);                                   \
  SHOWDETAIL
#define LOGERROR(msg)                                                          \
  printf("\033[31m[ERROR] %s\033[0m\n", msg);                                  \
  SHOWDETAIL
#define LOG(type, msg) LOG##type(msg)

//利用constexpr构造一些常量,并且常量的值不会改变并且在编译过程就能得到计算结果的表达式。
constexpr uint32_t MONTH_DAY[2][13] = {
    {365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};

constexpr uint32_t SECOND_WEEK = 604800;
constexpr uint32_t SECOND_DAY = 86400;
constexpr uint32_t SECOND_HOUR = 3600;
constexpr uint32_t LEAP_SECOND = 18;
constexpr uint32_t TIME_ZONE = 8;


//构造一个内连函数,得到数据所在的目录路径
//readlink()函数用于得到想要的目录路径
//substr()函数用于提取字符串
//rfind()函数用于找到字符串所在的位置,并返回值
inline std::string GotProjectDir() {
  // parse lidar config path
  char abs_path[1024];
  size_t cnt = readlink("/proc/self/exe", abs_path, 1024);
  if (cnt < 1) {
    LOG(ERROR, "got project dir failed!");
  }
  std::string project_path(abs_path);
  project_path = project_path.substr(0, project_path.rfind("senseauto"));
  return project_path;
};

//构造一个函数,得到一个时间段
class TicToc {
public:
  TicToc() { tic(); }

  void tic() { start = std::chrono::system_clock::now(); }

  double toc() {
    end = std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed_seconds = end - start;
    return elapsed_seconds.count() * 1000;
  }

private:
  std::chrono::time_point<std::chrono::system_clock> start, end;
};

//构造一个内连函数,用于判断传入的数据是否满足相应的条件,满足:返回真值。
inline bool is_leap_year(uint32_t year) {
  if (year % 4 == 0 && year % 100 != 0) {
    return true;
  } else if (year % 400 == 0) {
    return true;
  } else
    return false;
};

构造一个内连函数,用于判断的数据是否满足条件,如果满足,直接返回;不满足,需要对数据进行处理。
inline std::string FormatSTDTimeString(const std::string &in_str) {
  if (in_str.size() != 17 && in_str.size() != 23 && in_str.size() != 26) {
    std::cout << "invalid input " << in_str << "(" << in_str.size()
              << ") format is yyyy-mm-dd-hh-mi-ss-ms or "
              << "yyyymmddhhmissms or yyyy-mm-dd-hh-mi-ss-us" << std::endl;
    return in_str;
  }
  std::string out_str;
  // format:yyyymmddhhmissms
  if (in_str.size() == 17) {
    out_str = in_str.substr(0, 4) + "-" +  // yyyy
              in_str.substr(4, 2) + "-" +  // mm
              in_str.substr(6, 2) + " " +  // dd
              in_str.substr(8, 2) + ":" +  // hh
              in_str.substr(10, 2) + ":" + // mi
              in_str.substr(12, 2) + "." + // ss
              in_str.substr(14, 3);
  }
  // format:yyyy-mm-dd-hh-mi-ss-ms
  if (in_str.size() == 23 or in_str.size() == 26) {
    out_str = in_str;
    out_str[10] = ' ';
    out_str[13] = out_str[16] = ':';
    out_str[19] = '.';
  }
  return out_str;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值