3_ROS创建工作空间和功能包

2023-05-16

3_ROS创建工作空间和功能包

前面我们讲解了ROS中的核心概念和使用ROS进行开发时候必须用到的命令行工具

下面我们就正式开始ROS中的开发,我们首先从创建工作空间和功能包开始

1.工作空间WorkSpace

工作空间是ROS中非常重要的概念,我们进行开发首先就需要明白什么是工作空间,然后才能进行开发

什么是工作空间?

我们通常称当前开发的项目为一个工程
举例来说,加入我们现在要制作一个APP,那么这个APP的制作就是一个工程

工作空间指的是存放工程开发相关文件的文件夹,其中包含了工程的所有内容,例如源代码,图标文件等等
同样,在ROS中,我们所有的源码,所有的可执行文件都放在工作空间中

编译系统

通常来说,一个可执行文件的生成需要两步: 编译和链接

编译指的是将本质是文本的源代码编译成可以重定向的二进制文件,想到与最终可执行文件的部分
链接指的是将不同的可重定向二进制文件按照顺序链接在一起,最终生成可执行的二进制文件

编译并不是生成的难点,链接才是生成的难点

我们最初在学编程时候编写的代码由于很少,因此很容易就能进行链接,而且往往只有几个可重定向的二进制文件

但是随着能力的提升,我们开发的项目也越来越大,这个时候想要编译完整的项目可能需要链接高达几百甚至上千的可重定向二进制文件
而且所有的可重定向二进制文件之间的逻辑关系不能乱,必须按照顺序依次链接
例如A依赖于B,那么就要先链接B再链接A

这个时候我们如果不对源代码进行规划的话在编译的时候就会很难受,因此我们在工程开始之前就规定好项目的文件夹划分,使得内容不乱套.

make编译系统

前面讲到大工程的链接问题,实际上为了解决链接时候困难,Linux中提供了make命令

在开发一个系统时,一般是将一个系统分成几个模块,这样做提高了系统的可维护性,但由于各个模块间不可避免存在关联,所以当一个模块改动后,其他模块也许会有所更新,当然对小系统来说,手工编译连接是没问题,但是如果是一个大系统,存在很多个模块,那么手工编译的方法就不适用了。为此,在Linux系统中,专门提供了一个make命令来自动维护目标文件,与手工编译和连接相比,make命令的优点在于他只更新修改过的文件(在Linux中,一个文件被创建或更新后有一个最后修改时间,make命令就是通过这个最后修改时间来判断此文件是否被修改),而对没修改的文件则置之不理,并且make命令不会漏掉一个需要更新的文件。

文件和文件间或模块或模块间有可能存在倚赖关系,make命令也是依据这种依赖关系来进行维护的,所以我们有必要了解什么是依赖关系;make命令当然不会自己知道这些依赖关系,而需要程序员将这些依赖关系写入一个叫Makefile的文件中。Makefile文件中包含着一些目标,通常目标就是文件名,对每一个目标,提供了实现这个目标的一组命令以及和这个目标有依赖关系的其他目标或文件名。

Cmake编译系统

尽管make命令很好用,但是随着项目的增大,我们编写makefile的难度也会越来越大,因此要不断地编写模块之间的依赖关系,为此产生了Cmake工具. Cmake可以帮助我们输出makefile文件,然后我们再使用make命令编译.我们只需要简单的语句就能够描述编译过程

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处

所以我们在Linux平台下使用cmake的流程如下:

  1. 编写Cmake配置文件CmakeList.txt
  2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目录
  3. 使用make命令进行编译

Catkin编译系统

ROS中使用Catkin编译系统,Catkin编译系统实际上集成了Cmake和make的功能,只需要一条命令就能够生成可执行文件

在进行机器人开发的时候通常一个功能包会有很多依赖,使用Catkin编译系统就能够很轻松的进行编译

Catkin的工作流程

Catkin的工作流程如下

在这里插入图片描述

Catkin的工作条件

