ROS知识梳理温习

10 篇文章 0 订阅
9 篇文章 1 订阅

ROS设计的灵魂就在于其分布式计算

节点之间通信的方式 : 话题(rostopic) 和 服务(rosservice)。
node几乎是无处不在,这个东西相当于可执行文件。可理解为就是cpp文件,经过catkin_make之后生成可执行文件。
一个 node 就是一个进程,进程就是程序的一次执行,因此节点只是 ROS 对进程的专有称呼.
topic话题提供一个平台,发布publisher消息与订阅subscriber消息都在上面,是多对多的间接message传递,
service服务消息是一对一的直接传递,它与topic区别就在于是消息直接传递还是间接传递。

rosnode list 查看节点
rostopic list 查看话题
rostopic type [topic]
rostopic echo [topic] (/turtle1/cmd_vel) //这个命令的作用就是来打印指定话题内的通信内容的

roslaunch可以用来启动定义在launch文件中的多个节点。
roswtf(ros-what the fuck)
这条命令会进行全面而深入的检测,包括检测你的环境变量、 安装的文件以及运行的节点。例如,roswtf 将会检测在安装过程 中 rosdep 初始化是否完成,任何节点是否出现了意外的挂起或者终止,以及活跃的节点是否正确地和其他节点相连接等。可惜的 是,由 roswtf 检测的完整列表只能在 Python 源码中才能找到。

message
message 是 topic 内容的数据类型,定义在 *.msg 文件中。message 可以理解为 C++ 中的int,float,类等,
ros message 消息类型
Bool
Byte
ByteMultiArray
Char
ColorRGBA
Duration
Empty
Float32
Float32MultiArray
Float64
Float64MultiArray
Header
Int16
Int16MultiArray
Int32
Int32MultiArray
Int64
Int64MultiArray
Int8
Int8MultiArray
MultiArrayDimension
MultiArrayLayout
String
Time
UInt16
UInt16MultiArray
UInt32
UInt32MultiArray
UInt64
UInt64MultiArray
UInt8
UInt8MultiArray

节点名与话题名

ros::init( argc, argv, “node1”); // 初始化节点

ros::NodeHandle nh;
// 声明发布者,话题名 = bar
// 声明节点句柄
ros::Publisher node1_pub = nh.advertise<std_msg::Int32>(“bar” , 10);
ros::Publisher node1_pub = nh.advertise<std_msg::Int32>(“/bar”, 10);
ros::Publisher node1_pub = nh.advertise<std_msg::Int32>(“~bar”, 10);
1、这里的节点名称是/node1  
2、用一个没有任何字符的相对形式的bar来声明一个发布者,这个话题将和/bar具有相同的名字。如果以如下所示使用斜杠(/)字符用作全局形式,话题名也是/bar。
3、如果使用波浪号(~)字符将其声明为私有,则话题名称将变为/node1/bar。

launch 文件写法如下:

在这里插入图片描述ROS提供了 主题(topic),服务(service),参数服务器(parameter service) 和动作库(actionlib) 这四种通信方式。
1、node 之间通过 publish - subscribe 方式通信。
一个节点可以发布多个话题,一个节点可以订阅多个话题。
topic 通信方式是异步通信。
2、而 service 通信方式则实现了同步通信。
两个节点之间的通信方式是request - reply 方式
在这里插入图片描述action采用了服务器端/客户端(client and server)的工作模式,如下图所示:
在这里插入图片描述client和server之间通过actionlib定义的“action protocol”进行通讯。这种通讯协议是基于ROS的消息机制实现的,为用户提供了client和server的接口,接口如下图所示:
在这里插入图片描述

client向server端发布任务目标以及在必要的时候取消任务
server会向client发布当前的状态实时的反馈最终的任务结果。

goal:任务目标
cancel:请求取消任务
status:通知client当前的状态
feedback:周期反馈任务运行的监控数据
result:向client发送任务的执行结果,这个topic只会发布一次。

message 是 topic 内容的数据类型,定义在 *.msg 文件中。
srv 是 service 通信方式的数据格式,定义在 *.srv 文件中。
ROS中的message是通过.msg文件来定义的,service是通过.srv定义,action通过.action文件定义,放置在功能包的action文件夹下,格式类似如下:

