ROS 基础

1. ROS 开发环境

1.1 安装 ROS

Installation: http://wiki.ros.org/melodic/Installation/Ubuntu
Ubuntu 20.04 Install Ros:
https://blog.csdn.net/qq_44339029/article/details/108919545
https://blog.csdn.net/weixin_45168199/article/details/106910446

pycharm ros env setting:

# sudo vi /var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.

update Exec:

[Desktop Entry]
X-SnapInstanceName=pycharm-community
Version=1.0
Type=Application
Name=PyCharm Community Edition
Icon=/snap/pycharm-community/232/bin/pycharm.png
#Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.desktop /snap/bin/pycharm-community %f
Exec=bash -i -c "env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.desktop /snap/bin/pycharm-community" %f
Comment=Python IDE for Professional Developers
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm-ce
StartupNotify=true

# Setup your sources.list
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# Set up your keys
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
   or
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
# Installation
sudo apt update
sudo apt install ros-melodic-desktop-full
apt search ros-melodic
# sudo apt install ros-melodic-PACKAGE
e.g.
sudo apt install ros-melodic-slam-gmapping

1.2 配置ROS

初始化ros开发环境:

$ echo "source/opt/ros/melodic/setup.bash" >> ~/.bashrc

$ sudo apt install python-rosdep
$ sudo apt install python-rosinstall
$ sudo apt install python-rosinstall-generator
$ sudo apt install python-wstool
$ sudo apt install build-essential

$ sudo rosdep init
$ rosdep update

解决sudo rosdep init和rosdep update的错误

安装ROS时 sudo rosdep initsudo rosdep update 报错:

ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

根本原因是无法解析 raw.githubusercontent.com

https://site.ip138.com/raw.Githubusercontent.com/
输入raw.githubusercontent.com
查询IP地址
修改 /etc/hosts 直接在终端输入
151.101.109.133 raw.githubusercontent.com

1. 工作空间 workspace

1.1 Create Workspace

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

1.2 Build Workspace

$ cd ~/catkin_ws
$ catkin_make

// 查看目录结构
$ tree -L 1 ~/catkin_ws
catkin_ws
├── build
├── devel
└── src

1.3 Init Workspace Env

$ source ~/catkin_ws/devel/setup.bash
// 查看工作空间环境变量(一层一层嵌套式的)
$ echo $/ROS_PACKAGE_PATH
/home/pi/catkin_ws/src:/opt/ros/melodic/share

2. 功能包 Package

2.1 自定义 Package

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

// Create
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_communication std_msgs rospy roscpp

// Build
$ cd ~/catkin_w
$ catkin_make

// Env
$ source ~/catkin_ws/devel/setup.bash

2.2 Ros 系统提供功能包

$ sudo apt-get install ros_melodic_ros_tutorials
$ rospack find roscpp_tutorials
/opt/ros/melodic/share/roscpp_tutorials

2.3 第三方开源 功能包

$ cd ~/catkin_ws/src
$ git clone git://github.com/ros/ros_tutorials.git
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
$ rospack find roscpp_tutorials
/home/pi/cue_ws/src/ros_tutorials/roscpp_tutorials

注意:工作空间覆盖问题
在系统和不同工作空间中,功能包是可以重名的(本例中:roscpp_tutorials)。同名时,会根据工作空间的覆盖顺序,优先选择最近工作空间里的功能包进行使用。这是开发中需要关注的。避免功能包运行在预期外的工作空间中。

3. Ros 架构

3.1 Ros 基础架构设计

图3-1 ROS 架构

通信系统: TCPROS/UDPROS

ROS 通信系统,使用 发布/订阅、客户端/服务器 等模型,实现多种通信机制的数据传输。

跨进程通信: Nodelet API

Ros Nodelet API 为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性有较高要求的应用。

ROS 机器人开发相关库:Client Library

基于通信机制之上,ROS提供了大量机器人开发相关库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。

应用层:Application Layer

在应用层,ROS需要运行一个管理者 -- Master,负责管理整个系统的正常运行。ROS 社区提供了大量机器人应用的功能包,这些功能包内的模块以节点为单位运行,以ROS标准输入输出作为接口,让开发者不需要关注模块内部的实现机制,只需要了解接口规则即可实现复用,极大的提高了工作效率。

从系统实现角度可以将ROS划分为三个层次: 开源社区、文件系统、计算图。