Catkin在编译的时候必须具备两个条件

  1. 描述包的xml文件 : package.xml
  2. 构建package的Camke文件 : Cmakelist.txt

Catkin的工作原理

  1. 首先在当前工作空间下 (具体是catkin_ws/src) 递归查找所有的ROS Package
  2. 由于每个Package中都会有package.xml和CamkeLists.txt, Catkin依据这两个文件生成Makefile.txt文件,放在catkin_ws/build文件夹下
  3. 根据生成的Makefile文件生成可执行文件,放在catkin_ws/devel

catkin_ws, catkin_ws/src, catkin_ws/build, catkin_ws/devel具体干什么用的文件夹,将在后面给出

ROS工作空间的结构

ROS中的工作空间下存在四个文件夹,作用如下

  • src : 代码空间, Source Space. 其中存放着源代码,配置文件,lauch文件等文件
  • build : 编译空间, Build Space. 其中存放着编译过程中产生的中间文件,例如动态链接库和静态链接库等等
  • devel : 开发空间, Development Space. 其中存放着编译完成之后生成的可执行文件,包括一些库和脚本
  • install : 安装空间, Install Space. 其中存放着我们安装的一些第三方命令

注意,devel和intall其实有很多内容重复了,因此在ROS2中对这两个文件进行了修改,去掉了devel,只剩下install

ROS整个工作空间的结果如下: (我们一般称当前的工作空间名字为catkin_ws,实际上名字无所谓,可以随便换)

在这里插入图片描述

创建工作空间

ROS中创建工作空间通常包含如下几步: 1.初始化工作空间 2.编译工作空间 3.设置环境变量 4.检查环境变量

初始化工作空间

初始化工作空间我们首先需要创建工程项目文件夹,然后在src中运行catkin_init_workspace命令

mkdir -p 工作空间名/src
cd 工作空间名/src
catkin_init_workspace

在这里插入图片描述

编译工作空间

我们在src目录下编写完代码之后想要进行编译,我们首先需要回到主文件夹,然后执行catkin_make命令

cd ~/catkin_ws/
catkin_make

在这里插入图片描述

编译成功之后,就会生成build和devel文件夹,并且在src下会出现一个CmakeLists.txt文件

在这里插入图片描述

由于我们的Src里什么都没有,因此我们编译之后得到的实际上是空的文件夹

我们这里只得到了三个文件夹,如果我们想要得到install文件夹,需要运行catkin_make intall命令

在这里插入图片描述

设置环境变量

这点在后面功能包讲

检查环境变量

这点也在后面功能包将

2.功能包Package

ROS中我们的开发代码不能直接放在src文件夹下,而是必须以功能包的形式存在,因此我们还需要掌握创建功能包的方法

ROS功能包的结构

一个创建好的ROS功能包的结构如下

在这里插入图片描述

创建功能包

我们需要在src目录下使用catkin_create命令来创建功能包,命令的一般格式如下,其中的depend是指定依赖的其他功能包,通常我们编写功能包的时候都会依赖ROS自带的C++/Python接口,因此我们都会加上ROS的C++和Python功能包, 此外我们自己的功能包通常需要发布message,因此我们也需要依赖ROS自带的message接口

catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

下面我们创建一个功能包试试

jack@ubuntu:~/myFirstRosProject$ cd src/
jack@ubuntu:~/myFirstRosProject/src$ catkin_create_pkg firstpackage rospy roscpp

在这里插入图片描述

我们能看到,成功创建之后src文件夹下就多出来我们创建的功能包,我们进入这个Package

编译功能包

我们上面成功创建了一个功能包,接下来我们要去编译这个功能包,我们其实就是在主文件下调用catkin_make命令来进行编译

我们上面讲过,catkin集成了camke和make,因此可以只对这一个修改过了的功能包进行编译

具体步骤又分为编译和重新初始化环境变量两步

cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

我们对上面的例子进行编译,结果如下

在这里插入图片描述