# Define the goal

uint32 dishwasher_id  # Specify which dishwasher we want to use

---

# Define the result

uint32 total_dishes_cleaned

---

# Define a feedback message 

float32 percent_complete

从上边的.action文件示例中,我们可以发现,定义一个action需要三个部分:goal、result、feedback. action确实是基于message实现的。
github上找到:https://github.com/huchunxu/ros_blog_sources

3、parameter service 参数服务器
参数服务器维护一个存储着各种参数的字典,字典就是为了方便读写一些不常改变的参数,给它们加上索引,这个索引是唯一的。

ROS消息传递中间件允许在不同节点之间进行通讯。这些节点可以用任何具有ROS客户端库的语言进行编程。我们可以在C++C以及Pythonjava中的其他节点上编写高性能的节点。
支持高端传感器和执行器。
模块化。
并发资源处理。
一、ROS文件系统
在这里插入图片描述
config:是ROS包中用到的所有配置文件的文件夹,由用户创建。
include/package_name:该文件夹包含我们使用的头文件和库。
scripts:脚本,该文件保存可执行的Python脚本。
src:用来存储C++ 源代码。
launch:该文件夹保存用于启动一个多多个ros节点的启动文件。
msg:该文件夹包含自定义的消息定义。
srv:该文件夹包含服务定义。
action:包含行为定义,行为(actionlib)。
package.xml:包清单文件。
CMakeLists.txt:该包的CMake构建文件。

ros包的命令,创建、修改、处理:
catkin_create_pkg:这个命令用于创建一个新包。
rospack:这个命令用于获取文件系统中包的信息。
catkin_make:这个命令用于在工作区中构建包。
rosdep:这个命令将安装这个包所需的系统依赖项

rosbash命令,用于导航和操作ROS包:
roscd:更改包文件夹。
roscp:用来从包中复制文件。
rosed:该命令用于编辑文件。
rosrun:该命令用于在包内运行可执行文件。

package.xml元素包括包的名称、版本、描述、作者的详细信息、包构建依赖项和运行时依赖项。<build_depend></build_depend>标记包含了构建包的源代码所必需的包。<run_depend></run_depend>标签中包在包节点运行时是必需的。
二、ROS计算图级
ROS的计算是通过一个称为ROS节点的过程网络完成的。这个计算网络可以称为计算图。计算图中的主要概念是ROS节点(nodes)、主机(Master)、参数服务器(Parameter server)、消息(messages)、话题(topic)、服务(service)和包(bag)。
工具:
rostopic、rosparam、rosservice、和rosnode.
在这里插入图片描述
节点(node):节点是执行计算的过程。每个ROS节点都是使用roscpp和rospy等ROS客户端库编写的。使用客户端库API,我们可以在 ROS 节点中实现不同类型的通信方法。ROS 节点的目标之一是构建简单的流程。

一个节点可以使用 ROS 话题、服务和参数与其他节点通信。

一个机器人可能包含许多节点,例如,一个节点处理摄像机图像,一个节点处理来自机器人的串行数据,一个节点可以用来计算 odometry 等等。
以下是 rosnode 的用法:
$ rosnode info [node_name]: 这将打印关于节点的信息。
 $ rosnode kill [node_name]: 这将杀死一个正在运行的节点。
 $ rosnode list: 这将列出正在运行的节点。
 $ rosnode machine [machine_name]: 这将列出在特定机器上运行的节点或机器列表。
 $ rosnode ping: 这将检查节点的连通性。
 $ rosnode clean: 这将清除无法访问的注册节点。

