ROS2 入门应用 引用自定义消息(C++)
- 1. 查看自定义消息
- 2. 修改话题发布
- 3. 修改话题订阅
- 4. 修改依赖关系
- 5. 修改编译信息
- 6. 编译和运行
1. 查看自定义消息
引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg
ros2 interface show tutorial_interfaces/msg/Sphere
# geometry_msgs/Point center
# float64 x
# float64 y
# float64 z
# float64 radius
需要对《ROS2 入门应用 发布和订阅(C++)》中创建的发布者/订阅者功能包稍作修改
cd ~/ros2_ws/src/cpp_pubsub/src
将把数值的字符串更改为球体半径
2. 修改话题发布
修改publisher_member_function.cpp
话题发布源文件,涉及话题类型变更和应用变化
#include <chrono>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/msg/sphere.hpp" // CHANGE
/* 方便表示时间 */
using namespace std::chrono_literals;
/* 继承rclcpp:: node创建节点类MinimalPublisher */
class MinimalPublisher : public rclcpp::Node
{
public:
/* 公共构造函数将节点命名为minimal_publisher,并将count_初始化为0 */
MinimalPublisher()
: Node("minimal_publisher"), count_(0)
{
/* 初始化发布者publisher_ ,使用Sphere消息类型、主题名称topic和在发生备份时限制消息所需的队列大小10 */
publisher_ = this->create_publisher<tutorial_interfaces::msg::Sphere>("topic", 10); // CHANGE
/* 初始化timer_,设置timer_callback函数每500ms执行一次 */
timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this));
}
private:
/* 定义定时器回调函数 */
void timer_callback()
{
/* 打印并发布球体半径信息 */
auto message = tutorial_interfaces::msg::Sphere(); // CHANGE
message.radius = this->count_++; // CHANGE
RCLCPP_INFO_STREAM(this->get_logger(), "Publishing: '" << message.radius << "'"); // CHANGE
publisher_->publish(message);
}
/* 计时器、发布者和计数器字段的声明 */
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<tutorial_interfaces::msg::Sphere>::SharedPtr publisher_; // CHANGE
size_t count_;
};
int main(int argc, char * argv[])
{
/* 初始化ROS2 */
rclcpp::init(argc, argv);
/* 运行节点MinimalPublisher */
rclcpp::spin(std::make_shared<MinimalPublisher>());
/* 退出ROS2 */
rclcpp::shutdown();
return 0;
}
3. 修改话题订阅
修改subscriber_member_function.cpp
话题订阅源文件,涉及话题类型变更和应用变化
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/msg/sphere.hpp" // CHANGE
/* 占位符,代替回调函数中的第一个参数 */
using std::placeholders::_1;
/* 继承rclcpp:: node创建节点类MinimalSubscriber */
class MinimalSubscriber : public rclcpp::Node
{
public:
/* 公共构造函数将节点命名为minimal_subscriber */
MinimalSubscriber()
: Node("minimal_subscriber")
{
/* 初始化订阅者subscription_ ,使用Sphere消息类型、主题名称topic和在发生备份时限制消息所需的队列大小10,
订阅话题回调函数topic_callback */
subscription_ = this->create_subscription<tutorial_interfaces::msg::Sphere>( // CHANGE
"topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));
}
private:
/* 定义订阅话题回调函数 */
void topic_callback(const tutorial_interfaces::msg::Sphere & msg) const // CHANGE
{
/* 打印话题消息的球体半径信息 */
RCLCPP_INFO_STREAM(this->get_logger(), "I heard: '" << msg.radius << "'");
}
/* 订阅者字段的声明 */
rclcpp::Subscription<tutorial_interfaces::msg::Sphere >::SharedPtr subscription_; // CHANGE
};
int main(int argc, char * argv[])
{
/* 初始化ROS2 */
rclcpp::init(argc, argv);
/* 运行节点MinimalSubscriber*/
rclcpp::spin(std::make_shared<MinimalSubscriber>());
/* 退出ROS2 */
rclcpp::shutdown();
return 0;
}
4. 修改依赖关系
在package.xml
清单文件中,添加对自定义消息的依赖项的声明
<depend>tutorial_interfaces</depend>
5. 修改编译信息
在CMakeLists.txt
编译文件中
- 更换搜索库
tutorial_interfaces
- 更换可执行文件目标依赖关系
tutorial_interfaces
#... find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(tutorial_interfaces REQUIRED) # CHANGE add_executable(talker src/publisher_member_function.cpp) ament_target_dependencies(talker rclcpp tutorial_interfaces) # CHANGE add_executable(listener src/subscriber_member_function.cpp) ament_target_dependencies(listener rclcpp tutorial_interfaces) # CHANGE install(TARGETS talker listener DESTINATION lib/${PROJECT_NAME}) ament_package()
6. 编译和运行
进入工作空间根目录
cd ~/ros2_ws
编译:
colcon build --packages-select cpp_pubsub
打开一个新终端,运行话题发布节点:
ros2 run cpp_pubsub talker
# [INFO] [minimal_publisher]: Publishing: '0'
# [INFO] [minimal_publisher]: Publishing: '1'
# [INFO] [minimal_publisher]: Publishing: '2'
打开一个新终端,运行话题订阅节点:
ros2 run cpp_pubsub listener
# [INFO] [minimal_subscriber]: I heard: '10'
# [INFO] [minimal_subscriber]: I heard: '11'
# [INFO] [minimal_subscriber]: I heard: '12'
谢谢
评论(0)
您还未登录,请登录后发表或查看评论