图3-2 从系统实现角度可以将ROS划分为三个层次

3.2 计算图

从计算图角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接。

// 计算图查看工具
$ rqt_graph

3.2.1 节点(Node)

节点(Node)是执行运行任务的进程,一个系统由多个节点构成,也可以看作是软件模块。当许多节点同时运行时,可以很方便的额将端对端的通信机制绘成节点关系图。在这个图中可以清晰看出节点(圈)和端对端的连接关系(节点间的连线)。


图3-3 ROS 中的节点关系图

3.2.2 消息(Message)

节点间通讯的通用数据结构定义的封装,可根据需求由开发者自定义。

3.2.3 话题(Topic)

消息以一种 发布/订阅(Publish/Subscribe)的方式传递。数据以广播的形式发布。这是一种单向的数据通信,发布者与订阅者之间,订阅者相互之间并不知道彼此的存在。


图3-4 ROS中基于发布/订阅模型的通信

3.2.4 服务(Service)

双向同步传输,在ROS中,采用Service。基于Client / Server模型实现。类似于Web服务,包含两部分通信数据类型:request / response。 ROS 只允许一个节点提供一个指定命名的服务。

3.2.5 节点管理器(ROS Master)

ROS Master 通过RPC调用,提供登记列表和对其他计算图表查询的功能,帮助ROS节点之间互相查找、建立连接。同时还未系统提供参数服务器,管理全局参数。ROS Master是一个管理者,没有他,节点无法找到彼此,无法交换消息或调用服务,整个系统将会瘫痪。

3.3 文件系统

参考:http://niehen.cn/ros/ros-file-system/

Catkin

对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统
CMake 是一个跨平台的安装工具,可以用最简单的语句来描述所有平台的安装,为软件跨平台创建而生。


enter description here

一个Catkin的软件包(package)必须要包括两个文件:
package.xml
CMakeLists.txt

catkin编译的工作流程如下:
1.首先在工作空间catkin_ws/src/下递归的查找其中每一个ROS的package。
2.package中会有package.xml和CMakeLists.txt文件,Catkin(CMake)编译系统依据CMakeLists.txt文件,从而生成makefiles(放在catkin_ws/build/)。
3.然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)。

也就是说,Catkin就是将cmake与make指令做了一个封装从而完成整个编译过程的工具。

初始化Catkin工作空间
输入下列指令,完成初始创建。

mkdir -p ~/catkin_ws/src  
cd ~/catkin_ws/
catkin_make #初始化工作空间

第一行代码直接创建了第二层级的文件夹src,这也是我们放ROS软件包的地方。第二行代码使得进程进入工作空间,然后再是catkin_make。

进行编译
用catkin编译一个工程或软件包,只需要用catkin_make指令,一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件.

cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
catkin_make #开始编译
source ~/catkin_ws/devel/setup.bash #刷新坏境

显示文件结构
在工作空间下用tree命令,。

cd ~/catkin_ws
sudo apt install tree
tree

通过tree命令可以看到catkin工作空间的结构,它包括了src、build、devel三个路径
src/: ROS的catkin软件包(源代码包)
build/: catkin(CMake)的缓存信息和中间文件
devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量


enter description here

平常主要用到的是src文件夹
我们写的ROS程序、网上下载的ROS源代码包都存放在这里。
在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包

package

package是catkin工作空间的基本单元,我们在ROS开发时,写好代码,然后catkin_make,系统就会完成所有编译构建的工作。

package结构

enter description here

Package可以分为二进制和源代码。
二进制包里面包括了已经编译完成,可以直接运行的程序,一般是官方给的程序,无法修改查看源代码 一般在/opt/ros/kinetic/中存放
源代码是指第三方开发的,根据需求自己下载。通常放在 ~/catkin_ws/src,需要通过make/cmake/caktin 进行编译使用,可以进行修改源代码对于编译工具软件包等有依赖问题。

