4.1 发布订阅独立式
not_composable_pub.cpp #文件名称,此代码风格已经不被推荐了.
/*
*第1种发布风格,此风格已经不被推荐了
*
*/
#include <iostream>
#include <chrono>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std::chrono_literals;
int main(int argc, char* argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("minimal_publisher");
auto publisher = node->create_publisher<std_msgs::msg::String>("topic", 10);
std_msgs::msg::String message;
auto publish_count = 0;
rclcpp::WallRate loop_rate(500ms);
while (rclcpp::ok()){
message.data = "Hello world!" + std::to_string(publish_count++);
RCLCPP_INFO(node->get_logger(), "Publishing:'%s'", message.data.c_str());
publisher->publish(message);
rclcpp::spin_some(node);
loop_rate.sleep();
}
rclcpp::shutdown();
std::cout << "This is a test" << std::endl;
return 0;
}
# 初始化环境变量
C:\dev\ros2_example_ws> call C:\dev\ros2_dashing\local_setup.bat
#编译功能包
C:\dev\ros2_example_ws> colcon build
C:\dev\ros2_example_ws> call install\local_setup.bat
#运行节点
C:\dev\ros2_example_ws> ros2 run xhome_rcl_cpp xpublisher_not_composable
/****************************************************************************************
* 文件名称:not_composable_sub.cpp 文件.
*
****************************************************************************************/
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
rclcpp::Node::SharedPtr g_node= nullptr;
void topic_callback(const std_msgs::msg::String::SharedPtr msg)
{
RCLCPP_INFO(g_node->get_logger(), "I heard: '%s'", msg->data.c_str());
}
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
g_node = rclcpp::Node::make_shared("minimal_subscribe");
auto subscription = g_node->create_subscription<std_msgs::msg::String>("topic", 10, topic_callback);
rclcpp::spin(g_node);
rclcpp::shutdown();
subscription = nullptr;
g_node = nullptr;
return 0;
}
4.2 发布与类定时器回调式
member_function_pub.cpp
#include <chrono>
#include <memory>
#include <iostream>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std::chrono_literals;
class MinimalPublisher:public rclcpp::Node
{
public:
MinimalPublisher():Node("Minimal_publisher"), count_(0)
{
publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
timer_ = this->create_wall_timer(500ms,
std::bind(&MinimalPublisher::timer_callback, this));
}
private:
void timer_callback(){
auto message = std_msgs::msg::String();
message.data = "Hello , world! " + std::to_string(count_++);
RCLCPP_INFO(this->get_logger(), "Publishing:'%s'", message.data.c_str());
publisher_->publish(message);
}
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
size_t count_;
};
int main(int argc , char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalPublisher>());
rclcpp::shutdown();
return 0;
}
/****************************************************************************************
* member_function_sub.cpp 订阅文件.
*
****************************************************************************************/
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using std::placeholders::_1;
class MinimalSubscriber: public rclcpp::Node
{
public:
MinimalSubscriber():Node("Minimal_subscriber")
{
subscription_ = this->create_subscription<std_msgs::msg::String>("topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));
}
private:
void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
{
RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalSubscriber>());
rclcpp::shutdown();
return 0;
}
4.3 发布与订阅lambda式
lambda_pub.cpp
#include <chrono>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std::chrono_literals;
class MinimalPublisher : public rclcpp::Node
{
public:
MinimalPublisher():Node("minimal_publisher"), count_(0)
{
publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
auto timer_callback = [this]()->void {
auto message = std_msgs::msg::String();
message.data = "Hello world! " + std::to_string(this->count_++);
RCLCPP_INFO(this->get_logger(), "Publishing :'%s' ", message.data.c_str());
this->publisher_->publish(message);
};
timer_ = this->create_wall_timer(500ms,timer_callback);
}
private:
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
size_t count_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalPublisher>());
rclcpp::shutdown();
return 0;
}
/*****************************************************************************************
*lambda_sub.cpp 文件 订阅者
*
****************************************************************************************/
#include <iostream>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class MinimalSubscriber:public rclcpp::Node
{
public:
MinimalSubscriber():Node("Minimal_subsriber")
{
subscription_ = this->create_subscription<std_msgs::msg::String>("topic", 10,
[this](std_msgs::msg::String::UniquePtr msg){
RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
});
}
private:
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalSubscriber>());
rclcpp::shutdown();
return 0;
}
4.4 配置与编译
# CMakeLists.txt
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
add_executable(xpublisher_not_composable src/not_composable_pub.cpp )
ament_target_dependencies(xpublisher_not_composable rclcpp std_msgs)
add_executable(xpublisher_member_function src/member_function_pub.cpp)
ament_target_dependencies(xpublisher_member_function rclcpp std_msgs)
add_executable(xpublisher_lambda src/lambda_pub.cpp)
ament_target_dependencies(xpublisher_lambda rclcpp std_msgs)
add_executable(xsubscriber_not_composable src/not_composable_sub.cpp)
ament_target_dependencies(xsubscriber_not_composable rclcpp std_msgs)
add_executable(xsubscriber_member_function src/member_function_sub.cpp)
ament_target_dependencies(xsubscriber_member_function rclcpp std_msgs)
add_executable(xsubscriber_lambda src/lambda_sub.cpp)
ament_target_dependencies(xsubscriber_lambda rclcpp std_msgs)
install(TARGETS
xpublisher_lambda
xpublisher_not_composable
xpublisher_member_function
xsubscriber_lambda
xsubscriber_not_composable
xsubscriber_member_function
DESTINATION lib/${PROJECT_NAME}
)
#package.xml
<build_depend>rclcpp</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>rclcpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
C:\dev\ros2_example_ws> call C:\dev\ros2_dashing\local_setup.bat
C:\dev\ros2_example_ws> colcon build --symlink-install
C:\dev\ros2_example_ws> call install\local_setup.bat
C:\dev\ros2_example_ws> ros2 run xhome_rcl_cpp xpublisher_lambda