机器人编程趣味实践09-多彩背景(参数)
Posted zhangrelay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器人编程趣味实践09-多彩背景(参数)相关的知识,希望对你有一定的参考价值。
参数对于机器人而言非常重要,先通过一个简单的示例,就是之前的官方改版二维环境作演示,后续补充,更多丰富示例。
参数四大操作:
- 获取
- 设置
- 保存
- 重载
概念
参数是节点的配置值,可以将参数视为节点设置。 节点可以将参数存储为整数、浮点数、布尔值、字符串和列表等。 在ROS 2中,每个节点都维护自己的参数。 所有参数都是可动态重新配置的,并且是基于ROS 2服务构建的。
预备条件
- turtlesim
- source ROS 2
实践流程
1 开启
运行如下两个节点,注意在不同的终端:
- ros2 run turtlesim turtlesim_node
- 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-多彩背景(参数)的主要内容,如果未能解决你的问题,请参考以下文章