主机(Master):ROS 主机为节点的其他部分提供名称注册和查找。 如果节点不需要
找到彼此、交换消息或调用服务,而无需使用 ROS。在分布式系统中,我们应该在一台计算机上运行 master,而其他远程节点可以通过与这个主服务器通信来找到彼此。
参数服务器(Parameter server):参数服务器允许你将数据保存在中心位置。所有节点都可以访问和修改这些值。参数服务器是 ROS 主机(Master)的一部分。
消息(message):节点通过消息相互通信。消息只是一个包含类型化字段的数据结构,它可以保存一组数据,并且可以发送到另一个节点。有标准的基本类型(int、 float、 bool等等),这些都由 ROS 消息支持。我们还可以使用这些标准类型构建自己的消息类型。
*消息是一个包含字段类型的简单数据结构。 ROS 消息支持标准的原始数据类型和基本类型的数组。*节点还可以使用服务调用交换信息。服务也是消息,服务消息定义在 srv 中被处理。
例子:
我们可以使用下面的方法来访问消息的定义。例如,访问 std_msgs/msg/String.msg,我们可以使用 std_msgs/String。如果我们使用 roscpp 客户端,我们必须包含 std_msgs/String.h用于字符串消息的引用。
以下是与 rosmsg 一起使用的一些参数:
$ rosmsg show [message]: 这显示了消息描述。
 $ rosmsg list: 列出所有信息。
 $ rosmsg md5 [message]: 显示一条消息的 md5sum。
 $ rosmsg package [package_name]: 列出该包中的消息。
 $ rosmsg packages [package_1] [package_2]: 这个列表包包含消息。

话题(topic): ROS 中的每条消息都使用名为话题的命名总线进行传输。当节点通过话题发送消息时,我们可以说节点正在发布一个话题。当节点通过话题接收消息时,我们可以说节点订阅了一个话题。发布节点和订阅节点不知道彼此的存在。简而言之,信息的生产和消费是分离的。每个话题都有一个惟一的名称,任何节点都可以访问这个话题并通过它发送数据,只要它们有正确的消息类型。

ROS 话题被命名为总线,其中 ROS 节点交换消息。 话题可以匿名发布和订阅,这意味着消息的生成与消费是分离的。 ROS 节点不感兴趣知道哪个节点发布话题或订阅话题,它只查找话题名称,以及发布者和订阅者的消息类型是否匹配。
使用话题的通信是单向的,如果我们想要实现诸如通信之类的请求/响应,我们必须切
换到 ROS 服务。
ROS 节点使用称为 TCPROS 的 TCP/IP 传输方式与话题进行通信。此方法是在 ROS 中使用的缺省传输方法。另一种类型的通信是 UDPROS,它具有低延迟、松散的传输,并且只适合于远程操作。
ROS 话题工具可以用来获取关于 ROS 话题的信息。下面是这个命令的语法:
$ rostopic bw /topic: 此命令将显示给定话题所使用的带宽。
 $ rostopic echo /topic: 此命令将打印给定话题的内容。
 $ rostopic find /message_type: 该命令将使用给定的消息类型查找话题。
 $ rostopic hz /topic: 该命令将显示给定话题的发布速率。
 $ rostopic info /topic: 此命令将打印关于一个活动话题的信息。
 $ rostopic list: 该命令将列出 ROS 系统中的所有活动话题。
 $ rostopic pub /topic message_type args: 该命令可用于将值发布到带有消息类型的话题。
 $ rostopic type /topic: 这将显示给定话题的消息类型。

服务(service): 在一些机器人应用程序中,如果需要一个请求/响应交互,发布/订阅模型还不够。发布/订阅模型是一种单向传输系统,当我们使用分布式系统时,我们可能需要一个请求/响应类型的交互。在这种情况下使用 ROS 服务。使用 ROS 服务,我们可以编写服务器节点和客
户机节点。服务器节点以名称提供服务,当客户机节点向该服务器发送请求消息时,它将响应并将结果发送给客户机。

当我们在 ROS 中需要一个请求/响应类型的通信时,我们必须使用 ROS 服务。 ROS 话题不能进行这种交流,因为它是单向的。 ROS 服务主要用于分布式系统。
使用一对消息来处理 ROS 服务。我们必须在 srv 中定义请求数据类型和响应数据类型。
srv 文件保存在包的 srv 文件夹中。
在 ROS 服务中,一个节点充当 ROS 服务器,服务客户端可以从服务器请求服务。如果服务器完成了服务例程,它将把结果发送到服务客户端。
有两个ROS工具可以获取关于ROS服务的信息。第一个工具是rossrv,它类似于rosmsg,用于获取关于服务类型的信息。下一个命令是 rosservice,它用于列出和查询运行的 ROS 服务。