第二步重新初始化环境变量的目的是使我们刚编译的功能包能够被查找到,即在当前功能包的路径在环境变量中
我们可以使用echo命令获取下ROS_PACKAGE_PATH这个环境变量的值

echo $ROS_PACKAGE_PATH

在这里插入图片描述

查询功能包的依赖

我们实际上具有两种方式进行查询,第一种通过命令,第二种通过Package.xml文件,这里只讲第一种方式,第二种后面会讲

我们通常是用rospack depends和rospackdepends1命令来进行查询,后面接要查询的包名

rospack depends

rospack depends用于查询某个功能的所有依赖

我们这里查询下我们刚才创建的功能包

rospack depends firstpackage

在这里插入图片描述

我们能看到,实际上在创建一个功能包的时候ROS自动会为其添加一些默认依赖

rospack depends1

rospack depends1用于查询我们在创建的时候指定的依赖

rospack depends1 firstpackage

在这里插入图片描述

3.Package.xml文件的结构

我们上面创建了工作空间和功能包,接下来我们需要了解下Package.xml文件的具体结构

一个完整的Package.xml如下

<package format="2">
	<name>firstpackage</name>
	<version>0.0.0</version>
	<description>The firstpackage package</description>
	<!--  One maintainer tag required, multiple allowed, one person per tag  -->
	<!--  Example:   -->
	<!--  <maintainer email="jane.doe@example.com">Jane Doe</maintainer>  -->
	<maintainer email="jack@todo.todo">jack</maintainer>
	<!--  One license tag required, multiple allowed, one license per tag  -->
	<!--  Commonly used license strings:  -->
	<!--    BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3  -->
	<license>TODO</license>
	<!--  Url tags are optional, but multiple are allowed, one per tag  -->
	<!--  Optional attribute type can be: website, bugtracker, or repository  -->
	<!--  Example:  -->
	<!--  <url type="website">http://wiki.ros.org/firstpackage</url>  -->
	<!--  Author tags are optional, multiple are allowed, one per tag  -->
	<!--  Authors do not have to be maintainers, but could be  -->
	<!--  Example:  -->
	<!--  <author email="jane.doe@example.com">Jane Doe</author>  -->
	<!--  The *depend tags are used to specify dependencies  -->
	<!--  Dependencies can be catkin packages or system dependencies  -->
	<!--  Examples:  -->
	<!--  Use depend as a shortcut for packages that are both build and exec dependencies  -->
	<!--    <depend>roscpp</depend>  -->
	<!--    Note that this is equivalent to the following:  -->
	<!--    <build_depend>roscpp</build_depend>  -->
	<!--    <exec_depend>roscpp</exec_depend>  -->
	<!--  Use build_depend for packages you need at compile time:  -->
	<!--    <build_depend>message_generation</build_depend>  -->
	<!--  Use build_export_depend for packages you need in order to build against this package:  -->
	<!--    <build_export_depend>message_generation</build_export_depend>  -->
	<!--  Use buildtool_depend for build tool packages:  -->
	<!--    <buildtool_depend>catkin</buildtool_depend>  -->
	<!--  Use exec_depend for packages you need at runtime:  -->
	<!--    <exec_depend>message_runtime</exec_depend>  -->
	<!--  Use test_depend for packages you need only for testing:  -->
	<!--    <test_depend>gtest</test_depend>  -->
	<!--  Use doc_depend for packages you need only for building documentation:  -->
	<!--    <doc_depend>doxygen</doc_depend>  -->
	<buildtool_depend>catkin</buildtool_depend>
	<build_depend>roscpp</build_depend>
	<build_depend>rospy</build_depend>
	<build_depend>std_msgs</build_depend>
	<build_export_depend>roscpp</build_export_depend>
	<build_export_depend>rospy</build_export_depend>
	<build_export_depend>std_msgs</build_export_depend>
	<exec_depend>roscpp</exec_depend>
	<exec_depend>rospy</exec_depend>
	<exec_depend>std_msgs</exec_depend>
	<!--  The export tag contains other, unspecified, tags  -->
	<export>
		<!--  Other tools can request additional information be placed here  -->
	</export>
