ROS 1.0 学习笔记(6)CMakeLists.txt 使用说明

2023-05-16

ROS1中每个PKG的配置都是在CMakeList.txt中,本文从官方 WiKi 资料中翻译而来。

1. 概览

文件CMakeLists.txt是CMake编译系统的配置文件,用于配置需要编译软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何编译代码以及将代码安装到何处。用于catkin 项目的CMakeLists.txt文件是标准的 vanilla CMakeLists.txt文件,并带有一些其他条件。

2. 整体架构

您的CMakeLists.txt文件必须遵循此格式,否则您的软件包将无法正确构建。配置中的顺序没有影响。

  • 所需的CMake版本(cmake_minimum_required)
  • 功能包名称(project())
  • 查找编译所需的其他CMake / Catkin软件包(find_package())
  • 启用Python模块支持(catkin_python_setup())
  • 消息/服务/动作生成器(add_message_files(),add_service_files(),add_action_files())
  • 调用消息/服务/动作生成(generate_messages())
  • 指定软件包编译信息导出(catkin_package())
  • 要编译的库/可执行文件(add_library()/ add_executable()/ target_link_libraries())
  • 测试编译结果(catkin_add_gtest())
  • 安装规则(install())

3. CMake版本

每个 catkin CMakeLists.txt文件必须以所需的CMake版本开头。Catkin需要版本2.8.3或更高版本。

cmake_minimum_required(VERSION 2.8.3)

4. 功能包名称

下一项是由CMake项目功能指定的软件包名称。假设我们正在制作一个名为robot_brain的软件包。

project(robot_brain)

再声明project(project_name)后,可以在CMakeList.txt中,您可以通过使用变量
$ {PROJECT_NAME} 在脚本中的任何地方使用 package 名称。

5. 查找依赖的CMake软件包

然后,我们需要使用 CMake 中 find_package 函数来指定需要找到哪些其他CMake软件包来编译我们的项目。catkin始终至少存在一种依赖:

find_package(catkin REQUIRED)

如果您的项目依赖于其他功能包,则它们会自动转换为catkin的组件(以CMake类型)。如果您将这些软件包指定为组件,而不是在这些软件包上使用find_package,它将使工作变得更轻松。例如,如果您使用包nodelet。

find_package(catkin REQUIRED 
COMPONENTS nodelet)

也可以用以下方式:

find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)

5.1 find_package()有什么作用?

如果CMake通过find_package找到了一个包,它将影响到 与这个包有关的几个CMake环境变量的创建。这些环境变量在CMake脚本中后面可能被使用到。这些环境变量描述了软件包导出的头文件在哪里,源文件在哪里,软件包所依赖的库以及这些库的路径。
一般命名按照这个方式_:

  • < NAME >_FOUND - Set to true if the library is found, otherwise false

  • < NAME >_INCLUDE_DIRS or < NAME >_INCLUDES - The include paths exported
    by the package

  • < NAME >_LIBRARIES or < NAME >_LIBS - The libraries exported by the
    package

  • < NAME >_DEFINITIONS - ?

5.2 为什么将Catkin包装指定为组件?

catkin 功能包并不是 catkin 的真正组成部分。而是在 catkin 设计中利用了 CMake 的组件功能,以节省大量的打字时间。
对 catkin 功能包来说,将 find_packages 的相关包当做 catkin 的组件,这是有利的,因为一系列的环境变量都是以 catkin_prefix 为前缀创建的。例如,假设我们在代码中使用功能包nodelet。推荐的查找软件包的方法是:

find_package(catkin REQUIRED COMPONENTS nodelet)

这意味着nodelet导出的 include 路径,库等也将附加到 catkin_variables 中。例如,catkin_INCLUDE_DIRS 不仅包含 catkin 的 include 路径,还包含 nodelet 的 include 路径!

我们也可以单独使用 find_package nodelet:

find_package(nodelet)

这意味着nodelet 路径,库等不会添加到catkin_变量中。

