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 init
和 sudo 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 基础架构设计
通信系统: TCPROS/UDPROS
ROS 通信系统,使用 发布/订阅、客户端/服务器 等模型,实现多种通信机制的数据传输。
跨进程通信: Nodelet API
Ros Nodelet API 为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性有较高要求的应用。
ROS 机器人开发相关库:Client Library
基于通信机制之上,ROS提供了大量机器人开发相关库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。
应用层:Application Layer
在应用层,ROS需要运行一个管理者 -- Master,负责管理整个系统的正常运行。ROS 社区提供了大量机器人应用的功能包,这些功能包内的模块以节点为单位运行,以ROS标准输入输出作为接口,让开发者不需要关注模块内部的实现机制,只需要了解接口规则即可实现复用,极大的提高了工作效率。
从系统实现角度可以将ROS划分为三个层次: 开源社区、文件系统、计算图。
3.2 计算图
从计算图角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接。
// 计算图查看工具
$ rqt_graph
3.2.1 节点(Node)
节点(Node)是执行运行任务的进程,一个系统由多个节点构成,也可以看作是软件模块。当许多节点同时运行时,可以很方便的额将端对端的通信机制绘成节点关系图。在这个图中可以清晰看出节点(圈)和端对端的连接关系(节点间的连线)。
3.2.2 消息(Message)
节点间通讯的通用数据结构定义的封装,可根据需求由开发者自定义。
3.2.3 话题(Topic)
消息以一种 发布/订阅(Publish/Subscribe)的方式传递。数据以广播的形式发布。这是一种单向的数据通信,发布者与订阅者之间,订阅者相互之间并不知道彼此的存在。
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 是一个跨平台的安装工具,可以用最简单的语句来描述所有平台的安装,为软件跨平台创建而生。
一个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/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量
平常主要用到的是src文件夹
我们写的ROS程序、网上下载的ROS源代码包都存放在这里。
在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包
package
package是catkin工作空间的基本单元,我们在ROS开发时,写好代码,然后catkin_make,系统就会完成所有编译构建的工作。
package结构
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文件
包含的标签有
run_depend 也是运行依赖 不过是上一版本的标签,也能共用。
示例 小海龟的package.xml 部分文件
可以使用 rospack find turtlesim 找到包的位置 或者 roscd turtlesim 直接找到该目录下
CMakeLists.txt: 构建package所需的CMake文件,调用Catkin的函数/宏,解析package.xml,找到其他依赖的catkin软件包,将本软件包添加到环境变量。
总体结构如下
对于CMake的语法可以参考 《CMake实践》
示例 :
这是小海龟的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格式规范,是一种标签文本,它的格式包括以下标签:
示例
launch文件的写法和格式看起来内容比较复杂,我们先来介绍一个最简单的例子如下:
这是官网给出的一个最小的例子,文本中的信息是,它启动了一个单独的节点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