</package>

去掉所有注释后内容如下

<package format="2">
	<!-- 包名 -->
	<name>firstpackage</name>	
    <!-- 版本号 -->
	<version>0.0.0</version>
    <!-- 包的描述信息 -->
	<description>The firstpackage package</description>
    <!-- 作者信息 -->
	<maintainer email="jack@todo.todo">jack</maintainer>
    <!-- 包的许可证信息 -->
	<license>TODO</license>
		
    <!-- 包所有的依赖 -->
	<buildtool_depend>catkin</buildtool_depend>
	<build_depend>roscpp</build_depend>
	<build_depend>rospy</build_depend>
	<build_depend>std_msgs</build_depend>
    
	<build_export_depend>roscpp</build_export_depend>
	<build_export_depend>rospy</build_export_depend>
	<build_export_depend>std_msgs</build_export_depend>

	<exec_depend>roscpp</exec_depend>
	<exec_depend>rospy</exec_depend>
	<exec_depend>std_msgs</exec_depend>

	<export>
		<!--  Other tools can request additional information be placed here  -->
	</export>
</package>

4.CmakeLists.txt文件的结构

一个完整的CmakeList.txt文件的结构如下

其中的内容是用Cmake的语法编写的

貌似CSDN的markdown不支持makefile的语法高亮,所以我下面用的是c语言的高亮,首先要指明的是在cmake中#后面的都是注释,大概浏览下之后就跳到后面去看具体的解释

cmake_minimum_required(VERSION 3.0.2)
project(firstpackage)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
##   * add a build_depend tag for "message_generation"
##   * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
##     but can be declared for certainty nonetheless:
##     * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
##   * add "message_generation" and every package in MSG_DEP_SET to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * add "message_runtime" and every package in MSG_DEP_SET to
##     catkin_package(CATKIN_DEPENDS ...)
##   * uncomment the add_*_files sections below as needed
##     and list every .msg/.srv/.action file to be processed
##   * uncomment the generate_messages entry below
##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## Generate services in the 'srv' folder
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## Generate actions in the 'action' folder
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################

## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
##   * add "dynamic_reconfigure" to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * uncomment the "generate_dynamic_reconfigure_options" section below
##     and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES firstpackage
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

## Declare a C++ library
# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/firstpackage.cpp
# )

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/firstpackage_node.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# catkin_install_python(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
# install(TARGETS ${PROJECT_NAME}_node
#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark libraries for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
# install(TARGETS ${PROJECT_NAME}
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )

## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
#   FILES_MATCHING PATTERN "*.h"
#   PATTERN ".svn" EXCLUDE
# )

## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_firstpackage.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

我们下面说明其中的部分内容的作用

#说明:Cmake语法中,命令名字不区分大小写,但参数和变量有区分。

cmake_minimum_required(VERSION 2.6)	#声明需求的cmake最低版本
project(ProjName)	#项目名称:非强制性,但最好加上
set(SRC_LIST main.c hello.c)	#用来设置变量:把main.c和hello.c路径传递给变量

add_executable(ProjName FileName.cxx)	#告诉工程生成一个可执行文件,目标文件
add_library(LibName STATIC FileName.cxx)	#告诉工程生成一个静态[STATIC]库文件,目标文件;动态库的话[SHARED]即可

find_package(VTK REQUIRED)	#可以找到库文件的绝对路径

