一:ros的系统架构
ros系统架构主要分为三个部分:
文件系统级
计算图级
开源社区级
1. 文件系统级
功能包(package):是ROS中软件组织的基本形式,一个功能包具有最小的结构和最少的内容,用于创建ROS程序;--指的是一种特定的文件结构和文件夹组合
功能包清单:manifests.xml 通过这个文件实现对功能包的管理;
功能包集(stack):将几个具有某些功能的功能包组织在一起,如导航功能包集;
功能包集清单:stack.xml
消息类型:消息类型的说明存储在 my_package/msg/MyMessageType.msg 中
服务类型:对服务类型的描述说明文件在ROS中定义了服务的请求和响应的数据结构,存储在 mypackage/MyserviceType.srv 中;
1.1 功能包
如果你在一个文件夹下看到 manifest.xml ,那么这个文件夹很可能是一个功能包;其中
1.2 文件系统工具
ROS中大量代码分散在众多的packages和stacks之中. 使用Linux命令工具ls 和 cd已不能满足检索要求。因此ROS提供了一套自己的命令工具来完成与这些命令相似的工作. (要善于使用ros的命令工具,否则使用Linux命令将会很麻烦)
如果不知如何使用,可用 rosxxx help 查看此命令的用法:
1.2.1 rospack
USAGE: rospack
(1) find的参数,作用是返回相应package或者stack的目录路径
robot@robot:~$ rospack find rosaria_client
/home/robot/catkin_ws/src/rosaria_client
1.2.2 roscd
用于快速进入相关功能包的目录(若使用cd 则需输入完整目录)
robot@robot:~$ roscd rosaria_client
robot@robot:~/catkin_ws/src/rosaria_client$
1.2.3 rosed
可以使你通过package的名字直接编辑一个package中的文件而不用输入package的整个路径.
$ rosed [package_name] [filename]
robot@robot:~$ rosed rosaria_client teleop.cpp
1.2.4 roscp 从功能包复制文件
usage: roscp package filename target
roscp rosaria_client teleop.cpp ~/catkin_ws/src/1.cpp
1.2.5
roscd log用于切换到ROS存储知识文件的目录
1.2.6 使用rosls 用于列出指定的package和stack中的文件和目录
详见相关此链接:http://wiki.ros.org/rosbash 点击打开链接
2. 计算图级
ROS会创建一个连接到所有进程的网络,在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并将自身数据发布到网络上。
node : 就是一个可执行程序 topic :topic 是一个话题,节点发布消息到话题上面 message:在一个消息,消息是ROS的一个数据类型。用于订阅和发布一个话题 rosout :相当于 stdout master:节点服务器,用于帮助找到彼此的节点 |
rosnode list 能够列出所有活跃的节点 rostpolic list 所有节点运行的话题 roservice list 所有节点的运行服务 rosparam list 所有节点的参数 rosbag info .bag rosrun rqt_bag rqt_bag |
2.1 节点(Node):
节点是最主要的计算执行进程,最好让每一个节点具有特定的单一的功能;
2.2 主题(topic):
主题是由ROS网络对消息进行路由和消息管理的数据总线;保证了消息的发布者和订阅者之间相互解耦,完全无需知晓对方的存在;发布到主题上的消息必须与主题的ROS消息类型相匹配;
2.3 服务(service):
在发布主题时,正在发送的数据能够以多对多的方式交互,当你需要从某个节点获得一个请求或应答时,就不能通过主题来实现了。服务能够允许我们直接与某个节点进行交互;
服务关联在一个以功能包中 .srv 文件名称来命名的服务类型;
2.4 消息(message):
节点通过消息完成彼此的沟通;
2.5 消息记录包(bag):
是一种保存和回放ROS消息数据的文件格式;
2.6 节点管理器(master):
没有节点管理器,就不会有节点,服务,消息之间的通信;你可以在某一台计算机上运行节点管理器,在其他计算机上运行该节点管理器管理的节点;
节点管理器的作用是使ROS节点之间能够相互查找,一旦这些节点找到了彼此,就能够建立一种点对点的通信方式;
节点管理器通常使用 roscore 命令运行。
2.7 参数服务器(parameter server):
参数服务器能够使数据通过关键词存储在系统的核心位置,通过使用参数,能够在运行时配置节点或改变节点的工作任务;
3 ROS开源社区级
ROS wiki:
http://wiki.ros.org/cn
http://wiki.ros.org/
4. 基本操作
4.1 创建工作空间
在开始具体工作之前,首先要创建工作空间。进行接下来所有的工作都要保证系统在此工作空间下;
若要查看正在使用的工作空间,使用:
$ echo $ROS_PACKAGE_PATH
方式一:在ros下创建工作空间:
mkdir -p catkin_ws/src
cd src
catkin_init_workspace
cd ..
catkin_make
方式二:
NOTE: ~不可省;路径要输全; . 可用source 代替;详见入门篇基础教程;
4.2 创建功能包:
方式一:利用catkin创建package
cd ~/catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
创建程序包的一般格式是catkin_create_pkg ,此命令的格式包括功能包名称和依赖项,在上面示例中,依赖项包括std_msg、rospy和roscpp。
运行上面命令之后,在src文件夹下会生成一个与功能包名同名的文件夹,在该文件夹下有如下文件(夹)
workspace_folder/
src/
package_name/
include --文件夹
src --文件夹
CMakeLists.txt
package.xml
方式二:roscreate:
4.3 编译功能包:
方法一:利用catkin编译
用catkin编译的是上述第一种利用catkin创建的package,首先修改创建功能包时生成的CMakeLists.test文件,用gedit打开该文件,
⑴添加以下语句来查找添加的依赖包(暂时不需要此步)
find_package(catkin REQUIRED COMPONENTS
sensor_msgs
cv_bridge
image_transport)
find_package(OpenCV 2 REQUIRED)
find_package(PLC REQUIRED)
⑵添加以下语句来添加参与编译的节点程序
add_executable(node name src/node program)#添加可执行节点
target_link_libraries(node name ${catkin_LIBRARIES})#链接库
add_dependencies(node name package name_generator_messages_cpp)
#为可执行文件添加对生成的消息文件的依赖,因为catkin把所有的package并行的编译,
#所以如果你要使用其他catkin工作空间中其他package的消息,你同样也需要添加对他们各自生成的消息文件的依赖,
#感觉就是一个先导入头文件的过程。
除了可以在创建功能包时添加系统提供的依赖(catkin_create_pkg beginner_tutorials std_msgs rospy roscpp),也可以修改创建功能包时生成的package.xml文件,以图像处理中所需用到的包为例,加入了以下指令来说明后面增加的依赖包
<run_depend>sensor_msgsrun_depend>
<run_depend>image_transportrun_depend>
<run_depend>cv_bridgerun_depend>
利用catkin编译的方法是:
#under workspace
catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
方法二:利用rosmake编译
用rosmake编译的是上述第二种利用roscreate创建的package,同样的,在编译之前,需要修改CMakeLists.txt文件和manifest.xml文件,不同的地方是在修改CMakeLists.txt文件时需要加上如下语句来添加参与编译的节点程序:
rosbuild_add_executable(node_name src/node_name.cpp)
利用rosmkae编译的方法是:
#under workspace
rosmake package_name
运行以上命令之后,如果编译没有出错,在bin文件夹下可以看到生成的可执行文件,可以直接运行./node_name来运行节点。
3、运行编译完成之后的节点(不用launch,还不懂)
rosrun package_name node_name
注意:
1)创建功能包是在src目录下,而编译功能包是在workspace目录下。
2)编译之前要先确保添加了当前工作空间的path,查看方法是:
echo $ROS_PACKAGE_PATH
添加方法是source setup.bash文件(将你新创建的工作空间source到bash中)
#under the path: workspace
source ./devel/setup.bash
3)运行节点之前要先 roscore
4.4 使用ROS节点:
节点都是可执行程序,位于 packagename/bin 目录中,可用先前提到的命令查看相关节点信息;
启动一个新的节点:
$ rosrun turtlesim turtlesim_node
4.6 使用服务:
2.7 使用参数服务器:
2.8 创建节点:
实际操作即为在当前工作空间的功能包下的 src 文件夹 内创建 .cpp文件;
2.9 编译节点:
注: 如果编译后显示各种未定义,则需要在CMakeLists.txt 中的 target_link_libraries 处添加类似的一行。
2.10 创建msg 和 srv 文件:
在节点中创建msg 和srv 文件,他们是用于定义传输 数据的类型 和数据值的文件,ROS会根据这些文件的内容自动的为我们创建所需的代码,以便msg和srv文件能够被节点所使用。
4.11 使用新建的srv 和msg 文件
详见教材。