ROS踩坑日记 NO.1

简介: ROS踩坑日记 NO.1

踩坑目录

1.ros里面引用自定义头文件

2.ros::Time和ros::Walltime

3.时间戳转化为北京时间

4.可变参数,重构print

5.引用头文件编译不过 https://blog.csdn.net/qq_16775293/article/details/80597763

找了一年的错发现是函数名多打了一个P

6.同一个功能包,头文件和cpp分开写,要做成库然后链接

https://blog.csdn.net/qq_32761549/article/details/104578900

7.编译 ,跨功能包引用头文件,会在当前目录下寻找cpp一同编译(CMakeLists好像不适用)

8.ROS下跨包调用库

1.ros里面引用自定义头文件

把头文件放到功能包下的include/{功能包} 目录下面,然后在功能包CMakelists里面INCLUDE_DIRS include 这句话前面的注释去掉。

2…ros::Time和ros::Walltime

这两个都是时间戳,Time会随着机器暂停而暂停,Walltime不会随着机器暂停而暂停跟随世界时间走。接口都一样,有两个成员sec秒和nsec毫秒

3.时间戳转化为北京时间

#include <cstring>
#include <time.h>
#include <ros/ros.h>
typedef struct times
    {
        int Year;
        int Mon;
        int Day;
        int Hour;
        int Min;
        int Second;
    }Times;
Times stamp_to_standard(int stampTime, string &output_time)
    {
        time_t tick = (time_t)stampTime;
        struct tm tm;
        char s[100];
        Times standard;
        //tick = time(NULL);
        tm = *localtime(&tick);
        strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S  ", &tm);
        // printf("%d: %s\n", (int)tick, s);
        for (int i = 0; i < 100; i++) {
            if (s[i] == NULL) {
                break;
            }
            output_time += s[i];
        }
        standard.Year = atoi(s);
        standard.Mon = atoi(s+5);
        standard.Day = atoi(s+8);
        standard.Hour = atoi(s+11);
        standard.Min = atoi(s+14);
        standard.Second = atoi(s+17);
        return standard;
    }

具体不想研究了…大概就是转化为time的格式然后输出。

4.可变参数,重构print

#include <stdarg.h> // 可变参数的头文件
void PERCEPTION(string file_name, int line, string fmt, ...) {
        va_list args;
        va_start(args, fmt);
        char arry[256];
        strcpy(arry, fmt.c_str());
        char buff[256];
        vsnprintf(buff, sizeof(buff), arry, args);
//    cout << buff <<endl;
        va_end(args);
//    perror(buff);
        ros::Time::init();
        // WallTime:挂钟时间,取现实世界的时间戳不会因为机器暂停而暂停
        ros::WallTime now_wall_time = ros::WallTime::now();
        int stmap = now_wall_time.sec;
        string log_time;
        Times BeiJing_time = stamp_to_standard(stmap, log_time);
        cout << log_time << "[Perception]  " << buff << std::endl;
        std::ofstream file;
        file.open("src/log_info/log.csv", std::ios_base::app);
        file << log_time << ',' <<"[Perception]" << ',' << file_name.c_str() << ',' << line << ',' << buff << std::endl;
        file.close();
    }

参数列表中的…就是可变参数

5.引用头文件编译不过

A功能包引用B功能包头文件,需要在A功能包CMakelists和package中加入对B功能包的依赖。

6.同一个功能包,头文件和cpp分开写,要做成库然后链接

https://blog.csdn.net/qq_32761549/article/details/104578900

add_library(log_handle include/log/log.h src/log.cpp) // log_handle做成一个库
target_link_libraries(log_handle ${catkin_LIBRARIES}) // 链接库
add_executable (test_log src/test.cpp)
target_link_libraries(test_log log_handle ${catkin_LIBRARIES}) // 这一步最重要,把库和可执行文件链接起来

7.编译原理,跨功能包引用头文件,会在当前目录下寻找cpp一同编译

