写在最前面的话: 这是第一次在CSDN写博客,也算是正式踏入这个圈子 准备两三天一更,把学习经历完整记录下来 希望最后回看过来能收获很多
查了很多资料,入门ROS比较好的免费资源是古月居的讲授以及赵虚左老师的讲授,这个资源材料在哔站大学可查(同时,很感谢两位老师的倾情讲授)
那么就先从赵老师的讲授开始说(专挑对于我来说比较难懂容易错的地方),再讲到古月居的时候,最后会有个对比,到那个时候我会把两个视频仅作为入门视频的差异作出分析,供学习参考。
赵老师视频所在地址
https://www.bilibili.com/video/BV1Ci4y1L7ZZ/
赵老师视频笔记所在地址
http://www.autolabor.com.cn/book/ROSTutorials/
首先是第一章节,赵老师告诉我们这一节的概要
- • ROS的相关概念
- • 怎样安装ROS
- • 如何搭建ROS的集成开发环境
可以基本看出来最关键的是理解最后如何搭建ROS集成开发环境,上面的概念以及如何安装ROS倒是照猫画猫,比较容易的东西。
接着该章内容学习完毕预期达成的目标如下:
- • 了解 ROS 概念、设计目标以及发展历程
- • 能够独立安装并运行 ROS
- • 能够使用 C++ 或 Python 实现 ROS 版本的 HelloWorld
- • 能够搭建 ROS 的集成开发环境
- • 了解 ROS 架构设计
从目标可以看出3,4,5这几点是第一章的关键所在,C++和PYTHON在ubuntu中的使用非常重要,根据客户的具体需要,用两种语言完成需求,除此之外,JAVA对于机器人平台安卓软件的开发也是可选的语言,不过现阶段还是专注于C++以及PYTHON的学习
接着是案例的演示环节,这里一个经典乌龟出现了,请读者移步老师的笔记观看
下面进入正题
1.1.1 ROS概念
ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities +
Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体
这一点赵老师强调的较为重要,估计要学到后面才能理解为什么说是这些部分的结合
1.1.2 ROS设计目标
分布式:ROS是进程(也称为Nodes节点)的分布式框架,ROS中的进程可分布于不同主机,不同主机协同工作,从而分散计算压力
老师表达的意思就是树莓派(可搭建微型操作系统Ubuntu),把传感器收集到的数据返回给电脑进行计算分担了计算压力,再把计算结果返回给树莓派这个过程,形成了一个反馈,让我联想到了学过的自动控制原理的内容(PID调节)
松耦合:ROS中功能模块封装于独立的功能包或元功能包(储存在src),便于分享,功能包内的模块以节点(node)为单位运行,以ROS标准的IO作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接
老师举了个例子,就是不同厂商的传感器因为共用一个IO的接口规则,所以可以实现复用,当接入传感器和时,功能包内的相应模块就会以节点为单位运行
精简:ROS被设计为尽可能精简,以便为ROS编写的代码可以与其他机器人软件框架一起使用。ROS易于与其他机器人软件框架集成:ROS已与OpenRAVE,Orocos和Player集成。
其他机器人软件框架的集成现在还用不到,在后部分学习会详细学习
丰富的组件化工具包:ROS可采用组件化方式集成一些工具和软件到系统中并作为一个组件直接使用,如RVIZ(3D可视化工具),开发者根据ROS定义的接口在其中显示机器人模型等,组件还包括仿真环境和消息查看工具等
这里老师强调了仿真的重要性
1.1.3 ROS发展历程
自行阅读,自认为不是那么重要
另请参考:
• https://www.ros.org/about-ros/
• http://wiki.ros.org/ROS/Introduction
• http://wiki.ros.org/Distributions
1.1.完结
1.2.1-1.2.4完全去看老师的笔记即可,锻炼自己的阅读动手操作能力,不是很难
我这里采用的是Vmware workstation+ubuntu 18.04,workstation的下载资源可以微信公众号搜:软件管家 获取
1.2.1 安装虚拟机软件
1.2.2 虚拟一台主机
1.2.3 安装ubuntu
20.04网盘下载地址
https://blog.csdn.net/David_Aulier/article/details/106491083
清华镜像源
供下载各版本
https://mirrors.tuna.tsinghua.edu.cn/
阿里镜像源
https://developer.aliyun.com/mirror/
1.2.4 安装 ROS
注意: 当执行到最后 sudo rosdep init 是,可能会抛出异常; 错误提示: 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.原因: 境外资源被屏蔽
解决思路: 查询错误提示中域名的IP地址,然后修改 /etc/hosts 文件,添加域名与IP映射 实现:
1.访问域名查询网址:https://site.ip138.com/
2.查询域名ip,搜索框中输入: raw.githubusercontent.com,自由复制一个查询到的IP 初始化rosdep的时候这里出现了问题,主要是境外资源被屏蔽
这个问题我也遇到了,试过网上很多方法比如说改各种source的方法没有见到效果,卡在这里很久之后,我看到了鱼香ROS(小鱼)的方法,具体方法如下,感谢大佬。
一行代码安装ROS/ROS2解决ROSDEP安装docker等等,只需一行
wget http://fishros.com/install -O fishros && bash fishros
小鱼还提供了一键ROS安装的方式万能指令!!!
wget http://fishros.com/install -O fishros && . fishros
一行代码安装ros2-foxy
ROS2-Foxy
sudo apt-get install curl && curl http://fishros.com/tools/install/ros-foxy | bash
一行代码搞定rosdepc
curl http://fishros.com/tools/install/rosdepc | bash
1.2.5 测试 ROS
ROS 内置了一些小程序,可以通过运行这些小程序以检测 ROS 环境是否可以正常运行
首先启动三个命令行(ctrl + alt + T)命令行1键入:roscore命令行2键入:rosrun turtlesim turtlesim_node(此时会弹出图形化界面)命令行3键入:rosrun turtlesim turtle_teleop_key(在3中可以通过上下左右控制2中乌龟的运动)
乌龟能动了,就说明ros基本安装成功
这个地方要注意的是,有些人没有把命令行3置顶导致乌龟无法动,要把鼠标中心放在键盘命令窗口里
1.2.6 资料:其他ROS版本安装
这个环节在上文一提到过
需要安装的ros版本取决于ubuntu系统的版本
1.3.1 HelloWorld实现简介
编写 ROS 程序,在控制台输出文本: Hello World,分别使用 C++ 和 Python 实现。
ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:
先创建一个工作空间;
再创建一个功能包;
编辑源文件;
编辑配置文件;
编译并执行。
赵老师说的这个流程基本上就是一个完整的开发思路,之前就听说ROS开发基本是站在巨人肩膀上学习,看来是真的,只要你会调用已写好的功能包,使其适配即可完成功能的实现。
1.创建工作空间并初始化
mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make
src是存放功能包的地方,而自定义的空间就是整个设计的机器人系统的工作空间
上述命令,首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译。
2.进入 src 创建 ros 包并添加依赖
cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
进入src,定义所建立的ros包名字,并对应添加依赖项,这个地方还是很好理解的,需要加强记忆
上述命令,会在工作空间下生成一个功能包,该功能包依赖于 roscpp、rospy 与
std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。
注意: 在ROS中,虽然实现同一功能时,C++和Python可以互换,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言:C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS设计者分别设计了roscpp与rospy库,前者旨在成为ROS的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。
1.3.2 HelloWorld(C++版)
1.进入 ros 包的 src 目录编辑源文件
cd 自定义的包
C++源码实现(文件名自定义)
这个地方需要新建一个cpp文件
直接终端到包内部的src中
使用
touch 文件名自定义.cpp
建立一个cpp文件
打开cpp文件做一个helloworld的输出程序
#include "ros/ros.h"int main(int argc, char *argv[])
{//执行 ros 节点初始化ros::init(argc,argv,"hello");//创建 ros 节点句柄(非必须)ros::NodeHandle n;//控制台输出 hello worldROS_INFO("hello world!");return 0;
}
2.编辑 ros 包下的 Cmakelist.txt文件
add_executable(步骤3的源文件名src/步骤3的源文件名.cpp
)
target_link_libraries(步骤3的源文件名${catkin_LIBRARIES}
)
这个地方可以使用搜索定位到这两个改动行,然后建议修改的的三个源文件名一致(和cpp文件名),其实除了第二个名字,第一个和第三个是node节点映射名,可以随意修改,在这里统一源文件名防止出错
3.进入工作空间目录并编译
cd 自定义空间名称
catkin_make
这里注意要退回工作空间目录编译,生成 build devel …
4.执行
开启一个新的终端
先启动命令行1:
roscore
回到原来终端
再启动命令行2:
cd 工作空间
source ./devel/setup.bash
rosrun 包名 统一的cpp源文件名
这里的source只对当前窗口有效
命令行输出: HelloWorld!
PS:source ~/工作空间/devel/setup.bash可以添加进.bashrc文件,使用上更方便
添加方式1: 直接使用 gedit 或 vi 编辑 .bashrc 文件,最后添加该内容添加方式2:echo "source ~/工作空间/devel/setup.bash" >> ~/.bashrc
1.3.3 HelloWorld(Python版)
这个是针对于python编写的的功能包实现的
1.进入 ros 包添加 scripts 目录并编辑 python 文件
cd ros包
mkdir scripts
- 指定解释器
- 1.导包
- 2.编写主入口
- 3 初始化ROS节点
- 4 输出日志helloworld
#! /usr/bin/env python
##指定解释器#1.导包
import rospy
#2.主入口
if __name__ == "__main__":#3.初始化ROS节点,这里是节点名字“Hello_p”rospy.init_node("Hello_p");#4.输出日志rospy.loginfo("Hello World!!!! by python");
这里会出现一系列错误,分别需要检查if后子语句的缩进并且需要给文件提供权限
2.为 python 文件添加可执行权限
chmod +x 自定义文件名.py
查看文件权限
ll
3.编辑 ros 包下的 CamkeList.txt 文件
catkin_install_python(PROGRAMS scripts/自定义文件名.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
这里所谓的自定义文件名也就是上一步的py程序名
这一步选择恰当的解释器(Noetic之前的版本不需要改,这里老师没有强调,改了会报错)
作者这里使用的是18.04的系统所以不需要更改
cd 自定义空间名称
catkin_make
这里的话老师强调要看到百分之百,说明没有报错,但是实际操作的时候我没有看到百分之百,也没有什么特别的报错,依然是可以完成后续工作的
5.进入工作空间目录并执行
先启动命令行1:
roscore
再启动命令行2:
cd 工作空间
source ./devel/setup.bash
rosrun 包名 自定义文件名.py
然后就遇到这种错误
> SyntaxError: Non-ASCII character '\xe5' in file
> /home/zhangyuanbo/namespace/src/rosbag/src/ros1.py on line 2, but no
> encoding declared; see http://python.org/dev/peps/pep-0263/ for
> details
这种错误是因为中文字符的注释问题直接在py文件头部加上
#coding=utf-8
或者
# -*- coding: UTF-8 -*-
问题解决,输出最终的helloworld
1.4.1 安装超级终端(实现分屏功能)
1.安装
sudo apt install terminator
2.添加到收藏夹
显示应用程序 —> 搜索 terminator —> 右击 选择 添加到收藏夹
3.Terminator 常用快捷键
第一部份:关于在同一个标签内的操作Alt+Up //移动到上面的终端
Alt+Down //移动到下面的终端
Alt+Left //移动到左边的终端
Alt+Right //移动到右边的终端
Ctrl+Shift+O //水平分割终端
Ctrl+Shift+E //垂直分割终端
Ctrl+Shift+Right //在垂直分割的终端中将分割条向右移动
Ctrl+Shift+Left //在垂直分割的终端中将分割条向左移动
Ctrl+Shift+Up //在水平分割的终端中将分割条向上移动
Ctrl+Shift+Down //在水平分割的终端中将分割条向下移动
Ctrl+Shift+S //隐藏/显示滚动条
Ctrl+Shift+F //搜索
Ctrl+Shift+C //复制选中的内容到剪贴板
Ctrl+Shift+V //粘贴剪贴板的内容到此处
Ctrl+Shift+W //关闭当前终端
Ctrl+Shift+Q //退出当前窗口,当前窗口的所有终端都将被关闭
Ctrl+Shift+X //最大化显示当前终端
Ctrl+Shift+Z //最大化显示当前终端并使字体放大
Ctrl+Shift+N or Ctrl+Tab //移动到下一个终端
Ctrl+Shift+P or Ctrl+Shift+Tab //Crtl+Shift+Tab 移动到之前的一个终端第二部份:有关各个标签之间的操作F11 //全屏开关
Ctrl+Shift+T //打开一个新的标签
Ctrl+PageDown //移动到下一个标签
Ctrl+PageUp //移动到上一个标签
Ctrl+Shift+PageDown //将当前标签与其后一个标签交换位置
Ctrl+Shift+PageUp //将当前标签与其前一个标签交换位置
Ctrl+Plus (+) //增大字体
Ctrl+Minus (-) //减小字体
Ctrl+Zero (0) //恢复字体到原始大小
Ctrl+Shift+R //重置终端状态
Ctrl+Shift+G //重置终端状态并clear屏幕
Super+g //绑定所有的终端,以便向一个输入能够输入到所有的终端
Super+Shift+G //解除绑定
Super+t //绑定当前标签的所有终端,向一个终端输入的内容会自动输入到其他终端
Super+Shift+T //解除绑定
Ctrl+Shift+I //打开一个窗口,新窗口与原来的窗口使用同一个进程
Super+i //打开一个新窗口,新窗口与原来的窗口使用不同的进程
1.4.2 安装VScode
1.下载
vscode 下载:https://code.visualstudio.com/docs?start=true
历史版本下载链接: https://code.visualstudio.com/updates
2.vscode 安装与卸载
2.1 安装
方式1:双击安装即可(或右击选择安装)
方式2:sudo dpkg -i xxxx.deb
2.2 卸载
sudo dpkg --purge code
3.vscode 集成 ROS 插件
使用 VScode 开发 ROS 程序,需要先安装一些插件,常用插件如下,依次安装即可:
关于python安装可能需要你选择一个解释器,会出现个红色的错误,要选择 usr/bin/python3即可
4.vscode 使用基本配置
4.1 创建 ROS 工作空间
mkdir -p xxx_ws/src(必须得有 src)
cd xxx_ws
catkin_make
4.2 启动 vscode
进入 xxx_ws 启动 vscode
cd xxx_ws
code .
code.后自动生成vscode文件
4.3 vscode 中编译 ros
CTRL+SHIFT+B
选择 catkin_make:build
后面的小齿轮自动生成tasts.json
需要修改tasts.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"}]
}
当然了也可以自己写,关键点是"group"这一行,意思是在使用CTRL+SHIFT+B
时默认执行编译命令
以后编译直接按快捷指令即可CTRL+SHIFT+B
4.4 创建 ROS 功能包
选定 src 右击 ---> create catkin package
设置包名 添加依赖
这里老师讲的很细,首先添加的是package name,其次是dependences依赖项,结束后直接回车,生成的目录如下所示,可以对照看下
这里不放心可以 CTRL+SHIFT+B进行编译,如果没有出错,那么是正确的,到目前为止
下一步右击最里部的src新建一个cpp文件
打开此文件开始输入helloworld程序
4.5 C++ 实现
#include "ros/ros.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");//执行节点初始化ros::init(argc,argv,"HelloVSCode");//输出日志ROS_INFO("Hello VSCode!!!哈哈哈哈哈哈哈哈哈哈");return 0;
}
当然了会出现一些问题这里列举了三条内容:特别是第三条老师并没有提及
PS1: 如果没有代码提示修改 .vscode/c_cpp_properties.json设置 "cppStandard": "c++17"
PS2: main 函数的参数不可以被 const 修饰
PS3: 当ROS__INFO 终端输出有中文时,会出现乱码
INFO: ????????????????????????解决办法:在函数开头加入下面代码的任意一句setlocale(LC_CTYPE, "zh_CN.utf8");
setlocale(LC_ALL, "");
4.6 修改配置 CMakeLists.txt
add_executable(节点名称src/C++源文件名.cpp
)
target_link_libraries(节点名称${catkin_LIBRARIES}
)
这里之前提到的一样,如下图所示修改即可
编译: ctrl + shift + B
执行和之前一致,只是可以在 VScode 中添加终端,首先执行:source ./devel/setup.bash
刷新完成后那么就是直接在下面点加号开启两个新的终端,首先是roscore
,其次是rosrun 包名 cpp文件名
最后输出成功,也是成功在vscode中实现hello的输出!
PS:如果不小心关掉了终端,可以在vscode内使用CTRL+~
再次调出
Python 配置:
在包内新建文件夹 scrips,在此文件夹中添加.py的文件,文件内容如下所示供参考
#! /usr/bin/env python#coding=utf-8
import rospy # 1.导包if __name__ == "__main__":rospy.init_node("Hello_Vscode_p") # 2.初始化 ROS 节点rospy.loginfo("Hello VScode, 我是 Python ....") #3.日志输出 HelloWorld
结束后记得给python文件添加权限(在scripts 文件下打开终端输入:)
chmod +x *.py
ll
紧接着配置cmakelists
Python 配置:
catkin_install_python(PROGRAMS scripts/自定义文件名.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
把.py文件名改到如下所示即可(18.04及其之前版本不用看)
执行和之前一致,只是可以在 VScode 中添加终端,首先执行:source ./devel/setup.bash
刷新完成后那么就是直接在下面点加号开启两个新的终端,首先是roscore
,其次是rosrun 包名 py文件名.py
PS:我这里出现的错误1:
Unindent amount does not match previous indent
对比发现代码没有错误,错误发生在换行符上,把复制过来的代码前的空格和换行符全部去掉重新换行即可解决。
错误2:
Couldn't find executable named hello_vscode_p.py below /home/
这个的话还是权限的问题,在这里我发现我chmod给权限没用,所以定位到.py文件右键
把允许作为程序执行文件选上,这里也是卡了一段时间,不过还好实现了最后
OK这样的话也完成了在vscode中对基本的C++文件与PY文件的实现!
注意:(20.04以上版本看)
20.04的版本及其以上用的是python3(noetic 使用的是 python3)
解决方式:
1.直接声明解释器为python3(不建议)
直接把py头文件改成python3,而不是python,这种会修改程序不建议
2.通过软链接把python 链接到python3 上面(建议):sudo ln -s /usr/bom/python3 /usr/bin/python
打开终端直接输入
sudo ln -s /usr/bom/python3 /usr/bin/python
使用/usr/bin/env python
查看当前指向Python3
直接可以执行,修改完成
以上不用编写Cmakelists
5.其他 IDE
ROS 开发可以使用的 IDE 还是比较多的,除了上述的 VScode,还有 Eclipse、QT、PyCharm、Roboware
…,详情可以参考官网介绍:http://wiki.ros.org/IDEs
QT Creator Plugin for ROS,参考教程:https://ros-qtc-plugin.readthedocs.io/en/latest/
Roboware 参考:http://www.roboware.me/#/(PS: Roboware 已经停更了,可惜…)
1.4.3 launch文件演示
使用launch文件一次性启动多个节点
是一种xml文件
1 选定功能包右击 ---> 添加 launch 文件夹2 选定 launch 文件夹右击 ---> 添加 launch 文件3 编辑 launch 文件内容
添加的launch文件名为 start_turtle.launch
编辑内容如下所示,保存后再使用roslaunch
<launch><node pkg="helloworld" type="demo_hello" name="hello" output="screen" /><node pkg="turtlesim" type="turtlesim_node" name="t1"/><node pkg="turtlesim" type="turtle_teleop_key" name="key1" /></launch>
其中内容的含义:
node ---> 包含的某个节点pkg -----> 功能包type ----> 被运行的节点文件name --> 为节点命名output-> 设置日志的输出目标
运行 launch 文件(在根目录上)
roslaunch 包名 launch文件名
运行结果: 一次性启动了多个节点
如下图所示: 使用output可以将文本打印到屏幕上
至此完成launch的操作(会频繁使用到这个操作),在第四章会继续提到
1.5.0 ROS架构
1.设计者
ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”
Plumbing: 通讯机制(实现ROS不同节点之间的交互)Tools :工具软件包(ROS中的开发和调试工具)Capabilities :机器人高层技能(ROS中某些功能的集合,比如:导航)Ecosystem:机器人生态系统(跨地域、跨软件与硬件的ROS联盟)
2.维护者
立足维护者的角度: ROS 架构可划分为两大部分
main:核心部分,主要由Willow Garage 和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个ROS的核心部分的程序编写。universe:全球范围的代码,有不同国家的ROS社区组织开发和维护。一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能。
3.系统架构
立足系统架构: ROS 可以划分为三层
**OS 层**,也即经典意义的操作系统ROS 只是元操作系统,需要依托真正意义的操作系统,目前兼容性最好的是 Linux 的 Ubuntu,Mac、Windows 也支持 ROS 的较新版本**中间层**是 ROS 封装的关于机器人开发的中间件,比如:基于 TCP/UDP 继续封装的 TCPROS/UDPROS 通信系统用于进程间通信 Nodelet,为数据的实时性传输提供支持另外,还提供了大量的机器人开发实现库,如:数据类型定义、坐标变换、运动控制....**应用层**功能包,以及功能包内的节点,比如: master(也就是roscore)、turtlesim的控制与运动节点...
4.自身结构
就 ROS 自身实现而言: 也可以划分为三层
**文件系统**ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式**计算图**ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程,计算图中的重要概念: 节点(Node)、消息(message)、通信机制_主题(topic)、通信机制_服务(service)**开源社区**ROS的社区级概念是ROS网络上进行代码发布的一种表现形式发行版(Distribution) ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样发挥类似的作用。这使得ROS软件安装更加容易,而且能够通过一个软件集合维持一致的版本。软件库(Repository) ROS依赖于共享开源代码与软件库的网站或主机服务,在这里不同的机构能够发布和分享各自的机器人软件与程序。ROS维基(ROS Wiki) ROS Wiki是用于记录有关ROS系统信息的主要论坛。任何人都可以注册账户、贡献自己的文件、提供更正或更新、编写教程以及其他行为。网址是http://wiki.ros.org/。Bug提交系统(Bug Ticket System)如果你发现问题或者想提出一个新功能,ROS提供这个资源去做这些。邮件列表(Mailing list) ROS用户邮件列表是关于ROS的主要交流渠道,能够像论坛一样交流从ROS软件更新到ROS软件使用中的各种疑问或信息。网址是http://lists.ros.org/。ROS问答(ROS Answer)用户可以使用这个资源去提问题。网址是https://answers.ros.org/questions/。博客(Blog)你可以看到定期更新、照片和新闻。网址是https://www.ros.org/news/,不过博客系统已经退休,ROS社区取而代之,网址是https://discourse.ros.org/。
软件库,ROSwiki, ROS问答比较重要
现在处于学习的初级阶段,只是运行了ROS的内置案例,编写了简单的ROS实现,因此,受限于当前进度,不会详细介绍所有设计架构中的所有模块,当前只介绍文件系统与计算图,下一章会介绍 ROS 的通信机制,这也是ROS的核心实现之一。
1.5.1 ROS文件系统
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。|--- src: 源码|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)|-- scripts 存储python文件|-- src 存储C++源文件|-- include 头文件|-- msg 消息通信格式文件|-- srv 服务通信格式文件|-- action 动作格式文件|-- launch 可一次性运行多个节点 |-- config 配置信息|-- CMakeLists.txt: 编译的基本配置
ROS 文件系统中部分目录和文件前面编程中已经有所涉及,比如功能包的创建、src目录下cpp文件的编写、scripts目录下python文件的编写、launch目录下launch文件的编写,并且也配置了 package.xml 与 CMakeLists.txt 文件。其他目录下的内容后面教程将会再行介绍,当前我们主要介绍: package.xml 与 CMakeLists.txt 这两个配置文件。
1.package.xml
该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。请注意,该概念类似于旧版 rosbuild 构建系统中使用的manifest.xml文件。
2.CMakelists.txt
文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。
1.5.2 ROS文件系统相关命令
1.增
catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包
sudo apt install xxx === 安装 ROS功能包
这个会常用
2.删
sudo apt purge xxx ==== 删除某个功能包
3.查
rospack list === 列出所有功能包rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径roscd 包名 === 进入某个功能包rosls 包名 === 列出某个包下的文件apt search xxx === 搜索某个功能包
turtlesim /opt/ros/melodic/share/turtlesim
例如:
apt search ros-melodic-* | grep -i gmapping
搜索当前melodic版本中的有关gmapping的所有功能包
sudo apt install xxx(包名字)
4.改
rosed 包名 文件名 === 修改功能包文件
需要安装 vim编辑器
sudo apt install vim
比如:rosed turtlesim Color.msg
这里按住shift+:+Q
退出
5.执行
5.1roscore
roscore === 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。
roscore 将启动:
ros masterros 参数服务器rosout 日志节点
用法:
roscore
或(指定端口号)
roscore -p xxxx
5.2 rosrun
rosrun 包名 可执行文件名 === 运行指定的ROS节点
比如:rosrun turtlesim turtlesim_node
5.3 roslaunch
roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件
1.5.3 ROS计算图
1.计算图简介
前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:
rqt_graph。
rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分。
2.计算图安装
如果前期把所有的功能包(package)都已经安装完成(也就是安装的是完整的ROS桌面版),则直接在终端窗口中输入
rosrun rqt_graph rqt_graph
如果未安装则在终端(terminal)中输入
$ sudo apt install ros-<distro>-rqt
$ sudo apt install ros-<distro>-rqt-common-plugins
请使用你的ROS版本名称(比如:kinetic、melodic、Noetic等)来替换掉。
例如当前版本是 Noetic,就在终端窗口中输入
$ sudo apt install ros-noetic-rqt
$ sudo apt install ros-noetic-rqt-common-plugins
3.计算图演示
接下来以 ROS 内置的小乌龟案例来演示计算图
首先,按照前面所示,运行launch案例
然后,启动新终端,键入: rqt_graph
或 rosrun rqt_graph rqt_graph
,可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系。
1.6 本章小结
本章内容主要介绍了ROS的相关概念、设计目标、发展历程等理论知识,安装了 ROS 并搭建了 ROS 的集成开发环境,编写了第一个 ROS小程序,对ROS实现架构也有了宏观的认识。ROS的大门已经敞开,接下来就要步入新的征程了。
OK第一章节结束,最后编辑时间:2022.8.20 17:15
咱们下一章见