以下说明如何使用 rosservice 工具获取有关运行服务的信息:
 $ rosservice call /serveices args: 该工具将使用给定的参数调用服务。
 $ rosservice find service_type: 该命令将在给定的服务类型中找到服务。
 $ rosservice info /services: 这将打印关于给定服务的信息。
 $ rosservice list: 此命令将列出运行在系统上的活动服务。
 $ rosservice type /service: 该命令将打印给定服务的服务类型。
 $ rosservice uri /service: 此工具将打印服务 ROSRPC uri。

包(bags): 包是一种保存和播放 ROS 消息数据的格式。包是存储数据的重要机制,例如传感器数据,虽然很难收集,但对于开发和测试机器人算法是必要的。当我们使用复杂的机器人机制时,包是非常有用的功能。

ROS主机(Master)

ROS 的主机(Master)很像一个 DNS 服务器。当任何节点在 ROS 系统中启动时,它将开始寻找 ROS 主,并在其中注册节点的名称。因此, ROS 主机(Master)拥有当前在 ROS 系统上运行的所有节点的详细信息。当节点的任何细节发生变化时,它将生成一个回调并更新最新的详细信息。这些节点详细信息对于连接每个节点非常有用。

当节点开始发布话题时,节点将提供话题的详细信息,如名称和数据类型给 ROS 主机(Master)。ROS 主机(Master)将检查是否有其他节点订阅了相同的话题。如果任何节点都订阅了相同的话题, ROS 主机(Master)将向订阅者节点共享发布者的节点详细信息。*获取节点详细信息后,这两个节点将使用 TCPROS 协议进行互连,该协议基于 TCP/IP 套接字。*连接到两个节点后, ROS 主机(Master)没有控制它们的作用。我们可以根据我们的愿望,停止发布者节点或订阅者节点。如果我们停止任何节点,它将再次与 ROS 主机(Master)进行检查。同样的方法也适用于 ROS 服务。

ROS_MASTER_URI 环境变量包含了 ROS 的 IP 和端口。使用这个变量, ROS 节点可以找到 ROS 的主机(Master)。

当我们在一个系统中使用 ROS 时,我们可以使用 localhost 的 IP 或 localhost 本身的名称。但是在分布式网络中,在不同的物理计算机上进行计算时,我们应该正确地定义 ROS_MASTER_URI,只有这样,远程节点才可以相互联系并相互通信。在分布式系统中,我们只需要一个主服务器,它应该运行在一台计算机上,所有其他计算机都能正确地 ping 它,以确保远程的 ROS节点能够访问主节点。

使用 ROS 参数(parameter)
在本例中, ROS 提供了一个参数服务器,它是一个共享服务器,其中所有 ROS 节点都可以从这个服务器访问参数。节点可以从参数服务器读取、写入、修改和删除参数值。

参数服务器支持以下 XMLRPC 数据类型,其中包括:
• 32-bit integers
• Booleans
• strings
• doubles
• iso8601 dates
• lists
• base64-encoded binary data

用于从命令行获取和设置 ROS 参数的 rosparam 工具。下面是使用 ROS 参数的命令:
 $ rosparam set [parameter_name] [value]: 该命令将在给定参数中设置一个值。
 $ rosparam get [parameter_name]: 这个命令将从给定的参数中检索一个值。
 $ rosparam load [YAML 文件]: ROS 参数可以将保存到 YAML 文件中,并使用此命令加载到参
数服务器。
 $ rosparam dump [YAML 文件]: 该命令将将现有的 ROS 参数转储到 YAML 文件中。
 $ rosparam delete [parameter_name]: 这个命令将删除给定的参数。
 $ rosparam list: 该命令将列出现有参数名。

运行 ROS 主机(Master)和 ROS 参数服务器

在运行任何 ROS 节点之前,我们应该启动 ROS 主机和 ROS 参数服务器。我们可以使用一个名为 roscore 的命令启动 ROS MasterROS 参数服务器,它将启动以下程序:

ROS Master
ROS parameter server
rosout logging nodes

rosout 节点将从其他 ROS 节点收集日志消息,并将其存储在日志中,并将收集到的日志消息重新广播到另一个话题。

**

在运行任何 ROS 节点之前,命令 roscore 是一个先决条件。

**

创建一个 ROS 包
1、创建 ROS 包的第一个要求是创建 ROS catkin 工作区。下面是构建 catkin 工作区的过程。
在主目录中构建一个工作区文件夹,并在工作区文件夹中创建一个 src 文件夹:

