栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ROS踩坑日记 NO.1

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
#include 
#include 
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: %sn", (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  // 可变参数的头文件
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 < 

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

**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有关,关键就是生成了一个静态库,但是怎么调用它。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303681.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号