学习资料推荐
ROS官方教程(中文版):http://wiki.ros.org/cn/ROS/Tutorials
ROS学习笔记系列:https://blog.csdn.net/mountzf/article/details/51931806
ROS学习之路的整理:https://blog.csdn.net/zhanshen112/article/details/82792467
古月居:http://www.guyuehome.com/
本篇的内容也参考了以上学习资料。ROS的安装
ROS不能再详细的安装教程16.04+kinetic:http://www.cnblogs.com/liu-fa/p/5779206.htmlu
安装过程中若是报错的话,建议用以下指令:
sudo apt update
sudo apt full-update
重新更新一遍系统后,再按照教程中的过程进行ROS的安装。
- 基本概念
3.1 ROS
ROS(Robot Operating System)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。主要可以从以下四个方面去理解:
1.通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。
2.工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。
3.强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。
4.生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。
简单来说,ROS提供了一些开源的可调用的功能库和通信手段供我们使用。
3.2 工作空间
工作空间(workspace)是ROS里面最小环境配置单位,可以把workspace看成是一个有结构的文件夹,它包含多个package以及一些结构性质文件。一次将一个workspace配置进环境变量里面,才能使用ROS命令执行与这个workspace里面的package相关的操作。
3.3 功能包
功能包(package)是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。 创建了相应的软件包才能实现相应的功能。
3.4 清单
清单(Manifest)是对于功能包相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。 也就是 package.xml文件。
3.5 脚本文件
CMakeLists.txt是一个Cmake的脚本文件,Cmake是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和链接库。
3.6 节点
节点(Node)是 ROS 功能包中的一个可执行文件,节点之间可以通过 ROS 客户端库(如roscpp 、 rospy )相互通信。一个机器人控制系统由许多节点组成,这些节点各司其职,如,一个节点控制激光距离传感器,一个节点控制轮子的马达,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的整个视图等。也就是能够执行特定工作任务的工作单元。
3.7 节点管理器
节点管理器(Master)是 ROS 名称服务,能够帮助节点找到彼此。节点通过与节点管理器通信来报告他们的注册信息。值得注意的是,当这些节点和节点管理器通信时,它们可以接受其他注册节点的信息,并能保持通信正常。当这些注册信息改变时,节点管理器也会回调这些节点。所以,没有节点管理器,节点将不能相互找到,也不能进行消息交换或者调用服务。
3.8 参数管理器
参数管理器( Parameter Server )是节点管理器的一部分,是一个可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时参数。
3.9 消息
消息(Message)是一种ROS数据类型。一个节点向特定主题发布消息,从而将数据发送到另一个节点。消息具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型。消息与话题(发布 / 订阅模式)是紧密联系在一起的,msg文件实质上就是一个从结构上描述ROS中所使用消息类型的简单文本,描述的是消息的数据类型。
3.10 话题
话题( Topic )是节点间用来传输数据的总线,通过主题进行消息路由不需要节点之间直接连接。节点可以发布消息到话题,也可以订阅话题以接收消息。一个话题可能对应有许多节点作为话题发布者和话题订阅者。当然,一个节点可以发布和订阅许多话题。一个节点对某一类型的数据感兴趣,它只需订阅相关话题即可。一般来说。话题发布者和话题订阅者不知道对方的存在。发布者将信息发布在一个全局的工作区内,当订阅者发现该信息是它所订阅的,就可以接收到这个信息。
3.11 服务
当需要直接与节点通信并获得应答时,将无法通过话题来实现,而需要服务(Service)。我们可以看出,发布 / 订阅模式是一种多对多的传输方式,显然这种传输方式不适用于请求 / 回复的交互方式。请求 / 回复交互方式经常被用于分布式系统中。请求服务通过 Service 来进行,Service 被定义为一对消息结构:一个用于请求,一个用于回复。一个客户通过发送请求信息并等待响应来使用服务( ROS中的请求 / 回复交互方式类似于一个远程函数调用,srv文件类似于函数参数和返回值的定义)。
3.12 消息记录包
消息记录包(Bag)是一种用于保存和回放 ROS 消息数据的格式。消息记录包是检索传感器数据的重要机制,这些数据虽然很难收集,但是对于发展和测试算法很有必要。
- 常用命令
4.1 ROS Shell命令
命令 功能
roscd 移动到指定的ROS软件包目录
rosls 显示ROS软件包的文件与目录
rosed 编辑ROS软件包的文件
roscp 复制ROS软件包的文件
rospd 添加目录至ROS目录索引
rosd 显示ROS目录索引中的目录
roscd [功能包名称] 。使用它,无需再使用cd一层层到查找,进入功能包里。
rosls [功能包名称] 。等价与roscd+ls。查看ROS功能包的文件列表更方便,快捷。
rosed[功能包名称][文件名称]。 用于编辑功能包中的特定文件,优点也是快捷,修改容易。
4.2 ROS执行命令
命令 功能
roscore 开启Master(ROS名称服务)
rosrun 运行单个节点
roslaunch 运行多个节点及设置运行选项
rosclean 检查或删除ROS日志文件
roscore [选项]。运行主节点,主节点管理节点之间的消息通信中的连接信息。关于主节点的具体作用就不累述了。
rosrun [功能包名称] [节点名称]。执行指定的功能包中的一个节点的命令(rosrun rqt_graph rqt_graph 可查看当前系统的运行情况)。
roslaunch [功能包名称] [launch文件名]。 类似dat批命令,是运行指定功能包中一个或设置执行选项的命令。
rosclean [选项]。运行roscore时,对所有节点的记录都会写入日志文件,随着时间的推移,需要定期使用rosclean命令删除这些记录.
4.3 ROS信息命令
命令 功能
rostopic 查看ROS话题信息
rosservice 查看ROS服务信息
rosnode 查看ROS节点信息
rosparam 确认和修改ROS参数信息
rosbag 记录和回放ROS消息
rosmsg 显示ROS消息类型
rossrv 显示ROS服务类型
rosversion 显示ROS功能包的版本信息
roswtf 检查ROS系统
rostopic [选项]
list - 列出活动话题
echo [话题名称] - 实时显示指定话题的消息内容
find [类型名称] - 显示使用指定类型的消息的话题
type [话题名称] - 显示指定话题的消息类型
bw [话题名称] - 显示指定话题的消息类型
hz [话题名称] - 显示指定话题的消息数据发布周期
info [话题名称] - 显示指定话题的消息
pub [话题名称] [消息类型] [参数] - 用指定的话题名称发布消息,许多时候另开一个终端操作 例:rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]”[0.0, 0.0, 0.0]’
rosservice [选项]
list - 显示活动的服务信息
info [服务名称] - 显示指定服务的信息
type [服务名称] - 显示服务类型
find [服务类型] - 查找指定服务类型的服务
uri [服务名称] - 显示ROSRPC URI服务
args [服务名称] - 显示服务参数
call [服务名称] [参数] - 用输入的参数请求服务,通常用于测试服务
rosnode [选项]
list - 查看活动的节点列表
ping [节点名称] - 与指定的节点进行连接测试
info [节点名称] - 查看指定节点的信息
machine [PC名称或IP] - 查看该PC中运行的节点列表
kill [节点名称] - 停止指定节点的运行
cleanup - 删除失连节点的注册信息
rosparam [参数]
list - 查看参数列表
get [参数名称] - 获取参数值
set [参数名称] - 设置参数值
dump [文件名称] - 将参数保存到指定文件
load [文件名称] - 获取保存在指定文件中的参数,经常使用。
delete [参数名称] - 删除参数
rosmsg [参数]
list - 显示所有消息
show [消息名称] - 显示指定消息
md5 [消息名称] - 显示md5sum
package [功能包名称] - 显示用于指定功能包的所有消息
packages - 显示使用消息的所有功能包
rossrv [参数]
list -显示所以服务
show [服务名称] - 显示指定的服务信息
md5 [服务名称] - 显示md5sum
package [功能包名称] - 显示指定的功能包中用到的所有服务
packages - 显示使用服务的所有功能包
rosbag [参数]
record [选项] [话题名称] - 将指定话题的消息记录到bag文件
info [文件名称] - 查看bag文件的信息
play [文件名称] - 回放指定的bag文件,这个使用玩的也多。
compress [文件名称] - 压缩指定的bag文件
decompress [文件名称] - 解压指定的bag文件
filter [输入文件] [输出文件] [选项] - 生成一个删除了指定内容的新的bag文件
reindex bag [文件名称] - 刷新索引
check bag [文件名称] - 检查指定的bag文件是否能在当前系统中回放
fix [输入文件] [输出文件] [选项] - 将由于版本不同而无法回放的bag文件修改可以回放的文件
4.4 ROS catkin命令
catkin_create_pkg - 自动生成功能包(示例命令:catkin_create_pkg [功能包名称] [依赖性功能包1] [依赖性功能包2]….)。
catkin_make - 基于catkin构建系统的构建 (示例:catkin_make –pkg [包名] 只构建一部分功能包)。
catkin_eclipse - 对于用catkin构建系统生成的功能包进行修改,使其能在Eclipse环境中使用。
catkin_prepare_release - 在发布时用到的日志整理和版本标记。
catkin_generate_changelog - 在发布时生成或更新CHANGLOG.rst文件。
catkin_init_workspace - 初始化catkin构建系统的工作目录。
catkin_find - 搜素catkin,找到并显示工作空间。
4.5 ROS功能包命令
rospack [选项] [功能包名称] - 查看与ROS功能包相关的信息(可以使用find, list, depend-on, depends和profile等选项)。
rosinstall - 安装ROS附加功能包。
rosdep [选项] - 安装该功能包的依赖性文件(check, install, init, update)。
roslocate [选项] [功能包名称] - ROS功能包信息相关命令(可用的选项是info, vcs, type, uri和repo等)。 - 基本操作
5.1 创建ROS工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
其中catkin_ws是自定义的工作空间名,也就是文件夹名。
5.2 将工作空间配置进环境变量
可通过以下的命令来配置:
source devel/setup.bash
也可直接在.bashrc里写入:
source ~/catkin_ws/devel/setup.bash
5.3 创建一个功能包
首先切换到工作空间的src目录下:
cd ~/catkin_ws/src
再使用catkin_create_pkg命令来创建功能包:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
其中,beginner_tutorials是创建的功能包名,后面是该功能包依赖的三个功能包。运行完后可以看出在beginner_tutorials目录下创建了package.xml和CMakeLists.txt两个文件。
5.4 配置package.xml文件
接下来对package.xml文件进行配置。package.xml文件主要由4个标签组成,分别为描述标签、维护者标签、许可证标签、依赖项标签。
beginner_tutorials
0.1.0
The beginner_tutorials package
Your Name
BSD
http://wiki.ros.org/beginner_tutorials
Jane Doe
catkin
roscpp
rospy
std_msgs
roscpp
rospy
std_msgs
5.5 编写ROS程序
在 ~/工作空间/src/功能包名 目录下,创建并编辑cpp程序文件(以hello.cpp为例)。运行如下命令:
cd ~/catkin_ws/src/beginner_tutorials
touch hello.cpp
gedit hello.cpp
hello.cpp代码如下:
#include
int main ( int argc , char ** argv)
{
ros::init ( argc , argv , "hello");
ros::NodeHandle nh;
ROS_INFO_STREAM( "Hello , ROS! ");
}
5.6 编译ROS程序
5.6.1 声明依赖库
首先,我们需要声明程序所依赖的其他功能包。对于C++程序而言,此步骤是必要的,以确保catkin能够向C++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。
为了给出依赖库,我们需要编辑CMakeLists.txt文件。即修改find_package如下:
find_package(catkin REQUIRED COMPONENTS
依次写上所依赖的功能包
roscpp
)
同样,我们也需要在package.xml文件中列出依赖库,由于hello程序在编译时和运行时都需要roscpp库,故将roscpp添加至build_depend(编译依赖)和exec_depend(运行依赖)。如下:
catkin
roscpp
roscpp
roscpp
5.6.2 声明可执行文件
接下来,我们需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。
第一行:
add_executable(hello hello.cpp)
其中,hello是我们想要生成的可执行文件的文件名,hello.cpp是生成此可执行文件所需的源文件列表。如果有多个源文件,把它们列在此处,并用空格将其区分开。
第二行:
target_link_libraries(hello ${catkin_LIBRARIES})
该行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中已经定义了)。
5.6.3 编译工作区
首先返回工作空间目录,然后使用catkin_make命令进行编译:
cd ~/catkin_ws
catkin_make
完成编译后,将会在工作区中创建devel(开发空间,用来放置编译生成的可执行文件)和build(编译空间,用来储存工作空间编译过程中产生的缓存信息和中间文件)两个子目录。
5.7 运行ROS程序
hello 程序是一个节点(Node),需要节点管理器才可以正常运行,启动节点管理器后,用rosrun命令运行程序:
roscore
rosrun beginner_tutorials hello
至此,完成了创建工作空间、功能包、编写、编译、运行简单的ROS程序。