这将影响nodelet_INCLUDE_DIRS,nodelet_LIBRARIES等的使用。相同的变量可以通过以下方式创建:

find_package(catkin REQUIRED COMPONENTS nodelet)

如果使用C ++和Boost,则需要在Boost上调用find_package()并指定将Boost的哪些方面用作组件。例如,如果您想使用Boost线程:

find_package(Boost REQUIRED COMPONENTS thread)

6. catkin_package()

catkin_package() 是由 catkin 提供的一种 CMake 宏。这是指定 catkin_specific 信息来编译系统所必须的,用以生成 pkg-config 和 CMake 文件。
此函数必须在调用 add_library()或 add_executable()声明任何目标之前调用。此函数有5个可选参数:

  • INCLUDE_DIRS - The exported include paths (i.e. cflags) for the
    package
  • LIBRARIES - The exported libraries from the project
  • CATKIN_DEPENDS - Other catkin projects that this project depends on
  • DEPENDS - Non-catkin CMake projects that this project depends on. For a better understanding, see this explanation.
  • CFG_EXTRAS - Additional configuration options
    完整的宏文档可在此处找到。
    举个例子:
catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)

这表示导出功能包的头文件位于功能包文件夹中的文件夹“ include”中。
CMake 环境变量 ${PROJECT_NAME} 等于前面传给函数 project()的值,在这里就是"robot_brain"。
“roscpp” + "nodelet"是为了编译/运行这个功能包所必须添加的功能包依赖。
“eigen” + “opencv” 是为了编译/运行这个功能包所必须添加的系统依赖。

7. 指定编译目标

所编译的目标可以采用多种形式,但是通常它们代表以下两种可能性之一:

  • Executable Target - programs we can run

  • Library Target - libraries that can be used by executable targets at build and/or runtime

7.1 目标命名

非常重要的一点是要注意,catkin中的编译目标名称必须唯一,而与编译/安装到的文件夹无关。
这是CMake的要求。但是,目标的唯一名称仅在CMake内部必需。
可以使用 set_target_properties()函数将目标重命名为其他目标。
例如:

set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")

这将在编译和安装输出中将目标rviz_image_view的名称更改为image_view。

7.2 自定义输出路径

通常将可执行文件和库的默认输出目录设置为合理的值,但在某些情况下必须对其进行自定义。
例如,必须将包含Python绑定的库放置在其他文件夹中,才能在Python中导入:

set_target_properties(python_module_library
  PROPERTIES LIBRARY_OUTPUT_DIRECTORY  ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})

7.3 Include 路径和 Library 路径

在指定目标之前,您需要指定可以在何处找到所述目标的资源,特别是头文件和库:

  • Include Paths - Where can header files be found for the code (most common in C/C++) being built
  • Library Paths - Where are libraries located that executable target build against?
  • include_directories(, , …, )
  • link_directories(, , …, )

7.3.1 include_directories()

include_directories的参数应为调用find_package函数生成的 * _INCLUDE_DIRS 变量以及需要包含的任何其他目录。如果您使用的是catkin和Boost,则include_directories()调用应如下所示:

  • include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

第一个参数“ include”表示功能包中的include /directory 也是路径的一部分。

7.3.2 link_directories()

CMake link_directories()函数可用于添加其他库路径,但是不建议这样做。当所有catkin和CMake软件包已经添加到find_package函数中时,会自动添加其链接信息。
只需链接到target_link_libraries()中的库:

link_directories(~/my_libs)

请参阅此 CMake线程,以查看在 link_directories()上使用t arget_link_libraries()的详细示例。

7.4 Executable Targets

要指定必须编译的可执行目标,我们必须使用 CMake函数 add_executable()。

add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

这将编译生成一个名为myProgram的目标可执行文件,该可执行文件由3个源文件构建:src / main.cpp,src / some_file.cpp和src / another_file.cpp。

7.5 Library Targets

CMake函数 add_library()用于指定要编译生成的库。默认情况下,catkin编译生成共享库。

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

