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

Posted zhangrelay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器人编程趣味实践09-多彩背景(参数)相关的知识,希望对你有一定的参考价值。

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

参数四大操作:

  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

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

#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
  • 设置参数成功

如何做?

            # 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

参数修改如下:

/turtlesim:
  ros__parameters:
    background_b: 10
    background_g: 10
    background_r: 10
    use_sim_time: false

加载后,效果如下:

基本看不清机器人了……

换一组参数:

/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 全部命令

$ 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)

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-


 

以上是关于机器人编程趣味实践09-多彩背景(参数)的主要内容,如果未能解决你的问题,请参考以下文章

机器人编程趣味实践03-运算(+ - × ÷)

机器人编程趣味实践19-武林秘籍(文档)

机器人编程趣味实践18-他山之石(功能包)

机器人编程趣味实践04-逻辑判断(if)

机器人编程趣味实践07-信息交互(主题)

机器人编程趣味实践06-程序(节点)