$ mkdir ~/catkin_ws/src

切换到源文件夹。包是在这个包中创建的

$cd ~/catkin_ws/src

初始化 catkin 工作空间:

$ catkin_init_workspace

catkin_make 命令将构建以下工作空间:

$ catkin_make

我们应该使用以下命令添加包环境:

$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

catkin_create_pkg 命令用于创建一个 ROS 包

catkin_create_pkg 语法: catkin_create_pkg [package_name] [dependency1] [dependency2]

示例

$ catkin_create_pkg mastering_ros_demo_pkg roscpp std_msgs actionlib actionlib_msgs

使用 ROS 话题
话题是两个节点之间通信的基本方式。

创建节点
必 须 编 辑 包 中 CMakeLists.txt , 以 编 译 和 构 建 源 代 码 。

我们可以使用 rosnode 和 rostopic 工具来调试和理解两个节点的工作:
$ rosnode list: 这将列出活动节点。
 $ rosnode info demo_topic_publisher: 这将获得发布者节点的信息。
 $ rostopic echo /numbers: 这将显示通过/numbers 话题发送的值。
 $ rostopic type /numbers: 这将打印/numbers 话题的消息类型。

添加自定义的 msg 和 srv

消息的定义存储在一个.msg 文件和服务的定义.srv 文件。
消息的定义必须写在.msg 文件上,并且必须保存在包内的 msg 文件夹中。

添加消息的例子
第 一 步 是 编 辑 当 前 包 的 package.xml 内 容

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

编辑当前 CMakeLists.txt 并添加 message_generation 行

find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
actionlib
actionlib_msgs
message_generation
)
add_message_files(
FILES
demo_msg.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
actionlib_msgs
)

add_executable(demo_msg_publisher src/demo_msg_publisher.cpp)
add_executable(demo_msg_subscriber src/demo_msg_subscriber.cpp)
add_dependencies(demo_msg_publisher mastering_ros_demo_pkg_generate_
messages_cpp)
add_dependencies(demo_msg_subscriber mastering_ros_demo_pkg_generate_
messages_cpp)
target_link_libraries(demo_msg_publisher ${catkin_LIBRARIES})
target_link_libraries(demo_msg_subscriber ${catkin_LIBRARIES})

为了检查消息是否正确构建,我们可以使用 rosmsg 命令:

$ rosmsg show mastering_ros_demo_pkg/demo_msg

2019-10-14
添加服务的例子:
第 一 步 是 编 辑 当 前 包 的 package.xml 内 容

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

编辑 CMakeLists.txt 并在 catkin_package()中添加 message_runtime:

catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs actionlib actionlib_msgs message_runtime
)

使用 ROS 行为(actionlib)

行为(actionlib)包提供了一种标准的方法来实现这些
类型的抢占任务。 行为(actionlib)在机器人臂导航和移动机器人导航中被高度应用。我们可以看到如何实现行为服务器和行为客户端。

行为特效存储在行为的行为文件中,扩展名为.action。 该文件必须保存在 action 文件夹内,它位于 ROS 包的内部。
行为有以下几个部分:
目标: 行为客户端可以发送一个目标,该目标必须由行为服务器执行。这类似于 ROS服务中的请求。例如,如果一个机器人手臂关节想要从 45 度移动到 90 度,那么这里的目标是 90 度。
反馈: 当一个行为客户端向行为服务器发送一个目标时,它将开始执行回调函数。反馈只是在回调函数中给出当前操作的进展。
结果: 完成目标后, 行为服务器将发送完成的最终结果,可以是计算结果或确认。

创建 ROS 行为服务器

创建 ROS 行为客户端

构建ROS行为服务端与客户端

package.xml 与我们为 ROS 服务和消息所做的一样,应该包含 message generation 和runtime 包。
我们必须把 Boost 库包含在 CMakeLists.txt 中。
在 find_package()中传递 actionlib、 actionlib_msgs 和 message_generation:

find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
actionlib
actionlib_msgs
message_generation
)

将 Boost 作为一个系统依赖项:

## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)

在 add_action_files()中添加我们的行为