7.6 target_link_libraries

使用 target_link_libraries()函数来指定可执行目标链接到的库。通常在调用 add_executable()之后完成此操作。如果找不到ros,请添加$ {catkin_LIBRARIES}。
语法;

target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)

例子:

add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)  -- This links foo against libmoo.so

请注意,在大多数情况下无需使用link_directories(),因为该信息是通过find_package()自动提取的。

8.Messages, Services, and Action Targets

ROS中的消息(.msg),服务(.srv)和操作(.action)文件需要特殊的预处理编译步骤,然后才能由ROS软件包对其编译和使用。这些宏的目的是生成特定于编程语言的文件,以便人们可以使用其选择编程语言对应的用消息,服务和操作功能。编译器支持各种可用的生成器(e.g. gencpp, genpy, genlisp, etc)。
提供了三个宏来分别处理消息,服务和操作:

  • add_message_files
  • add_service_files
  • add_action_files
    然后,必须在这些宏之后调用生成器以调用生成:
  generate_messages()

8.1 Important Prerequisites/Constraints

  • 为了使生成器正常工作,这些宏必须在 catkin_package()宏之前出现。
find_package(catkin REQUIRED COMPONENTS ...)
 add_message_files(...)
 add_service_files(...)
 add_action_files(...)
 generate_messages(...)
 catkin_package(...)
 ...
  • catkin_package()宏必须有 CATKIN_DEPENDS 的依赖 message_runtime。
catkin_package(
 ...
 CATKIN_DEPENDS message_runtime ...
 ...)
  • 无论是单独使用还是作为catkin的组件使用,必须使用 find_package()用于功能包的 message_generation:
find_package(catkin REQUIRED COMPONENTS message_generation)
  • 对应的package.xml文件必须包含一个编译依赖message_generation 和 一个运行依赖 message_runtime 。如果依赖关系是从其他包中传递过来的,则没有必要进行这个操作了。
  • 如果有一个需要编译的功能包依赖于其他待编译的功能包的消息/服务/操作,此时需要添加一个传递依赖 catkin_EXPORTED_TARGETS ,以便于这些功能包可以按照正确的编译顺序进行编译。这种情况几乎总是适用,除非创建的程序包确实不使用ROS的任何其他部分。不足的是,这种依赖关系不能自动传递。(some_target 是由add_executable()设定的编译输出名称):
 add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
  • 如果有一个功能包需要编译相应的消息 / 服务,并生成相应的可执行文件,需要对自动生成的消息创建一个可传递的依赖,以便于按照正确的顺序进行编译。(some_target 是由add_executable()设定的编译输出名称):
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
  • 如果您的软件包同时满足上述两个条件,则需要添加两个依赖项,即:
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

8.2 举个例子

如果功能包的在名为“ msg”的目录中有两条消息“ MyMessage1.msg”和“ MyMessage2.msg”,并且这些消息依赖于std_msgs和sensor_msgs,在名为“ srv”的目录中有“ MyService.srv”的的服务,定义使用这些消息和服务的可执行文件 message_program,以及使用ROS某些部分但不使用此程序包中定义的消息/服务的 dos_not_use_local_messages_program 可执行文件,在CMakeLists.txt中将需要以下内容:

# Get the information about this package's buildtime dependencies
  find_package(catkin REQUIRED
    COMPONENTS message_generation std_msgs sensor_msgs)

  # Declare the message files to be built
  add_message_files(FILES
    MyMessage1.msg
    MyMessage2.msg
  )

  # Declare the service files to be built
  add_service_files(FILES
    MyService.srv
  )

  # Actually generate the language-specific message and service files
  generate_messages(DEPENDENCIES std_msgs sensor_msgs)

  # Declare that this catkin package's runtime dependencies
  catkin_package(
   CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
  )

  # define executable using MyMessage1 etc.
  add_executable(message_program src/main.cpp)
  add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS}  ${catkin_EXPORTED_TARGETS})

  # define executable not using any messages/services provided by this package
  add_executable(does_not_use_local_messages_program src/main.cpp)
  add_dependencies(does_not_use_local_messages_program ${catkin_EXPORTED_TARGETS})

