前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器人编程趣味实践09-多彩背景(参数)

机器人编程趣味实践09-多彩背景(参数)

作者头像
zhangrelay
发布2021-12-02 12:37:19
3220
发布2021-12-02 12:37:19
举报

参数对于机器人而言非常重要,先通过一个简单的示例,就是之前的官方改版二维环境作演示,后续补充,更多丰富示例。

参数四大操作:

  1. 获取
  2. 设置
  3. 保存
  4. 重载

概念

参数是节点的配置值,可以将参数视为节点设置。 节点可以将参数存储为整数、浮点数、布尔值、字符串和列表等。 在ROS 2中,每个节点都维护自己的参数。 所有参数都是可动态重新配置的,并且是基于ROS 2服务构建的。

预备条件

  1. turtlesim
  2. source ROS 2

实践流程

1 开启

运行如下两个节点,注意在不同的终端:

  1. ros2 run turtlesim turtlesim_node
  2. ros2 run turtlesim turtle_teleop_key

2 参数列表

再新开启一个终端,输入如下命令:

  • ros2 param list

可以看到如下:

每个节点都有参数use_sim_time; 它不是turtlesim独有的。

通过命名规范,可以猜测到/turtlesim参数,决定了背景色。

通过ros2 param get获取参数值。

3 参数获取

使用下面命令获取参数,通用格式:

  • ros2 param get <node_name> <parameter_name>

具体如下:

  • ros2 param get /turtlesim background_r
  • ros2 param get /turtlesim background_g
  • ros2 param get /turtlesim background_b

和源代码中的默认值(整形):

代码语言:javascript
复制
#define DEFAULT_BG_R 0x45
#define DEFAULT_BG_G 0x56
#define DEFAULT_BG_B 0x00

完全一致,显示为10进制,代码中为16进制。

4 参数设置

通用格式命令:

  • ros2 param set <node_name> <parameter_name> <value>

具体使用:

  • ros2 param set /turtlesim background_r 150

设置成功后,会有提示,前后对比如下:

曾经~

现在~

这是临时设置,并没有保存哦。

使用set命令设置参数只会在当前的会话中更改它们,而不会永久更改。 但是,可以保存设置更改,并在下次启动节点时重新加载它们。

在学习保存之前,先将提示改为中文。

  • Set parameter successful
  • 设置参数成功

如何做?

代码语言:javascript
复制
            # output response
            assert len(response.results) == 1
            result = response.results[0]
            if result.successful:
                msg = 'Set parameter successful'
                if result.reason:
                    msg += ': ' + result.reason
                print(msg)
            else:
                msg = 'Setting parameter failed'
                if result.reason:
                    msg += ': ' + result.reason
                print(msg, file=sys.stderr)

修改对应代码,然后效果如下:

5 参数转储

可以使用以下命令将节点的所有当前参数值“转储”到文件中以供以后保存:

  • ros2 param dump <node_name>

要保存/ turtlesim参数的当前配置,请输入以下命令:

  • ros2 param dump /turtlesim

终端将返回以下消息:

在运行工作空间的目录中找到一个新文件。如果打开此文件,则会看到以下内容:

如果希望将来使用相同的参数重新加载节点,则转储参数会很方便。

6 加载参数文件

使用保存的参数值启动同一节点,请使用:

  • ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

启动turtlesim的同一命令,带有添加的标志--ros-args和--params-file,以及加载的文件。

停止运行的当前turtlesim节点,以便您可以尝试使用保存的参数重新加载它,方法是:

  • ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml

参数修改如下:

代码语言:javascript
复制
/turtlesim:
  ros__parameters:
    background_b: 10
    background_g: 10
    background_r: 10
    use_sim_time: false

加载后,效果如下:

基本看不清机器人了……

换一组参数:

代码语言:javascript
复制
/turtlesim:
  ros__parameters:
    background_b: 200
    background_g: 200
    background_r: 200
    use_sim_time: false
  • ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml

turtlesim窗口应照常显示,但带有设置文件中的对应背景色。

7 全部命令

代码语言:javascript
复制
$ ros2 param 
usage: ros2 param [-h] Call `ros2 param <command> -h` for more detailed usage. ...

Various param related sub-commands

optional arguments:
  -h, --help            show this help message and exit

Commands:
  delete    Delete parameter
  describe  Show descriptive information about declared parameters
  dump      Dump the parameters of a node to a yaml file
  get       Get parameter
  list      Output a list of available parameters
  load      Load parameter file for a node
  set       Set parameter

  Call `ros2 param <command> -h` for more detailed usage.

汉化工作和源码学习同步进行^_^

总结

节点具有定义其默认配置值的参数,可以从命令行获取和设置参数值,还可以将参数设置保存到文件中以在以后的会话中重新加载。

参数设置源码(python3)

代码语言:javascript
复制
import sys

from rcl_interfaces.msg import Parameter
from ros2cli.node.direct import DirectNode
from ros2cli.node.strategy import add_arguments
from ros2cli.node.strategy import NodeStrategy
from ros2node.api import get_absolute_node_name
from ros2node.api import get_node_names
from ros2node.api import NodeNameCompleter
from ros2param.api import call_set_parameters
from ros2param.api import get_parameter_value
from ros2param.api import ParameterNameCompleter
from ros2param.verb import VerbExtension


class SetVerb(VerbExtension):
    """设置参数"""
#    """Set parameter."""

    def add_arguments(self, parser, cli_name):  # noqa: D102
        add_arguments(parser)
        arg = parser.add_argument(
            'node_name', help='Name of the ROS node')
        arg.completer = NodeNameCompleter(
            include_hidden_nodes_key='include_hidden_nodes')
        parser.add_argument(
            '--include-hidden-nodes', action='store_true',
            help='Consider hidden nodes as well')
        arg = parser.add_argument(
            'parameter_name', help='Name of the parameter')
        arg.completer = ParameterNameCompleter()
        parser.add_argument(
            'value', help='Value of the parameter')

    def main(self, *, args):  # noqa: D102
        with NodeStrategy(args) as node:
            node_names = get_node_names(
                node=node, include_hidden_nodes=args.include_hidden_nodes)

        node_name = get_absolute_node_name(args.node_name)
        if node_name not in {n.full_name for n in node_names}:
            return 'Node not found'

        with DirectNode(args) as node:
            parameter = Parameter()
            Parameter.name = args.parameter_name
            parameter.value = get_parameter_value(string_value=args.value)

            response = call_set_parameters(
                node=node, node_name=args.node_name, parameters=[parameter])

            # output response
            assert len(response.results) == 1
            result = response.results[0]
            if result.successful:
                msg = "设置参数成功"
                #msg = 'Set parameter successful'
                if result.reason:
                    msg += ': ' + result.reason
                print(msg)
            else:
                msg = 'Setting parameter failed'
                if result.reason:
                    msg += ': ' + result.reason
                print(msg, file=sys.stderr)

-End-

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 预备条件
  • 实践流程
    • 1 开启
      • 2 参数列表
        • 3 参数获取
          • 4 参数设置
            • 5 参数转储
              • 6 加载参数文件
                • 7 全部命令
                • 总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档