include_directories()	#指明头文件所在的路径
add_subdirectory()	#去子目录寻找新的CMakeList.txt子文件
link_directories()	#指定要链接的库文件的路径
target_link_libraries()	#将目标文件与库文件进行链接,链接静态库所依赖的库
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3_ROS创建工作空间和功能包 的相关文章

  • 蓝桥杯模块练习之AD/DA

    蓝桥杯单片机比赛系列6AD DA转换 AD DA原理相关电路pcf8591器件地址 代码解释修改代码AD自写代码ADDA AD DA原理 相关电路 通过pcf8591芯片实现ad转换 板子上ad采集主要采集滑动变阻器的电压值和与光敏电阻串联
  • 蓝桥杯模块练习之EEPROM

    蓝桥杯单片机比赛系列7EEPROM EEPROM原理相关电路AT24C02器件地址 EEPROM自写代码 EEPROM原理 相关电路 有了系列6的基础 xff0c 上手eeprom就简单多了 xff0c 板子上对应的器件是AT24C02 A
  • Openmv学习day1——色块识别

    find blobs函数 image find blobs thresholds roi 61 Auto x stride 61 2 y stride 61 1 invert 61 False area threshold 61 10 pi
  • 蓝桥杯嵌入式模块练习之扩展版MEME

    三轴传感器 PA4 7都不能作为其他用处 xff0c 三周传感器需要使用到这四个引脚资源 当然 xff0c 如果不用中断 xff0c 也可以只结PA4 5 xff0c PA6 7可接到温度传感器和温湿度传感器 这个外设的通信协议也是I2C跟
  • Github Pages 搭建网站

    个人站点 访问 https 用户名 gitub io 搭建步骤 1 创建个人站点 gt 新建仓库 xff08 仓库名必须是 用户名 github io xff09 2 在仓库下新建index heml文件即可 3 Github pages仅
  • 普通io口模拟串口通信

    之前公司在做项目的时候需要用到多串口 xff0c 板载串口资源不足 xff0c 就在网上找相关内容 xff0c 结合自己的理解做出虚拟串口 模拟串口需要用到两个普通io引脚 xff0c 一个定时器 软件串口的实现 IO模拟串口 波特率 xf
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • kvaser pcie can 在ros中使用socketcan开发

    kvaser pcie can 在ros中使用socketcan开发 0 系统配置 Ubuntu 16 04 6 LTS Linux version 4 15 0 45 generic 1 官网下载地址 https www kvaser c
  • 算法训练 - 连接字符串 编程将两个字符串连接起来。例如country与side相连接成为countryside。   输入两行,每行一个字符串(只包含小写字母,长度不超过100);输出一行一个字符

    问题描述 编程将两个字符串连接起来 例如country与side相连接成为countryside 输入两行 xff0c 每行一个字符串 xff08 只包含小写字母 xff0c 长度不超过100 xff09 xff1b 输出一行一个字符串 例
  • 笔记 FreeRtos任务创建失败原因

    问题 使用NXP的S32芯片开发 xff0c 环境是S32DS 2018 xff0c 创建了三个任务 xff0c 最后发现只有一个任务在运行 找问题 S32DS自带了Freertos的分析调试工具 xff0c 打开后可以显示任务的状态 xf
  • 3.提升不同专业能力的差别?

    有段时间没写博客了 今天来谈谈最近工作的一些感悟 首先 我觉得工资和个人能力是成正相关的 这应该是是所有人都认同的吧 如果工资是一个函数的话 也可以说 工资 Y 是一个与个人能力 X 有关的一次函数Y aX b 方然我们不能忽略行业之间的差
  • 网络通讯学习(1)---TCP通讯

    TCP IP四层模型 UDP TCP协议 TCP xff08 The Transmission Control Protocol xff09 xff1a 传输控制协议 UDP TCP协议都属于传输层协议 xff0c 都位于IP协议以上 xf
  • 网络通讯学习(3)-----UDP通讯(仅了解)

    理论 UDP xff08 用户数据报协议 xff09 是一个无连接 xff0c 不可靠的数据传输 xff0c 其特点是简单 xff0c 快捷 相比与TCP xff0c UDP不需要建立连接 xff08 不需connect accept函数
  • WIFI模块不支持MQTT协议,可通过MCU实现

    1 话题原因 我们使用某款WIFI模块 xff0c 在物联网开发时 xff0c 平台端的开发者想要使用MQTT协议 xff0c 但是我们当前使用的模块不支持MQTT协议 xff08 好像ESP8266可以通过重新烧录固件的方式支持 xff0
  • (一) 路径规划算法---Astar与C++可视化在RVIZ的三维点云地图

    Astar与C 43 43 可视化在RVIZ的三维点云地图 文章目录 Astar与C 43 43 可视化在RVIZ的三维点云地图1 功能包介绍2 算法功能包的组成与介绍2 1文件系统组成2 2 头文件说明2 3 源文件说明 3 相关坐标系说
  • SpringSecurity整合OAuth2.0

    SpringSecurity整合OAuth2 一 概述与原理1 1 OAuth2 0 是什么 xff1f 1 2 OAuth2 0中角色解释1 3 OAuth2 0的4中授权模式1 3 1 授权码模式 xff08 重点 xff09 1 3
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数

    目录 前言1 UART Receive IT2 HAL UART Receive3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • 位操作读写寄存器一个字节的多个位

    一 写寄存器多个位 方法一 span class token comment bitStart 目标字节的起始位 length 位长度 data 存放改变目标字节位的值 b 写入后的一个字节值 span u8 mask
  • STM32 电压采集上位机 C#

    工具箱中添加progressBar 添加一个事件函数 xff0c 用于串口接收数据 xff0c 并显示电压值 private void PortDataReceivedEvent object sender SerialDataReceiv
  • cmake使用教程(一)多目录下多个文件的构建

    1 采用 out of source 外部构建多个目录多个文件 这里的文件存储方式如下 xff1a 其中build是构建目录 xff0c 即构建的结果和中间产物都在该目录下 include是包含目录 src是子函数的目录或是依赖文件的目录