此外,如果您要编译生成 actionlib 操作,在功能包里“ action ”目录中有一个名为“ MyAction.action”的操作文件,必须将 actionlib_msgs 添加到 find_packaged 的组件列表中,并在调用generate_messages(…)之前添加以下调用:

add_action_files(FILES
  MyAction.action
)

此外,该程功能包必须对 actionlib_msgs 具有编译依赖(在package.xml中添加)。

9. 使能 Python 模块支持

如果您的ROS软件包提供了一些Python模块,则应创建setup.py文件并调用

catkin_python_setup()

10. 单元测试

catkin 中以 gtest 为基础的测试单元 , catkin_add_gtest()。

if(CATKIN_ENABLE_TESTING)
  catkin_add_gtest(myUnitTest test/utest.cpp)
endif()

11. 可选步骤:指定编译输出目标路径

在编译后,生成的目标文件在 catkin 工作空间下的 devel 。但是,实际中需要将编译生成的目标文件放到系统(目标文件的安装路径)中,这样编译生成的目标文件就可以被其他用户使用,或者将生成的目标文件放在一个本地文件夹中,以用来测试系统级别的安装。换句话说,如果需要 make install 生成的目标文件,就必须指定生成文件的放置路径。
可以通过配置 CMake 中 install() function函数的相关参数来设置生成路径:

  • TARGETS - which targets to install
  • ARCHIVE DESTINATION - Static libraries and DLL (Windows) .lib stubs
  • LIBRARY DESTINATION - Non-DLL shared libraries and modules
  • RUNTIME DESTINATION - Executable targets and DLL (Windows) style shared libraries

以生成共享库为例:

install(TARGETS ${PROJECT_NAME}
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)

以生成执行文件为例:

