【ROS学习笔记与思考】 ROS概述与环境搭建

  • Post author:
  • Post category:其他


教程为赵虚左的天地良心ROS课程:

link



1.1 ROS架构



1.1.1 ROS文件系统

ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:

在这里插入图片描述

<WorkSpace>  自定义的工作空间
	<devel> 开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
	<build> 编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
	<src>源码
		<CMakeLists.txt> 编译的基本配置
		<package> 功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
			<CMakeLists.txt> 配置编译规则,比如源文件、依赖项、目标文件
			<package.xml> 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
			<scripts>存储python文件
			<src>存储C++源文件
			<include>头文件
			<msg>消息通信格式文件
			<srv>服务通信格式文件
			<action>动作格式文件
			<launch>可一次性运行多个节点 
			<config>配置信息

通俗的来讲,这个框架可以类比成一个现实中的例子。想象一个大厨房,这个厨房就是一个WorkSpace,一道菜就是一个package,每道菜都有不同的厨师共同去完成,比如西红柿炒鸡蛋,有打鸡蛋的师傅(用.cpp来完成),还有洗西红柿的师傅(用.py来完成),还有专门负责炒菜的师傅(用.cpp来完成),这些师傅就是一个一个的节点(Node)。

WorkSpace package Node
工作空间 功能包 .py .cpp
厨房 西红柿炒鸡蛋 厨师

其他目录下的内容后面会继续学习,当前先介绍: package.xml 与 CMakeLists.txt 这两个配置文件。


  1. pachage.xml


    这个文件定义有关

    软件包的属性

    ,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。这是package里面的文件,不是类比里面所提到的package。


  2. CMakelists.txt


    文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了

    如何构建代码

    以及

    将代码安装到何处

两个文件的具体内容放在文章末尾。

其他的各种文件类型和功能后面逐一补充。



1.1.2 ROS文件系统相关命令

ROS专门提供了一些类似于Linux的命令,这些命令较之于Linux原生命令,更为简介、高效。文件操作,无外乎就是

增删改查与执行

等操作,接下来,我们就从这五个维度,来介绍ROS文件系统的一些常用命令。

  1.  catkin_create_pkg 自定义包名 依赖包       创建新的ROS功能包(这一步可以使用vscode简化操作)
     sudo apt install xxx                    安装 ROS功能包
    
  2.  sudo apt purge xxx                      删除某个功能包
    
  3.  rosed 包名 文件名                         修改功能包文件
     需要安装 vim    比如:rosed turtlesim Color.msg
    
  4.  rospack list                             列出所有功能包
     rospack find 包名                         查找某个功能包是否存在,如果存在返回安装路径
     roscd 包名                                进入某个功能包
     rosls 包名                                列出某个包下的文件
     apt search xxx                           搜索某个功能包
    
  5. 执行

    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文件名      
    



1.1.3 ROS计算图



1. 计算图简介

前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph。

rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分。



2. 计算图安装

noetice版本,终端输入:

$ sudo apt install ros-noetic-rqt
$ sudo apt install ros-noetic-rqt-common-plugins



3. 计算图演示

首先打开四个终端,每个终端各输入一行命令,会弹出如下的窗口

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.2 VScode 相关操作



1.2.1 安装集成的ROS插件

在这里插入图片描述



1.2.1 vscode 基本使用


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

<?xml version="1.0"?>
<!-- 格式: 以前是 1,推荐使用格式 2 -->
<package format="2">
  <!-- 包名 -->
  <name>demo01_hello_vscode</name>
  <!-- 版本 -->
  <version>0.0.0</version>
  <!-- 描述信息 -->
  <description>The demo01_hello_vscode package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <!-- 维护人员 -->
  <maintainer email="xuzuo@todo.todo">xuzuo</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 -->
  <!-- 许可证信息,ROS核心组件默认 BSD -->
  <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/demo01_hello_vscode</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>



版权声明:本文为w_w_y原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。