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

举报
zhangrelay 发表于 2021/07/14 22:34:40 2021/07/14
【摘要】 参数对于机器人而言非常重要,先通过一个简单的示例,就是之前的官方改版二维环境作演示,后续补充,更多丰富示例。 参数四大操作: 获取设置保存重载 概念 参数是节点的配置值,可以将参数视为节点设置。 节点可以将参数存储为整数、浮点数、布尔值、字符串和列表等。 在ROS 2中,每个节点都维护自己的参数。 所有参数都是可动态重新配置的,并且是基于ROS 2服务构建的。 预备条...

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

参数四大操作:

  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

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


  
  1. #define DEFAULT_BG_R 0x45
  2. #define DEFAULT_BG_G 0x56
  3. #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
  • 设置参数成功

如何做?


  
  1. # output response
  2. assert len(response.results) == 1
  3. result = response.results[0]
  4. if result.successful:
  5. msg = 'Set parameter successful'
  6. if result.reason:
  7. msg += ': ' + result.reason
  8. print(msg)
  9. else:
  10. msg = 'Setting parameter failed'
  11. if result.reason:
  12. msg += ': ' + result.reason
  13. 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

参数修改如下:


  
  1. /turtlesim:
  2. ros__parameters:
  3. background_b: 10
  4. background_g: 10
  5. background_r: 10
  6. use_sim_time: false

加载后,效果如下:

基本看不清机器人了……

换一组参数:


  
  1. /turtlesim:
  2. ros__parameters:
  3. background_b: 200
  4. background_g: 200
  5. background_r: 200
  6. use_sim_time: false
  • ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml

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

7 全部命令


  
  1. $ ros2 param
  2. usage: ros2 param [-h] Call `ros2 param <command> -h` for more detailed usage. ...
  3. Various param related sub-commands
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. Commands:
  7. delete Delete parameter
  8. describe Show descriptive information about declared parameters
  9. dump Dump the parameters of a node to a yaml file
  10. get Get parameter
  11. list Output a list of available parameters
  12. load Load parameter file for a node
  13. set Set parameter
  14. Call `ros2 param <command> -h` for more detailed usage.

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

总结

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

参数设置源码(python3)


  
  1. import sys
  2. from rcl_interfaces.msg import Parameter
  3. from ros2cli.node.direct import DirectNode
  4. from ros2cli.node.strategy import add_arguments
  5. from ros2cli.node.strategy import NodeStrategy
  6. from ros2node.api import get_absolute_node_name
  7. from ros2node.api import get_node_names
  8. from ros2node.api import NodeNameCompleter
  9. from ros2param.api import call_set_parameters
  10. from ros2param.api import get_parameter_value
  11. from ros2param.api import ParameterNameCompleter
  12. from ros2param.verb import VerbExtension
  13. class SetVerb(VerbExtension):
  14. """设置参数"""
  15. # """Set parameter."""
  16. def add_arguments(self, parser, cli_name): # noqa: D102
  17. add_arguments(parser)
  18. arg = parser.add_argument(
  19. 'node_name', help='Name of the ROS node')
  20. arg.completer = NodeNameCompleter(
  21. include_hidden_nodes_key='include_hidden_nodes')
  22. parser.add_argument(
  23. '--include-hidden-nodes', action='store_true',
  24. help='Consider hidden nodes as well')
  25. arg = parser.add_argument(
  26. 'parameter_name', help='Name of the parameter')
  27. arg.completer = ParameterNameCompleter()
  28. parser.add_argument(
  29. 'value', help='Value of the parameter')
  30. def main(self, *, args): # noqa: D102
  31. with NodeStrategy(args) as node:
  32. node_names = get_node_names(
  33. node=node, include_hidden_nodes=args.include_hidden_nodes)
  34. node_name = get_absolute_node_name(args.node_name)
  35. if node_name not in {n.full_name for n in node_names}:
  36. return 'Node not found'
  37. with DirectNode(args) as node:
  38. parameter = Parameter()
  39. Parameter.name = args.parameter_name
  40. parameter.value = get_parameter_value(string_value=args.value)
  41. response = call_set_parameters(
  42. node=node, node_name=args.node_name, parameters=[parameter])
  43. # output response
  44. assert len(response.results) == 1
  45. result = response.results[0]
  46. if result.successful:
  47. msg = "设置参数成功"
  48. #msg = 'Set parameter successful'
  49. if result.reason:
  50. msg += ': ' + result.reason
  51. print(msg)
  52. else:
  53. msg = 'Setting parameter failed'
  54. if result.reason:
  55. msg += ': ' + result.reason
  56. print(msg, file=sys.stderr)

-End-


 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/117229819

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。