install(TARGETS ${PROJECT_NAME}_node
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

除了这些标准安装目标外,还必须将某些文件安装到特殊文件夹中。例如,必须将包含Python的库安装到其他文件夹中,才能在Python中导入:

install(TARGETS python_module_library
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
)

11.1 编译 Python 执行脚本

对 Python 而言,编译方式与 C++ 是不同的, CMake 决定编译输出路径 add_library() 和编译输出类型的函数 add_executable() 是没有用的。因此,按照如下方式在 CMakeLists.txt 进行配置:

catkin_install_python(PROGRAMS scripts/myscript
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

有关安装python脚本和模块的详细信息以及文件夹布局的最佳做法,可在 catkin手册 中找到。

11.2 安装头文件路径

头文件也必须安装到“ include”文件夹中,这通常是通过安装整个文件夹的文件来完成的( 可以按文件名模式过滤,但不包括SVN子文件夹)。这可以通过如下所示的安装规则来完成:

install(DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  PATTERN ".svn" EXCLUDE
)

或包含在下面的子文件夹与软件包名称不匹配:

install(DIRECTORY include/
  DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}
  PATTERN ".svn" EXCLUDE
)

11.3 安装roslaunch文件或其他资源

可以将其他资源(如 launch 文件)安装到$ {CATKIN_PACKAGE_SHARE_DESTINATION}:

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

ROS 1.0 学习笔记(6)CMakeLists.txt 使用说明 的相关文章

  • Couldn't find executable named joy_node below /opt/ros/kinetic/share/joy解决方法

    最近想用joy node这个节点 xff0c 然后就通过 sudo apt get install ros kinetic joy 去安装 xff0c 然后运行rosrun joy joy node时候一直错误显示Segmentation
  • ros修改map_server地图发布的map关联的坐标系frame_id(多机器人联合建图用)

    帮师弟做多机器人联合建图的时候 遇到了map的坐标系问题如下 map server发布的 map话题包含了frame坐标系关联 想要正确的让多个机器人共同建图导航需要修改 map话题以及其绑定的frame坐标系 防止机器人之间的相互冲突 下
  • ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)

    最近在做图像的深度学习识别 xff0c 但是移动机器人上的电脑配置不够 xff0c 只能用我的电脑远程的去处理图像 xff0c 但是遇到了严重的带宽瓶颈 xff0c 按照我的电脑150Mbps的无线网卡来算 xff0c 每秒的极限传输速度就
  • dockerfile配置运行

  • 气压计高度融合—卡尔曼滤波

    实验平台 xff1a 自制飞控板 xff0c STM32F407主控 xff0c 传感器 xff1a MPU6050 MS5611 正文 xff1a 前几天看了这篇文章 xff0c 做了气压计的高度融合 http www zxiazai c
  • GD32F303移植FreeRTOS

    GD32F303移植FreeRTOS 一 移植环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a
  • FreeRTOS静态创建任务

    一 静态方式创建任务和删除任务 1 gt 测试环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a
  • python实现smote处理正负样本失衡问题

    机器学习中难免遇到正负样本不平衡问题 xff0c 处理办法通常有梁总 xff0c 一 xff1a 过采样 xff0c 增加正样本数据 xff1b 二 xff1a 欠采样 xff0c 减少负样本数据 xff0c 缺点是会丢失一些重要信息 sm
  • echarts 饼图hover效果,饼图中间显示自定义信息

    option 61 tooltip show true trigger 39 item 39 position 39 35 39 39 32 39 backgroundColor 39 implements 39 textStyle col
  • MATLAB在线工具

    在线Matlab工具 xff0c 不用安装matlab了 xff0c 里面的语法几乎和matlab相同 matlab网页版 xff1a 1 octave online http octave online net 2 matlab onli
  • Apache IoTDB下载与安装

    1 中文官方文档 xff1a https iotdb apache org zh 2 下载地址 xff1a https iotdb apache org zh Download 发行版本踩了个小坑 xff1a 1 0 0版本启动时如果作为单
  • 【游戏开发】游戏开发书籍汇总

    1 游戏设计的艺术 2 游戏设计的100个原理 3 我在美国学游戏设计 4 游戏新手村 xff1a 从零开始做游戏 5 Directx游戏开发终极指南 6 Windows游戏编程大师技巧 7 快乐之道 xff1a 游戏设计的黄金法则 人类的
  • 【获奖公布】“我的2016”主题征文活动

    还记得2015的年末 xff0c 2016的新年伊始 xff0c 你给自己定下的目标 xff0c 对自己许下的诺言么 xff1f 时光荏苒 xff0c 一年又在指缝间溜走了 xff0c 离2016的结束还剩十多天 xff0c 在接下来的这十
  • Dockerfile介绍与指令解析

    一 Dockerfile介绍 镜像是容器的基础 xff0c 每次执行docker run的时候都会指定哪个镜像作为容器运行的基础 我们之前的例子都是使用来自docker hub的镜像 xff0c 直接使用这些镜像只能满足一定的需求 xff0
  • Kubernetes快速上手指南,让你所见即所得

    版权声明 xff1a 本文为 ABC实验室 原创文章 xff0c 版权所有 xff0c 侵权必究 xff01 编者语 Kubernetes作为新一代云计算平台 xff0c 自2014年开源以来得到快速发展 xff08 2016年 xff09
  • 使用github管理科研文献

    使用github管理科研文献 一 准备工作 xff1a 二 建立远程科研文献库三 远程科研文献数据库的维护四 其他PC客户端的访问 每个科研工作者都需要建立自己的科研文献库 以楼主本人为例 xff0c 我通常在实验室的台式机上完成科研文献的
  • RBF神经网络逼近在线自适应控制(MATLAB实现之S函数模块分析)

    上次用了参考模型的方法用RBF神经网络试了一下放到自适应控制模型上 xff0c 其实跟踪效果还可以 xff0c 放大了有点不舒服就是了 xff0c 差了一点点 xff0c 然后看了看书的第四章 xff0c 知道采用梯度下降法调整神经网络权值
  • 基于RBF神经网络的Flexible Robot自适应控制(论文笔记)

    上一篇笔记 https blog csdn net qq 24182661 记录的是第一篇论文2015 Continuum Robots for Medical Applications A survey的论文笔记 xff0c 主要做的笔记
  • Golang 解析xml文件标签带冒号( : )解决方案

    背景 xff1a 我们有项目需要使用golang语言解析rabbitmq xml 并把里面的内容解析出来 xff0c 但是在解析的时候遇到了问题 xff0c 最后通过google搜索 xff0c 在stackoverflow上找到了解决方案
  • 【Python】Python中 在函数内部对函数外的变量进行操作

    在Python中 xff0c 如果想函数内部对函数外的变量进行操作 xff0c 有一些问题 xff08 一些在Java xff0c C中再正常不过的操作这里就不行 xff09 正常情况下 xff0c 在函数外定义的变量是可以直接在函数体内部