package相关命令
rospack是对package管理的工具,命令的用法如下:
rostopic命令 | 作用
——— |————
rospack help | 显示rospack的用法
rospack list | 列出本机所有package
rospack depends [package] | 显示package的依赖包
rospack find [package] |定位某个package
rospack profile |刷新所有package的位置记录
以上命令如果package缺省,则默认为当前目录(如果当前目录包含package.xml)
roscd命令类似与Linux系统的cd,改进之处在于roscd可以直接cd到ROS的软件包。
rosls也可以视为Linux指令ls的改进版,可以直接lsROS软件包的内容。
rosdep是用于管理ROS package依赖项的命令行工具,用法如下
rostopic命令 | 作用
——— |————
roscd [pacakge] |cd到ROS package所在路径
rosls命令 | 作用
rosls [pacakge] | 列出pacakge下的文件
rosdep命令 | 作用
rosdep check [pacakge] |检查package的依赖是否满足
rosdep install [pacakge]| 安装pacakge的依赖
rosdep db |生成和显示依赖数据库
rosdep init |初始化/etc/ros/rosdep中的源
rosdep keys |检查package的依赖是否满足
rosdep update |更新本地的rosdep数据库
一个较常使用的命令是rosdep install –from-paths src –ignore-src –rosdistro=kinetic -y,用于安装工作空间中src路径下所有package的依赖项(由pacakge.xml文件指定)。

package.xml

包括了package的描述信息,name, description, version, maintainer(s), license,opt. authors, url’s, dependencies, plugins, etc…
实际上rospack find、rosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件
包含的标签有


enter description here

run_depend 也是运行依赖 不过是上一版本的标签,也能共用。
示例 小海龟的package.xml 部分文件


enter description here

可以使用 rospack find turtlesim 找到包的位置 或者 roscd turtlesim 直接找到该目录下

CMakeLists.txt: 构建package所需的CMake文件,调用Catkin的函数/宏,解析package.xml,找到其他依赖的catkin软件包,将本软件包添加到环境变量。

总体结构如下


enter description here

对于CMake的语法可以参考 《CMake实践》
示例 :

enter description here

这是小海龟的Cmakelists.txt 文件的一部分,具体可以到
/opt/ros/kinetic/share/turtlesim 中查看

launch文件

一般launch文件中会指定要启动哪些package下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch文件通常放在软件包的launch/路径中中。

ROS为我们提供了一个命令能一次性启动master和多个node。该命令是:
$ roslaunch pkg_name file_name.launch
roslaunch就像是一个启动工具,能够一次性把多个节点按照我们预先的配置(写入launch文件中)启动起来

launch文件同样也遵循着xml格式规范,是一种标签文本,它的格式包括以下标签:


enter description here

参考链接:

示例
launch文件的写法和格式看起来内容比较复杂,我们先来介绍一个最简单的例子如下:


enter description here

这是官网给出的一个最小的例子,文本中的信息是,它启动了一个单独的节点talker,该节点是包rospy_tutorials软件包中的节点。
但是实际比这个更为复杂

元功能包 Metapackage

功能包集,就是将多个功能接近,相互依赖的软件包放到一个集合中去。
ros中常用的Metapackage有

Metapacakge名称 描述
navigation 导航相关的功能包集
moveit 运动规划相关的(主要是机械臂)功能包集
image_pipeline 图像获取、处理相关的功能包集
vision_opencv ROS与OpenCV交互的功能包集
turtlebot Turtlebot机器人相关的功能包集
pr2_robot pr2机器人驱动功能包集

metapacakge中的 package.xml文件,CMakeLists.txt 文件 和普通pacakge不同点是:
CMakeLists.txt:加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
package.xml:标签将所有软件包列为依赖项,标签中添加标签声明。
metapacakge在我们实际开发一个大工程时可能有用

4. ROS2 升级

https://blog.csdn.net/weixin_36628778/article/details/104751581

推荐阅读更多精彩内容

  • 工作空间 创建工作空间 1.创建catkin_ws的文件夹,并在这个文件夹中创建src文件夹2.在src中输入ca...
    SEU小翔哥阅读 50评论 0 0
  • 在寒假开始之前,我们已经下载了ROS系统,并且了解了一部分ROS的工作机制和基础框架,现在我们从问题出发,重新开始...
    暗夜比邻星_f19b阅读 661评论 0 0
  • ROS文件系统 介绍catkin的编译系统,catkin工作空间的创建和结构,package软件包的创建和结构,介...
    徐凯_xp阅读 280评论 0 0
  • 爱之于我,不是肌肤之亲,不是一蔬一饭,它是一种不死的欲望,是疲惫生活里的英雄梦想。 创建工作空间 工作空间(wor...
    徐凯_xp阅读 1,062评论 0 3
  • 1. ROS 包/package ros的包(package)指的是一个完整的程序功能模块,一个package可以...
    北方的花姑娘阅读 193评论 0 0