## Generate actions in the 'action' folder
add_action_files(
FILES
Demo_action.action
)

必须在 generate_messages()中添加 actionlib_msgs:

## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
actionlib_msgs
)

添加 Boost 以包括目录:

catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs 行为(actionlib) 行为(actionlib)_msgs
message_runtime
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)

话题、服务和行为(actionlib)在不同的场景中使用
话题是单向的通信方法,服务是双向的请求/应答类型的通信, 行为(actionlib)是 ROS 服务的一种修改形式,我们可以在需要时取消运行在服务器上的执行进程。

话题:机器人远程操作,发布 odometry,发送机器人变换(TF),发送机器人关节状态。
服务:将摄像机标定参数保存到文件中,在 SLAM 后保存机器人地图,并载入参数文件。
行为(actionlib): 这是用于运动规划和 ROS 导航堆栈。

三、在 ROS 中使用 3D 机器人模型
1、robot_model: ROS 有一个名为 robot_model 的元包,它包含帮助构建 3D 机器人模型的重要软件包。
2、urdf: robot_model 元包内的一个重要包是 urdf。 URDF 包包含一个用于统一机器人描述格式(URDF, Unified Robot Description Format)的 c++解析器,它是一个表示机器人模型的XML 文件。
3、可以使用 URDF 定义机器人模型、传感器和工作环境,并使用 URDF 解析器解析它。我们只能描述在 URDF 中有一个类似树状结构的机器人,也就是说,机器人将会有刚性连接,并通过关节连接。灵活的部件(link)不能用 URDF 来表示。 URDF 是使用特殊的 XML 标记组成的,我们可以使用解析器程序来解析这些 XML 标记以进行进一步的处理。
4、joint_state_publisher: 这个工具在设计使用 URDF 的机器人模型时非常有用。这个包包含一个名为 joint_state_publisher 的节点,该节点读取机器人模型描述,查找所有节点,并使用 GUI 滑动器向所有非固定节点发布关节值。用户可以使用该工具与每个机器人关节进行交互,并可以使用 RViz 进行可视化。在设计 URDF 时,用户可以通过这个工具验证 每 个 关 节 的 旋 转 和 平 移 。
5、 kdl_parser: 运动学和动态库(KDL, Kinematic and Dynamics Library)是一个 ROS 包,包含解析器工具,可以从 URDF 表示中构建 KDL 树。运动树可以用来发布关节状态,也可以用于机器人的正向和反向运动学。
6、robot_state_publisher:这个包读取当前的机器人连接状态,并使用从 URDF 构建的运动学树来发布每个机器人部件(link)的 3D 姿态。机器人的三维姿态被发表为 ROS tf (transform)。 ROS tf 发布机器人坐标系之间的关系。
7、xacro:xacro表示(XML宏),我们可以定义 xacro 等于 URDF 和附加组件。它包含一些附加组件,使 URDF 更短,可读性更好,并且可以用于构建复杂的机器人描述。我们可以在任何时候使用一些 ROS 工具将 xacro 转换为 URDF。

下面的标签是常用的 URDF 标签组成 URDF 机器人模型:
部件(link): 部件(link)标签表示机器人的单个部件(link)。使用这个标签,我们可以建模一个机器人部件(link)及其属性。建模包括尺寸、形状、颜色,甚至可以导入一个 3D 网格来表示机器人的部件(link)。
语法:

<link name="<name of the link>">
<inertial>...........</inertial>
<visual> ............</visual>
<collision>..........</collision>
</link>

在为这个机器人创建 urdf 之前,让我们创建三个文件夹,称为 urdfmesheslaunch。urdf 文件夹可以用来保存我们将要创建的 urdf/xacro。 meshes 文件夹保留了我们需要包含在urdf 中的模型,而 launch 文件夹则保存 ROS 的 launch 文件。

为差动驱动移动机器人创建机器人模型
Gazebo 是一个多机器人模拟器,用于复杂的室内和室外机器人仿真。

理解 ros_control 包
ros_control 包的实现包括机器人控制器、控制器管理器、硬件接口、不同的传输接口和控制工具箱。

