Ros_运行的节点、话题、及参数、launch

Ros_运行的节点、话题、及参数、launch

(浅记一些学习ros的笔记

一、元功能包

  1. 作用:方便用户的安装,我们只需要这一个包就可以把其他相关的软件包组织到一起安装了。
  2. 首先:新建一个功能包(不添加 roscpp rospy std_msg 等依赖)
  3. 然后:修改 package.xml ,内容如下:
 <exec_depend>被集成的功能包</exec_depend>
 .....
 <export>
   <metapackage />
 </export>

  1. 最后:修改 CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(demo)
find_package(catkin REQUIRED)
catkin_metapackage()

PS:CMakeLists.txt 中不可以有换行。

二、launch

  1. XML 文件 启动多个节点,编写一个 launch
  2. <launch> 标签是所有 launch 文件的根标签,充当其他标签的容器,(属性之一:deprecated = “弃用声明”

launch 文件标签之 node

<node> 标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)

属性:(c 以后全是可选的

  1. pkg
  2. type
  3. name
  4. output =“screen|log”
  5. respawn =“true|false”
  6. required =“true|false”,如果 requried 设置为 true,则关闭后整个都是进程都得关闭
  7. args="xxx"传参数给节点
  8. ns=“xxx” 可以在节点名称加命名空间,避免重名问题,比如加了 ns=“hello”,那么 rosnode list 中可发现/hello/my_turtle

launch 文件标签之 include

代码复用

比如:

<include file="$(find 包名)/xxx/xxx.launch" ns="xx" />

launch 文件标签之 remap

话题重命名

<remap from="xx"  to="xx"/>

launch 文件标签之 param

<param> 标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在 <node> 标签中时,相当于私有命名空间。

  • name=“命名空间/参数名” 参数名称,可以包含命名空间

  • value=“xxx” (可选) 定义参数值,如果此处省略,必须指定外部文件作为参数源

  • type=“str | int | double | bool | yaml” (可选)

    指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:

  • 如果包含 ‘.’ 的数字解析浮点型,否则为整型

  • “true” 和 “false” 是 bool 值(不区分大小写)

  • 其他是字符串

launch 文件标签之 rosparam

ps:实行 dump 操作时候,最好新建一个 lauch 文件,因为在同一个 lauch 文件中,rosparam 会率先执行,再执行 node,导致无法导出 node 的参数。

<rosparam> 标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,<rosparam> 标签在 <node> 标签中时被视为私有。

  • command=“load | dump | delete” (可选,默认 load) 加载、导出或删除参数
  • file=“$(find xxxxx)/xxx/yyy…” 加载或导出到的 yaml 文件
  • param=“参数名称”
  • ns=“命名空间” (可选)

launch 文件标签之 group

<group> 标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间

1.属性

  • ns=“名称空间” (可选)
  • clear_params=“true | false” (可选) 启动前,是否删除组名称空间的所有参数(慎用…此功能危险)

2.子级标签

  • 除了 launch 标签外的其他标签

launch 文件标签之 arg

类似函数的传参

属性有 name,可选属性 default、value、doc

<launch>
    <arg name="xxx" />
    <param name="param" value="$(arg xxx)" />
</launch>

三、ROS 工作空间

查看环境变量

echo $ROS_PACKAGE_PATH

计算机按照环境变量的顺序执行

三、rosrun 设置节点命名空间与重映射

  1. 设置命名空间:rosrun 包名 节点名 __ns:=新名称
rosrun turtlesim turtlesim_node __ns:=/xxx

ps:使用环境变量也可以设置命名空间,启动节点前在终端键入如下命令:

export ROS_NAMESPACE=xxxx

  1. 名称重映射: rosrun 包名 节点名 __name:=新名称
rosrun turtlesim  turtlesim_node __name:=t1 |  rosrun turtlesim   turtlesim_node /turtlesim:=t1(不适用于python)

四、launch 文件设置节点命名空间与重映射

直接使用 node 的属性 ns 与 name 就行

五、 rosrun 设置话题命名空间与重映射

rosrun 名称重映射语法: rorun 包名 节点名 话题名:=新话题名称

六、 launch 文件设置话题命名空间与重映射

<node pkg="xxx" type="xxx" name="xxx">
    <remap from="原话题" to="新话题" />
</node>

七、编码设置话题

话题名称大致可以分为三种类型:

  • 全局(话题参考 ROS 系统,与节点命名空间平级)
  • 相对(话题参考的是节点的命名空间,与节点名称平级)
  • 私有(话题参考节点名称,是节点名称的子级)

在这里插入图片描述

1.C++ 实现
  1. 全局名称:以 / 开头的名称,和节点名称无关,比如下面设置的也是全局
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter/money",1000);

  1. 相对名称:非 / 开头的名称,参考命名空间(与节点名称平级)来确定话题名称
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);

  1. 私有名称:以 ~ 开头的名称,此时结果为/xxx/hello/chatter/money
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);

2.Python 实现
  1. 全局话题:以 / 开头的名称,和节点名称无关
pub = rospy.Publisher("/chatter",String,queue_size=1000)    

  1. 相对话题:**😗*非 / 开头的名称,参考命名空间(与节点名称平级)来确定话题名称
pub = rospy.Publisher("chatter",String,queue_size=1000)

  1. 私有:以 ~ 开头的名称
pub = rospy.Publisher("~chatter",String,queue_size=1000)

八、ROS 参数名称设置

  1. rosrun 命令行实现:** **rosrun 包名 节点名称 _参数名:=参数值

ps:一定要记得下滑线

  1. launch 设置参数:

可以在 node 标签外,或 node 标签中通过 param 或 rosparam 来设置参数。在 node 标签外设置的参数是全局性质的,参考的是 / ,在 node 标签中设置的参数是私有性质的,参考的是 /命名空间/节点名称。

参考 param 和 rosparam

  1. 编码方式
  2. cpp
  3. ros::param 设置参数
ros::param::set("/set_A",100); //全局,和命名空间以及节点名称无关
ros::param::set("set_B",100); //相对,参考命名空间
ros::param::set("~set_C",100); //私有,参考命名空间与节点名称

  1. ros::NodeHandle 设置参数
ros::NodeHandle nh;
nh.setParam("/nh_A",100); //全局,和命名空间以及节点名称无关

nh.setParam("nh_B",100); //相对,参考命名空间

ros::NodeHandle nh_private("~");
nh_private.setParam("nh_C",100);//私有,参考命名空间与节点名称    

  1. Py
rospy.set_param("/py_A",100)  #全局,和命名空间以及节点名称无关
rospy.set_param("py_B",100)  #相对,参考命名空间
rospy.set_param("~py_C",100)  #私有,参考命名空间与节点名称

九、ROS 分布式通信

ROS 对网络配置有某些要求:

  • 所有端口上的所有机器之间必须有完整的双向连接。
  • 每台计算机必须通过所有其他计算机都可以解析的名称来公告自己
  1. 先要保证不同计算机处于同一网络中,最好分别设置固定 IP,如果为虚拟机,需要将网络适配器改为桥接模式
  2. 修改不同计算机的 /etc/hosts 文件
从机的IP    从机计算机名 #主机端
主机的IP    主机计算机名 #从机端

IP 地址查看名: ifconfig

计算机名称查看: hostname

  1. 主机端 ~/.bashrc
export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=主机IP

从机端~/.bashrc

export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=从机IP

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值