机器人编程趣味实践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-
文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。
原文链接:zhangrelay.blog.csdn.net/article/details/117229819
- 点赞
- 收藏
- 关注作者
评论(0)