随机推荐

  • vue 实现遍历后端接口数据并展示在表格中

    用前端的vue遍历接口 首先就需要有后端的JSON数据 这里可以自己去写接口 可以伪造JSON数据 整理是伪造的JSON数据 34 userId 34 1 34 deptId 34 103 34 userName 34 34 admin 3
  • STM32的存储器映射中的指针操作

    例如 xff1a GPIOB的端口输出数据寄存器ODR的地址是0x4001 0C0C 并且ODR寄存器是32位的 那么我们可以用如下代码对寄存器进行操作 xff1a unsigned int 0x4001 0C0C 61 0xFFFFFFF
  • Mac 启动Redis报错 没有指定的conf文件

    报错如下 xff1a Warning no config file specified span class token punctuation span span class token keyword using span the de
  • java 优化双重for循环

    首先我们要有两个对象分别是 学生信息 和 学生住宿信息 span class token keyword class span span class token class name Student span span class toke
  • 微服务 - gateway网关配置

    server port 10010 网关端口 spring application name gateway 服务名称 cloud nacos server addr localhost 8848 nacos地址 gateway route
  • 如何在手机或平板上编写代码?

    下面给大家推荐一款免费的 在线协作式 基于浏览器的 IDE的在线编程网站 支持语言包括 Java C 43 43 C C JavaScript CSS PHP等50多种主流开发语言 地址 The collaborative browser
  • 羊了个羊, 低配版开源代码来啦~

    前几天朋友圈突然被一个小游戏 羊了个羊 刷屏了 xff0c 出于好奇我也打算小玩一把试试 xff0c 结果没想到上头了 游戏的玩法非常简单 xff0c 类似 消消乐 xff0c 从一堆方块中找到相同图案的 3 个方块并消除即可 但没想到 x
  • MySQL 使用索引和不使用索引的区别(附17W条数据SQL文件)

    MySQL 使用索引可以减少查询的时间 xff0c 而不使用索引的查询会更加耗时 xff0c 因为MySQL需要扫描整个表 此外 xff0c 使用索引可以提高查询的性能 xff0c 同时也可以提高查询的可读性和可维护性 换句话来说 使用索引
  • 如何使用AI来帮你写代码(Cursor使用教程)

    x1f4ac 产品介绍 cursor是一个新的Ide xff0c 它使用Ai来帮助您重构理解调试并使用Cursor编写代码我们的目标是使构建软件的过程更快 更愉快 我们从头开始构建了一个代码编辑器 xff0c 对我们的第一个功能进行了原型设
  • [Java多线程-基础] 如何定位线程中的死锁问题?

    x1f512 死锁代码 下面提供的代码演示了死锁的情况 程序创建了两个线程 xff0c 线程1和线程2 xff0c 它们都试图以不同的顺序获取两个不同的资源 xff0c resource1和resource2 线程1首先获取resource
  • [Java多线程-基础] 避免线程死锁问题(ReentrantLock的使用)

    ReentrantLock 的设计初衷是为了提供一种比 synchronized 更加灵活和可控的锁机制 与 synchronized 相比 xff0c ReentrantLock 提供了更多的功能 xff0c 如可重入性 公平锁和中断锁等
  • IDEA插件:智能代码生成器,附带注释和性能/安全检测功能

    x1f680 1 安装插件 在插件中搜索关键字 biot 点击安装 x1f680 2 代码生成 右侧的侧边栏点击biot后 在下方的输入框中输入你要问的内容 x1f680 3 biot AI 选中选区中的代码 点击鼠标右键让ai来帮你改代码
  • 安装Windows Server 2016 服务器 标准版

    注意事项 xff1a 安装带桌面版的 管理员密码设置 xff0c 要 注意大小写加数字 xff0c 不然会设置失败 安装文件下载 xff1a MSDN 我告诉你 PE U盘 微PE 服务器的驱动 xff0c 可以自己到对应服务器厂家的官网上
  • 第五节:基于Pytorch的相关可视化

    第五节 xff1a 基于Pytorch的相关可视化 在Pytorch发布后 xff0c 网络及训练过程的可视化工具也相应的被开发出来来帮助用户监督所建立的模型的结构和训练过程 本章将讲解HiddenLayer库 xff0c HiddenLa
  • 第六节:Pytorch实现全连接神经网络

    第六节 xff1a Pytorch实现全连接神经网络 前面的五节中 xff0c 我们讲解了使用PyTorch搭建一个神经网络中需要的需要各种技巧 xff0c 包括 xff1a 网络的搭建 选择不同的实践技巧 xff08 优化器选择 学习率下
  • 使用Visual Studio Code开发Arduino踩坑日记(持续更新)

    使用Visual Studio Code开发Arduino踩坑日记 持续更新 文章目录 使用Visual Studio Code开发Arduino踩坑日记 持续更新 1 在browse path中未找到包含文件问题描述问题分析解决思路解决过
  • 小白安装Ubuntu 18.04 LTS

    文章目录 小白安装Ubuntu 18 04 LTS作者 xff1a 王仕鸿日期 xff1a 2020 10 10 前言 xff08 可跳过 xff09 Ubuntu介绍操作系统介绍Ubuntu介绍 安装Ubuntu 18 04 LTS步骤一
  • 1_ROS基础

    ROS基础 本章讲解ROS中最基础的概念 不明白这些概念是没法学懂ROS的 学习了这些概念 后面我们将通过实操来在实践的过程中进一步体会 ROS是什么 ROS Robot Operating System 机器人操作系统 是一个提供一系列程
  • 2_ROS中的命令行工具

    ROS中的命令行工具 ROS中为我们提供了丰富的命令行工具 帮助我们进行代码的编写 调试 测试 框架的搭建 数据的显示等等 大图如下 所有的命令大致可以分为四类 分别是运行相关命令 编译相关命令 包制作管理相关命令 项目创建相关命令 下面进
  • 3_ROS创建工作空间和功能包

    3 ROS创建工作空间和功能包 前面我们讲解了ROS中的核心概念和使用ROS进行开发时候必须用到的命令行工具 下面我们就正式开始ROS中的开发 我们首先从创建工作空间和功能包开始 1 工作空间WorkSpace 工作空间是ROS中非常重要的