ros(28):ros基础知识学习:roscore、ros master、ros::init()、roslaunch
roscore、rosmaster
目录
1. roscore
1.1 简介:
roscore是节点和程序的集合,这些节点和程序是基于ROS的系统所必需的,于是可以称为ros核心core服务即名字。必须运行 roscore 才能使 ROS 节点进行通信。它是使用 roscore 命令启动的。
注:注意:如果使用 roslaunch,当检测到 roscore 尚未运行,将自动启动 roscore(除非提供 --wait 参数)。
roscore命令这个会启动:
·a ROS Master (即ros系统中用于通信的主机/主节点)
·a ROS Parameter Server(ros参数服务器)
·a rosout logging node(一个输出日志节点)
1.2 默认使用方式
默认使用方式不改变ROS_MASTER_URI(即ros系统中主机的统一位置表示符),
(1)roscore启动时
ROS_MASTER_URI默认为http://meng:11311/(meng为计算机名)
(2)roslaunch 启动时
ROS_MASTER_URI默认为:http://localhost:11311
我觉得是因为roslaunch启动默认将 ROS_MASTER_URI 进行了替换,在下面这个ros自带文件中,每次启动roslaunch都会默认替换ROS_MASTER_URI为http://localhost:11311
/opt/ros/kinetic/etc/catkin/profile.d/10.roslaunch.sh
# roslaunch/env-hooks/10.roslaunch.sh
if [ ! "$ROS_MASTER_URI" ]; then #意思应该是ROS_MASTER_URI不存在时
export ROS_MASTER_URI=http://localhost:11311
fi
示例:
新建一个空的launch文件
<?xml version="1.0" encoding="UTF-8"?>
<launch>
</launch>
1.3 更改ROS_MASTER_URI
此时需要提前声明变量或在环境配置文件 .bashrc 里面修改/添加ros主机的统一位置标识符这个全局变量声明,两种方式:
1.3.1 临时修改
声明变量方式为一次性的,只在当前终端内有效。(如下图)
# 修改示例
# export ROS_MASTER_URI=http://YourPC:1234/
export ROS_MASTER_URI=http://meng:1234/
左侧终端输入:
export ROS_MASTER_URI=http://meng:1234/
# 这里更改了端口port号,roscore后面需要加上
roscore -p 1234
ROS_MASTER_URI为http://meng:1234/
右侧终端输入:
roscore
ROS_MASTER_URI为默认的http://meng:11311/
但感觉会比较鸡肋,在当前终端启动roscore,在别的终端启动程序无法和当前终端通信。。。
1.3.2 永久修改
在环境配置文件 .bashrc 里面修改/添加 是永久性的,不过,为了避免出现问题,一般不建议修改啦。
修改:
sudo gedit ~/.bashrc
#添加 ROS_MASTER_URI=http://meng:1234/ 这条语句
source ~/.bashrc
示例:
可以发现该修改更加“全局”,能够正常使用,不过启动roscore时也需要带上 -p 1234
2. ROS Master 主节点
2.1 简介
ROS 主节点为 ROS 系统中的其余节点提供命名和注册服务。它跟踪主题和服务的发布者和订阅者。主节点的作用是使各个 ROS 节点能够相互定位。一旦这些节点彼此定位,它们就会相互通信。
主节点还提供参数服务器。
主节点通常使用 roscore 命令运行,该命令将 ROS 主服务器与其他基本组件一起加载。
2.2 数据传输/程序接口
ROS Master提供了一个基于XMLRPC的API,ROS客户端库(如roscpp和rospy)调用该API来(与ROS 服务端)存储和检索信息。但大多数 ROS 用户不需要直接与此 API 交互。
2.2.1 API
API(Application Program Interface)被定义为应用程序可用以与计算机操作系统/网络操作系统交换信息和命令的标准集。
2.2.2 XMLRPC
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
3 ros::init()
3.1 简介
ros::init()函数作用:用以初始化节点。这为 ROS 提供了命令行参数,并允许您命名节点并指定其他选项。
3.2 使用样式
通常,ros::init() 的形式符合:
void ros::init(<command line or remapping arguments>, \
std::string node_name, uint32_t options);
#或
void ros::init(argc, argv, \
std::string node_name, uint32_t options);
3.2.1 参数介绍
argc and argv(或<command line or remapping arguments>)
ROS 使用它们从命令行解析重新映射参数。
node_name:
这是将分配给节点的名称,除非它被其中一个重新映射参数覆盖。节点名称在整个 ROS 系统中必须是唯一的。如果第二个节点以与第一个节点相同的名称启动,则第一个节点将自动关闭。如果您希望运行多个相同的节点而不必担心唯一地命名它们,则可以使用下面描述的init_options::AnonymousName选项。
options:
这是一个可选参数,允许您指定更改 roscpp 行为的某些选项。该字段是位字段,因此可以指定多个选项。
3.2.2 常见使用方式
两个ros::init()函数最常见的使用方式为:
ros::init(argc, argv, "my_node_name");
和
ros::init(argc, argv, "my_node_name", ros::init_options::AnonymousName);
这种使用方式可以尝试用多个launch文件启动一个节点(可以分别配置不同参数)
3.2.3 ros::init_options
ros::init_options::NoSigintHandler
不要安装 SIGINT 处理程序。在这种情况下,您应该安装自己的 SIGINT 处理程序,以确保节点在退出时正确关闭。请注意,SIGINT 的默认操作往往是终止进程,因此,如果要执行自己的 SIGTERM 处理,则还必须使用此选项。
ros::init_options::AnonymousName
匿名化节点名称。在节点名称的末尾添加一个随机数,以使其唯一。
ros::init_options::NoRosout
不要将 rosconsole 输出广播到 /rosout 主题。
4 roslaunch
4.1 简介
roslaunch是一个工具,用于通过SSH在本地和远程轻松启动多个ROS节点,以及在参数服务器上设置参数。它包括自动重生已经死亡的进程的选项。roslaunch 接收一个或多个 XML 配置文件(扩展名为 .launch),这些文件指定要设置的参数和要启动的节点,以及应运行它们的计算机。
4.2 roslaunch参数赋值顺序
roslaunch 在一次传递中评估 XML 文件(.launch文件),按深度优先遍历顺序进行处理。
按顺序评估标记,最后一个设置优先。因此,如果一个参数有多个设置,则将使用为该参数指定的最后一个值。
参考链接:
roscore :
ros master
百度百科:XMLRPC、API
ros::init():
roscpp/Overview/Initialization and Shutdown - ROS Wiki
roslaunch:
更多推荐
所有评论(0)