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

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

第一章 ROS概述与环境搭建

  • 1.1 ROS架构
    • 1.1.1 ROS文件系统
    • 1.1.2 ROS文件系统相关命令
    • 1.1.3 ROS计算图
      • 1. 计算图简介
      • 2. 计算图安装
      • 3. 计算图演示
  • 1.2 VScode 相关操作
    • 1.2.1 安装集成的ROS插件
    • 1.2.1 vscode 基本使用

1.1 ROS架构

1.1.1 ROS文件系统

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

【ROS学习笔记与思考】 ROS概述与环境搭建_第1张图片

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

通俗的来讲,这个框架可以类比成一个现实中的例子。想象一个大厨房,这个厨房就是一个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

【ROS学习笔记与思考】 ROS概述与环境搭建_第2张图片

这里先对代码有个初步的理解
首先要清楚,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插件

【ROS学习笔记与思考】 ROS概述与环境搭建_第3张图片

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最右边的设置按钮

【ROS学习笔记与思考】 ROS概述与环境搭建_第4张图片

修改.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>

你可能感兴趣的:(ROS,python,人工智能)