导航堆栈包含了标准算法的实现,如 SLAM、 A *(star)、 Dijkstra、 AMCL 等,
ROS 导航堆栈的设计是通用的。有一些硬件需求应该由机器人来满足。以下的要求:
 导航包在差动驱动和完整系统中效果更好(机器人的总自由度等于机器人的可控自由度)。另外,移动机器人应该通过发送速度指令来控制: x: 速度(线速度), y: 速度(线速度)和 theta: 速度(角速度)。 机器人应该在机器人周围安装一个平面激光器。它被用来构建环境地图。导航堆栈对方形和圆形的移动底盘效果更好。它将在任意形状上工作,但是性能没有保证。

下面是对导航堆栈输入的所有块的解释:
Odometry source: 机器人的 Odometry 数据为机器人的起始位置提供机器人位置。主要的 odometry 是车轮编码器、 IMU 和 2D/3D 摄像机(视觉里程计)。 odom 值应该发布到导航堆栈,导航堆栈有一个消息类型nav_msgs/Odometry。 odom 消息可以保持机器人的位置和速度。 Odometry 数据是对导航堆栈的强制输入。
sensor source: 我们必须向导航堆栈提供激光扫描数据或点云数据,用于绘制机器人环境。这些数据和 odometry 结合起来构建了机器人的全局和局部代价地图。这里 使 用 的 主 要 传 感 器 是 激 光 测 距 仪 或 Kinect 3D 传 感 器 。 数 据 应 该 是sensor_msgs/LaserScan 或 sensor_msgs/PointCloud。
sensor transform/tf: 机器人应该使用 ROS tf 发布机器人坐标系之间的关系。
base_controller: 基本控制器的主要功能是转换导航堆栈的输出,这是一个twist(geometry_msgs/ twist)消息,并将其转换为相应的机器人的运动速度。
导航堆栈的可选节点amclmap 服务器,它允许机器人的定位和帮助保存/加载机器人地图。

理解move-base
下面是由 move_base 节点连接的所有包的列表:
global-planner: 这个包提供了从机器人当前位置到目标位置的最优路径规划的库和节点,与机器人地图有关。该包实现了路径查找算法,如 A*、 Dijkstra 算法等,以寻找从当前机器人位置到目标位置的最短路径。
local-planner: 该软件包的主要功能是在全局规划使用的全局路径的一部分中导航机器人。 局部规划器将采用里程表和传感器读数,并向机器人控制器发送适当的速度指令,以完成全局路径规划的一部分。基本的局部规划包是运行轨迹的实现和动态窗口算法。
rotate-recovery: 这个包可以帮助机器人通过 360 度旋转从局部障碍中恢复过来。
clear-costmap-recover: 这个包也用于从局部障碍物中恢复,通过将导航堆栈所使用的当前 costmap 转换为静态地图来清除 costmap。
costmap-2D: 这个包的主要用途是绘制机器人环境。机器人只能在地图上规划一条路径。在 ROS 中,我们创建 2D 或 3D 占用网格图,这是网格中环境的一种表示。每个单元格都有一个概率值,表示单元格是否被占用。 costmap-2D 包可以通过订阅激光扫描或点云的传感器值和 odometry 值来构建环境的网格地图。有全局导航的全局代价地图和局部导航的局部代价地图。
与 move_base 节点交互的其他包:
mapserver: 地图服务包允许我们保存和加载由 costmap-2D 包生成的地图。
AMCL: AMCL 是在地图中定位机器人的一种方法。该方法利用粒子滤波在概率论的帮助下,在地图上追踪机器人的姿态。在 ROS 系统中, AMCL 只能处理使用激光扫描构建的地图。
gmapping: gmapping 包是一个名为 Fast SLAM 的算法的实现,该算法采用激光扫描数据和 odometry 构建一个 2D 占用网格地图。

理解 pluginlib
插件是计算机界常用的术语。插件是一种模块化的软件,可以向现有的软件应用程序添加新特性。插件的优点是我们不需要在主软件中编写所有的功能; 相反,我们可以在主软件上建立一个基础功能来接受新的插件。使用这种方法,我们可以将软件的功能扩展到任何级别。
ROS 系统提供一个名为 pluginlib 的插件框架来动态加载/卸载插件,它可以是一个库或类。 pluginlib 是一个 c++库的集合,它帮助我们在需要的时候编写插件和加载/卸载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值