ROS入门_1.19 总结篇: ROS基础概念与基本操作

来源:互联网 发布:网络刷手兼职可信吗 编辑:程序博客网 时间:2024/06/11 20:52

一:ros的系统架构

    ros系统架构主要分为三个部分:

文件系统级

计算图级

开源社区级

1. 文件系统级


功能包(package):是ROS中软件组织的基本形式,一个功能包具有最小的结构和最少的内容,用于创建ROS程序;--指的是一种特定的文件结构和文件夹组合

功能包清单:manifests.xml  通过这个文件实现对功能包的管理;

功能包集(stack):将几个具有某些功能的功能包组织在一起,如导航功能包集;

功能包集清单:stack.xml

消息类型:消息类型的说明存储在 my_package/msg/MyMessageType.msg 中

服务类型:对服务类型的描述说明文件在ROS中定义了服务的请求和响应的数据结构,存储在 mypackage/MyserviceType.srv 中;


1.1 功能包

      如果你在一个文件夹下看到 manifest.xml ,那么这个文件夹很可能是一个功能包;其中<depend> 标记显示当前功能包安装之前必须先安装哪些功能包;<export> 标记告诉系统编译该功能需要使用什么编译标志,引用哪些头文件等;


1.2 文件系统工具 
    ROS中大量代码分散在众多的packages和stacks之中. 使用Linux命令工具ls 和 cd已不能满足检索要求。因此ROS提供了一套自己的命令工具来完成与这些命令相似的工作. (要善于使用ros的命令工具,否则使用Linux命令将会很麻烦)

    如果不知如何使用,可用 rosxxx help 查看此命令的用法:


1.2.1 rospack

     USAGE: rospack <command> [options] [package]

(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_clientrobot@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/srccatkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • 1
  • 2
  • 1
  • 2

创建程序包的一般格式是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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

⑵添加以下语句来添加参与编译的节点程序

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的消息,你同样也需要添加对他们各自生成的消息文件的依赖,#感觉就是一个先导入头文件的过程。
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

除了可以在创建功能包时添加系统提供的依赖(catkin_create_pkg beginner_tutorials std_msgs rospy roscpp),也可以修改创建功能包时生成的package.xml文件,以图像处理中所需用到的包为例,加入了以下指令来说明后面增加的依赖包

<run_depend>sensor_msgs</run_depend> <run_depend>image_transport</run_depend> <run_depend>cv_bridge</run_depend> 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

利用catkin编译的方法是:

#under workspacecatkin_make [make_targets] [-DCMAKE_VARIABLES=...]
  • 1
  • 2
  • 1
  • 2

方法二:利用rosmake编译 
用rosmake编译的是上述第二种利用roscreate创建的package,同样的,在编译之前,需要修改CMakeLists.txt文件和manifest.xml文件,不同的地方是在修改CMakeLists.txt文件时需要加上如下语句来添加参与编译的节点程序:

rosbuild_add_executable(node_name src/node_name.cpp)
  • 1
  • 1


利用rosmkae编译的方法是:

#under workspacerosmake package_name
  • 1
  • 2
  • 1
  • 2

运行以上命令之后,如果编译没有出错,在bin文件夹下可以看到生成的可执行文件,可以直接运行./node_name来运行节点。 
3、运行编译完成之后的节点(不用launch,还不懂)

rosrun package_name node_name
  • 1
  • 1

注意: 
1)创建功能包是在src目录下,而编译功能包是在workspace目录下。 
2)编译之前要先确保添加了当前工作空间的path,查看方法是:

echo $ROS_PACKAGE_PATH
  • 1
  • 1

添加方法是source setup.bash文件(将你新创建的工作空间source到bash中)

#under the path: workspacesource ./devel/setup.bash
  • 1
  • 2
  • 1
  • 2

3)运行节点之前要先 roscore

  4.4 使用ROS节点:

    节点都是可执行程序,位于 packagename/bin 目录中,可用先前提到的命令查看相关节点信息;

启动一个新的节点:

$ rosrun turtlesim turtlesim_node


4.5  使用主题与节点交互







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 文件

  详见教材。