前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROS2机器人编程简述humble-第二章-Controlling the Iterative Execution .3.1

ROS2机器人编程简述humble-第二章-Controlling the Iterative Execution .3.1

作者头像
zhangrelay
发布2023-02-01 17:30:08
6830
发布2023-02-01 17:30:08
举报

2.3 ANALYZING THE BR2 BASICS PACKAGE 这一节内容有些多……

前一篇:

ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2

里面只有节点,没有任何实际功能。

logger.cpp代码如下所示:

代码语言:javascript
复制
#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);

  auto node = rclcpp::Node::make_shared("logger_node");

  rclcpp::Rate loop_rate(500ms);
  int counter = 0;
  while (rclcpp::ok()) {
    RCLCPP_INFO(node->get_logger(), "Hello %d", counter++);

    rclcpp::spin_some(node);
    loop_rate.sleep();
  }

  rclcpp::shutdown();
  return 0;
}

这是一段代码“实现在固定时间执行任务“

周期:rclcpp::Rate loop_rate(500ms);

消息:RCLCPP_INFO(node->get_logger(), "Hello %d", counter++);

ROS消息通常具备时间戳!

rclcpp::spin_some(node);

参考官方文档如下:

rclcpp::spin

Create a default single-threaded executor and spin the specified node.

创建默认的单线程执行器并跳转指定的节点。

rclcpp::spin_some

Create a default single-threaded executor and execute any immediately available work.

创建默认的单线程执行器并执行任何立即可用的工作。

rclcpp::spin_until_future_complete

rcl_interfaces/msg/Log.msg

# Debug is for pedantic information, which is useful when debugging issues. byte DEBUG=10 # Info is the standard informational level and is used to report expected # information. byte INFO=20 # Warning is for information that may potentially cause issues or possibly unexpected # behavior. byte WARN=30 # Error is for information that this node cannot resolve. byte ERROR=40 # Information about a impending node shutdown. byte FATAL=50 # # Fields # # Timestamp when this message was generated by the node. builtin_interfaces/Time stamp # Corresponding log level, see above definitions. uint8 level # The name representing the logger this message came from. string name # The full log message. string msg # The file the message came from. string file # The function the message came from. string function # The line in the file the message came from. uint32 line

重要图示:

ros2 run br2_basics logger

ros2 topic echo /rosout

ros2 interface show rcl_interfaces/msg/Log

另一种实现方法:

代码语言:javascript
复制
#include "rclcpp/rclcpp.hpp"

using namespace std::chrono_literals;

class LoggerNode : public rclcpp::Node
{
public:
  LoggerNode()
  : Node("logger_node")
  {
    counter_ = 0;
    timer_ = create_wall_timer(
      500ms, std::bind(&LoggerNode::timer_callback, this));
  }

  void timer_callback()
  {
    RCLCPP_INFO(get_logger(), "Hello %d", counter_++);
  }

private:
  rclcpp::TimerBase::SharedPtr timer_;
  int counter_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);

  auto node = std::make_shared<LoggerNode>();

  rclcpp::spin(node);

  rclcpp::shutdown();
  return 0;
}

计时器控制控制回路。该计时器以所需频率产生事件。当发生此事件时,它调用处理它的回调。优点是节点在内部调整执行频率,而不将此决定委托给外部代码。安排节点以了解它们的运行频率。

timer_ = create_wall_timer(

500ms, std::bind(&LoggerNode::timer_callback, this));


rclcpp: ROS Client Library for C++

rclcpp provides the canonical C++ API for interacting with ROS. It consists of these main components:

Node

rclcpp::Node

rclcpp/node.hpp

Publisher

rclcpp::Node::create_publisher()

rclcpp::Publisher

rclcpp::Publisher::publish()

rclcpp/publisher.hpp

Subscription

rclcpp::Node::create_subscription()

rclcpp::Subscription

rclcpp/subscription.hpp

Service Client

rclcpp::Node::create_client()

rclcpp::Client

rclcpp/client.hpp

Service Server

rclcpp::Node::create_service()

rclcpp::Service

rclcpp/service.hpp

Timer

rclcpp::Node::create_wall_timer()

rclcpp::WallTimer

rclcpp::TimerBase

rclcpp/timer.hpp

Parameters:

rclcpp::Node::set_parameters()

rclcpp::Node::get_parameters()

rclcpp::Node::get_parameter()

rclcpp::Node::describe_parameters()

rclcpp::Node::list_parameters()

rclcpp::Node::add_on_set_parameters_callback()

rclcpp::Node::remove_on_set_parameters_callback()

rclcpp::Parameter

rclcpp::ParameterValue

rclcpp::AsyncParametersClient

rclcpp::SyncParametersClient

rclcpp/parameter.hpp

rclcpp/parameter_value.hpp

rclcpp/parameter_client.hpp

rclcpp/parameter_service.hpp

Rate:

rclcpp::Rate

rclcpp::WallRate

rclcpp/rate.hpp

There are also some components which help control the execution of callbacks:

Executors (responsible for execution of callbacks through a blocking spin):

rclcpp::spin()

rclcpp::spin_some()

rclcpp::spin_until_future_complete()

rclcpp::executors::SingleThreadedExecutor

rclcpp::executors::SingleThreadedExecutor::add_node()

rclcpp::executors::SingleThreadedExecutor::spin()

rclcpp::executors::MultiThreadedExecutor

rclcpp::executors::MultiThreadedExecutor::add_node()

rclcpp::executors::MultiThreadedExecutor::spin()

rclcpp/executor.hpp

rclcpp/executors.hpp

rclcpp/executors/single_threaded_executor.hpp

rclcpp/executors/multi_threaded_executor.hpp

CallbackGroups (mechanism for enforcing concurrency rules for callbacks):

rclcpp::Node::create_callback_group()

rclcpp::CallbackGroup

rclcpp/callback_group.hpp

Additionally, there are some methods for introspecting the ROS graph:

Graph Events (a waitable event object that wakes up when the graph changes):

rclcpp::Node::get_graph_event()

rclcpp::Node::wait_for_graph_change()

rclcpp::Event

List topic names and types:

rclcpp::Node::get_topic_names_and_types()

Get the number of publishers or subscribers on a topic:

rclcpp::Node::count_publishers()

rclcpp::Node::count_subscribers()

And components related to logging:

Logging macros:

Some examples (not exhaustive):

RCLCPP_DEBUG()

RCLCPP_INFO()

RCLCPP_WARN_ONCE()

RCLCPP_ERROR_SKIPFIRST()

rclcpp/logging.hpp

Logger:

rclcpp::Logger

rclcpp/logger.hpp

rclcpp::Node::get_logger()

Finally, there are many internal API's and utilities:

Exceptions:

rclcpp/exceptions.hpp

Allocator related items:

rclcpp/allocator/allocator_common.hpp

rclcpp/allocator/allocator_deleter.hpp

Memory management tools:

rclcpp/memory_strategies.hpp

rclcpp/memory_strategy.hpp

rclcpp/message_memory_strategy.hpp

rclcpp/strategies/allocator_memory_strategy.hpp

rclcpp/strategies/message_pool_memory_strategy.hpp

Context object which is shared amongst multiple Nodes:

rclcpp::Context

rclcpp/context.hpp

rclcpp/contexts/default_context.hpp

Various utilities:

rclcpp/duration.hpp

rclcpp/function_traits.hpp

rclcpp/macros.hpp

rclcpp/scope_exit.hpp

rclcpp/time.hpp

rclcpp/utilities.hpp

rclcpp/visibility_control.hpp

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档