我在B包中引用了A包的头文件,但是一直报函数未定义;因为我.h和.cpp没有放到同一个目录下,编译B包的时候找不到cpp就没有编译;放到同一个目录下即可。

8.ROS下跨包调用库

没找到解决办法,.h文件能看到,.cpp就是看不到,一直报函数未定义的错误。应该和CMakeLists有关,关键就是生成了一个静态库,但是怎么调用它。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
6天前
|
缓存
Autojs4.1.0实战教程---彩蛋视频功能合集
Autojs4.1.0实战教程---彩蛋视频功能合集
30 0
|
6天前
|
缓存 数据安全/隐私保护
Autojs4.1.0实战教程---快逗短视频功能合集
Autojs4.1.0实战教程---快逗短视频功能合集
22 0
|
6天前
|
存储 编译器 测试技术
【3w字吐血总结 | 新手必看】全网最详细Go笔记
【3w字吐血总结 | 新手必看】全网最详细Go笔记
53 0
|
6天前
|
Java 数据库 开发者
阿里P8大牛独家打造586页Java面试宝典,在GitHub上标星105K
很多Java开发者面试之前,可能没有较长的工作时间或者较为丰富的工作经验,所以不知道互联网公司或者一线互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。针对这些的读者朋友,小编整理了一些知名大厂的面经,在这分享给读者朋友们参考,让即将面试或是有想法跳槽的读者朋友们了解一下一线大厂面试时都喜欢问那些问题,从JavaSE~中高级统统覆盖!
|
5月前
|
SQL 安全 Java
阿里大牛1个月肝出一份35万字Security实战笔记,GitHub标星47k+
很多时候,一个系统的安全性完全取决于系统开发人员的安全意识。例如,在我们从未听过SQL注入时,如何意识到要对SQL注入做防护?关于Web系统安全的攻击方式非常多,诸如XSS、CSRF等,未来还会暴露出更多的攻击方式,我们只有在充分了解其攻击原理后,才能提出完善而有效的防护策略。在笔者看来,学习Spring Security并非局限于降低Java应用的安全开发成本,通过Spring Security了解常见的安全攻击手段以及对应的防护方法也尤为重要,这些是脱离具体开发语言而存在的。
阿里大牛1个月肝出一份35万字Security实战笔记,GitHub标星47k+
|
5月前
|
Java 容器
膜拜!清华大佬手撸多线程并发源码笔记Github上线3天星标35k+
你为什么要学习多线程?是因为理想吗?是因为热爱吗? 哦~原来是为了面试打基础、做准备啊!没错,这真的很现实!
膜拜!清华大佬手撸多线程并发源码笔记Github上线3天星标35k+
|
6月前
|
Java Scala Ruby
GitHub程序调优「黑马」!阿里大牛的Java性能优化实战笔记已上线
作为一个平台,JVM虚拟机起着举足轻重的作用。除了Java语言,任何一种能够被编译成字节码的计算机语言都属于Java这个平台。Groovy、Scala和JRuby等都是Java平台的一部分,它们依赖于JVM虚拟机,同时,Java平台也因为它们而变得更加丰富多彩。
|
8月前
|
架构师 Dubbo Java
共36万字!为上岸Alibaba,我把Github上Java面试题都整理了一遍
如果你不停地加班。却很少冒险,也很少学习,那你极大可能会陷入到内卷中。 为什么这么说呢?我们先来捋清楚「内卷」的概念: 「内卷化」简而言之就是:日复一日,越混越掉坑里。
|
9月前
|
监控 Java 测试技术
GitHub上线一分钟标星破千万!这份Java性能优化手册看完最少p8
性能优化一直是一个永恒的话题,尤其在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题纷至沓来,Java语言作为使用最广泛的一门语言,在社区生态更是积攒了非常多宝贵的经验。如果既懂系统,又懂技术原理,那么对性能调优的帮助将非常大。
64 0