教程为赵虚左的天地良心ROS课程:link
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:
自定义的工作空间
开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
源码
编译的基本配置
功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
配置编译规则,比如源文件、依赖项、目标文件
包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
存储python文件
存储C++源文件
头文件
消息通信格式文件
服务通信格式文件
动作格式文件
可一次性运行多个节点
配置信息
通俗的来讲,这个框架可以类比成一个现实中的例子。想象一个大厨房,这个厨房就是一个WorkSpace,一道菜就是一个package,每道菜都有不同的厨师共同去完成,比如西红柿炒鸡蛋,有打鸡蛋的师傅(用.cpp来完成),还有洗西红柿的师傅(用.py来完成),还有专门负责炒菜的师傅(用.cpp来完成),这些师傅就是一个一个的节点(Node)。
WorkSpace | package | Node |
---|---|---|
工作空间 | 功能包 | .py .cpp |
厨房 | 西红柿炒鸡蛋 | 厨师 |
其他目录下的内容后面会继续学习,当前先介绍: package.xml 与 CMakeLists.txt 这两个配置文件。
pachage.xml
这个文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。这是package里面的文件,不是类比里面所提到的package。
CMakelists.txt
文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。
两个文件的具体内容放在文章末尾。
其他的各种文件类型和功能后面逐一补充。
ROS专门提供了一些类似于Linux的命令,这些命令较之于Linux原生命令,更为简介、高效。文件操作,无外乎就是增删改查与执行等操作,接下来,我们就从这五个维度,来介绍ROS文件系统的一些常用命令。
增
catkin_create_pkg 自定义包名 依赖包 创建新的ROS功能包(这一步可以使用vscode简化操作)
sudo apt install xxx 安装 ROS功能包
删
sudo apt purge xxx 删除某个功能包
改
rosed 包名 文件名 修改功能包文件
需要安装 vim 比如:rosed turtlesim Color.msg
查
rospack list 列出所有功能包
rospack find 包名 查找某个功能包是否存在,如果存在返回安装路径
roscd 包名 进入某个功能包
rosls 包名 列出某个包下的文件
apt search xxx 搜索某个功能包
执行
5.1 roscore
roscore === 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。roscore 将启动:
ros master
ros 参数服务器
rosout 日志节点
用法:
在终端直接:
roscore
或(指定端口号)
roscore -p xxxx
5.2 rosrun
运行指定的ROS节点
rosrun 包名 可执行文件名
如:
rosrun turtlesim turtlesim_node
5.3 roslaunch
执行某个包下的 launch 文件
roslaunch 包名 launch文件名
前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph。
rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分。
noetice版本,终端输入:
$ sudo apt install ros-noetic-rqt
$ sudo apt install ros-noetic-rqt-common-plugins
首先打开四个终端,每个终端各输入一行命令,会弹出如下的窗口
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rqt_graph
这里先对代码有个初步的理解
首先要清楚,turtlesim是一个功能包(package),而后面的turtlesim_node和turtle_teleop_key是节点(Node)。那么对应到类比关系中,该代码可以做如下解释:
通知(倒装句):
rosrun turtlesim turtlesim_node
去工作 西红柿炒鸡蛋 负责打鸡蛋的师傅(或者说具有打鸡蛋能力的师傅)
西红柿炒鸡蛋组的负责打鸡蛋的师傅去给我打个蛋
rosrun turtlesim turtle_teleop_key
去工作 西红柿炒鸡蛋 负责切西红柿的师傅
西红柿炒鸡蛋组负责炒菜的师傅准备切西红柿了
而中间的/turtle1/cmd_vel 代表的是通讯的话题,箭头代表信息的流向,后续再细作讲解。
1.创建ROS工作空间(有个厨房才能做饭)
Ctrl +Alt+T 启动终端:
mkdir -p xxx_ws/src(必须得有 src)
cd xxx_ws
catkin_make
例如:
mkdir -p kitchen01_ws/src
cd kitchen_ws
catkin_make
2.启动 vscode
进入 xxx_ws 启动 vscode
cd xxx_ws
code .
例如:
cd kitchen_ws
code .
3.vscode 中编译 ros
快捷键:Ctrl+Shift+B调用编译,点击catkin_make:build
最右边的设置按钮
修改.vscode/tasks.json 文件,将以下文件内容替换到 ‘task.json’ 里面
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
如此使用快捷键:Ctrl+Shift+B就可以快速编译!!!
4.创建ROS功能包(厨房里准备做菜,先做个西红柿炒鸡蛋)
选定 src 右击,点击最后一行的create catkin package
设置包名
tomato_egg
添加依赖
roscpp rospy std_msgs
5.python实现
在功能包下新建 scripts 文件夹,添加 demo01_test.py 文件。在vscode左侧scripts文件右击,点击在集成终端中打开
,添加可执行权限
chmod +x *.py
ll
#! /usr/bin/env python
"""
Python 版本的 HelloVScode,执行在控制台输出 HelloVScode
实现:
1.导包
2.初始化 ROS 节点
3.日志输出 HelloWorld
"""
import rospy # 1.导包
if __name__ == "__main__":
rospy.init_node("Hello_Vscode_p") # 2.初始化 ROS 节点
rospy.loginfo("Hello VScode, 我是 Python ....") #3.日志输出 HelloWorld
6.配置CMakeLists.txt
找到catkin_install_python,Ctrl+/打开注释,并修改文件路径如下:
catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
7.编译执行
编译:Ctrl+Shift+B
执行:
首先在终端中启动roscore
roscore
在工作空间中打开终端,输入:
source ./devel/setup.bash
rosrun tomato_egg demo01_test.py
PS:
如果不编译直接执行 python 文件,会抛出异常。
1.第一行解释器声明,可以使用绝对路径定位到 python3 的安装路径 #! /usr/bin/python3,但是不建议
2.建议使用 #!/usr/bin/env python 但是会抛出异常 : /usr/bin/env: “python”: 没有那个文件或目录
3.解决1: #!/usr/bin/env python3 直接使用 python3 但存在问题: 不兼容之前的 ROS 相关 python 实现
4.(推荐)解决2: 创建一个链接符号到 python 命令:sudo ln -s /usr/bin/python3 /usr/bin/python
附录:
CMakelists.txt
cmake_minimum_required(VERSION 3.0.2) #所需 cmake 版本
project(demo01_hello_vscode) #包名称,会被 ${PROJECT_NAME} 的方式调用
## 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
# 启动 python 模块支持
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
## 声明 ROS 消息、服务、动作... ##
################################################
## 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 ##
## 声明 ROS 动态参数配置 ##
################################################
## 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 ##
## catkin 特定配置##
###################################
## 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 demo01_hello_vscode
# 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
# 声明 C++ 库
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/demo01_hello_vscode.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
# 添加库的 cmake 目标依赖
# 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
# 声明 C++ 可执行文件
add_executable(Hello_VSCode src/Hello_VSCode.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"
#重命名c++可执行文件
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
#添加可执行文件的 cmake 目标依赖
add_dependencies(Hello_VSCode ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
#指定库、可执行文件的链接库
target_link_libraries(Hello_VSCode
${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/Hi.py
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_demo01_hello_vscode.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)
package.xml
<package format="2">
<name>demo01_hello_vscodename>
<version>0.0.0version>
<description>The demo01_hello_vscode packagedescription>
<maintainer email="[email protected]">xuzuomaintainer>
<license>TODOlicense>
<buildtool_depend>catkinbuildtool_depend>
<build_depend>roscppbuild_depend>
<build_depend>rospybuild_depend>
<build_depend>std_msgsbuild_depend>
<build_export_depend>roscppbuild_export_depend>
<build_export_depend>rospybuild_export_depend>
<build_export_depend>std_msgsbuild_export_depend>
<exec_depend>roscppexec_depend>
<exec_depend>rospyexec_depend>
<exec_depend>std_msgsexec_depend>
<export>
export>
package>