随机推荐

  • 关于proteus中串口发送数据与实际不符的问题(如发00h,收80h)

    工程实训要用到串口 xff0c 51单片机 xff0c 串口工作方式一 xff0c 只发不接受 在proteus中用VIRTUAL TERMINAL xff08 虚拟终端 xff09 监视串口发送数据 现象 xff1a 不论是用虚拟终端还是
  • Jetson TX2的各种坑.md

    最近在使用Jetson TX2 在跑实验 xff0c 然后遇到下面问题 xff0c 做笔记 xff0c 记录一下 内存出错无法 xff0c 中断 出现下面那种错误 2019 01 11 19 41 46 959970 E tensorflo
  • 基于STM32的FreeRTOS开发(1)----FreeRTOS简介

    为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统 xff0c 它主要用于嵌入式系统 它非常轻量级 xff0c 可以在很小的硬件资源上运行 xff0c 因此非常适合在限制硬件资源的嵌入式系统中使用 FreeRTOS
  • 获奖公布 | 征文——从高考到程序员

    每年的这几天 xff0c 空气中总会弥漫着紧张的味道 xff0c 2017 全国统一高考如期而至 朋友圈里的各种高考热文如流水般 xff0c 不停歇地出现在眼前 xff0c 难免会勾起自己曾经的青涩时光 还记得 xff0c 考试前 xff0
  • STM32驱动ESP8266连接阿里云(2)----接入阿里IoT Studio实现Web可视化

    烧录MQTT固件 概述 阿里IoT Studio是一个物联网开发平台 xff0c 可用于快速构建基于云端的物联网应用 它提供了丰富的物联网组件和工具 xff0c 使得开发者可以轻松地进行设备接入 数据存储 数据分析等操作 要实现Web可视化
  • ‘gbk‘ codec can‘t encode character解决方法

    一 问题 xff1a 在将网络数据流导入文件时 xff0c 有可能遇到 39 gbk 39 codec can 39 t encode characte 错误 二 分析 xff1a 1 在windows下面 xff0c 新文件 xff08
  • ROS中的tf(transform)的理解 ,你追我小乌龟的深入剖析

    对于ros中的tf其实一直理解不是很深 xff0c 最近工作上一直在用 xff0c 就很懵逼 xff0c 出来混果然是要还的 xff5e 于是这两天把ros官方提供的小乌龟版的你追我 xff0c 如果你追到我 xff0c 我就让你xxx x
  • 线程同步之信号量(sem_init,sem_post,sem_wait)

    信号量和互斥锁 mutex 的区别 xff1a 互斥锁只允许一个线程进入临界区 xff0c 而信号量允许多个线程同时进入临界区 不多做解释 xff0c 要使用信号量同步 xff0c 需要包含头文件semaphore h 主要用到的函数 xf
  • 老程序员给的10条建议,句句经典

    1 想清楚 xff0c 再动手写代码 刚入行的新手 xff0c 为了展示自己的能力 xff0c 拿到需求迫不及待地就开始上手写代码 xff0c 大忌 xff01 2 不交流 xff0c 就会头破血流 不爱说话和沟通 xff0c 需求都理解错
  • Clickhouse快速上手 原理篇

    1 背景 公司目前使用Greenplum作为报表实时聚合查询的OLAP数据库 xff0c 当时主要是其使用门槛相对较低 xff0c 同时支持事务 xff0c 能在用户访问时候事务更新数据 xff0c 使用云厂商的产品 xff0c 技术支持也
  • Clickhouse快速上手 使用篇

    接着clickhouse原理篇 xff0c 下面来介绍他的具体使用场景 xff0c 包括数据导入 xff0c 更新等 文章目录 1 数据导入调研计划实施1 cos文件系统集成2 编码获取 2 数据更新和使用 1 数据导入 根据官方介绍 Cl
  • linux基本服务之sshd

    这段时间在学习linux常用服务 xff0c 这里将学习内容以及自己的实验心得记录下来 在自己忘记的时候也好复习 实验环境 xff1a centos 6 7 64bit 1 简介 SSHD服务 介绍 xff1a SSH协议 xff1a 安全
  • Git+VSCode基本使用

    前言 由于工作需要 xff0c 最近简单学习了git xff0c 巧合发现了VSCODE编辑器正好集成了git命令 xff0c 使得本地代码管理变得更加容易 因为最后是在linux下交叉编译 xff0c 但是我更习惯windows下写代码
  • 掌握音频开发基础知识

    文章目录 基本概念几种CODEC介绍实时调度相关缓冲区两种类型编写要点遇到的问题 解码能力的自适应混音模块回声消除的延时控制能量统计双声道支持ALSA设备 代码相关 基本概念 采样率 Hz 每秒去取样本的个数 xff0c eg 48000H
  • CSDN日报20170616 ——《从裁缝到码农》

    程序人生 从裁缝到码农 作者 xff1a 修电脑的裁缝酱 我伸出颤抖的手去抓 xff0c 发现曾经遥不可及的梦想 xff0c 经过坚持和努力之后 xff0c 真的可以抓住 我把它抓在手心 xff0c 紧紧地 点击阅读全文 机器学习 一文了解
  • Java中char类型详解

    1 基本定义 char类型的值可以表示为十六进制值 xff0c 其范围从 u0000 到 uffff xff0c 由两个字节构成 char类型原本用于表示单个字符 xff0c 但是现在情况有所变化 xff0c 有些Unicode字符需要一个
  • Git命令行简单使用小结

    最近复习了一下git 总结了一下命令行的基本使用 0 基本理论 a 基本概念 Working Directory 就是平时存放项目代码的地方 Stage Index 用于临时存放改动 事实上他只是一个文件 保存即将提交的文件列表信息 Rep
  • 无外接环境下,单笔记本直连浪潮服务器BMC灌装系统

    1 环境因素 xff1a 单服务器无网络无显示器等外接 xff0c 需要对浪潮防火墙灌装系统 xff1b 2 所需材料 xff1a 1 浪潮服务器 2 可接网线笔记本电脑 xff08 Windows平台 xff09 3 网线一根 3 连接拓
  • python抽样方法详解及实现

    抽样方法概览 随机抽样 总体个数较少 每个抽样单元被抽中的概率相同 xff0c 并且可以重现 随机抽样常常用于总体个数较少时 xff0c 它的主要特征是从总体中逐个抽取 1 抽签法 2 随机数法 xff1a 随机数表 随机数骰子或计算机产生
  • ROS 1.0 学习笔记(6)CMakeLists.txt 使用说明

    ROS1中每个PKG的配置都是在CMakeList txt中 xff0c 本文从官方 WiKi 资料中翻译而来 1 概览 文件CMakeLists txt是CMake编译系统的配置文件 xff0c 用于配置需要编译软件包 任何兼容CMake