首页 > 其他分享 >ros2 创建发布和服务

ros2 创建发布和服务

时间:2023-11-02 18:58:01浏览次数:32  
标签:服务 msgs package 创建 rclcpp srv demo test ros2

1.创建工作空间

mkdir -p dev_ws/src

2.创建功能包

ros2 pkg create test_demo --build-type ament_cmake --node-name my_demo --dependencies std_msgs rclcpp

 3. 创建发布topic

    3.1 头文件

#include "rclcpp/rclcpp.hpp" //rclcpp/rclcpp.hpp是ROS2中常用C++接口的头文件,使用C++编写的ROS2节点程序一定需要包含该头文件 #include <sensor_msgs/msg/image.hpp> #include <cv_bridge/cv_bridge.h>

    3.2 实现

  //初始化函数    rclcpp::init(argc, argv);

//1.创建节点     

    rclcpp::Node::SharedPtr node_handle = rclcpp::Node::make_shared("test_demo");     //2.发布者发布“rgb_image”话题     rclcpp::Publisher<sensor_msgs::msg::Image>::SharedPtr pub = node_handle->create_publisher<sensor_msgs::msg::Image>("rgb_image",10);    //3. 设置发送频率  rclcpp::WallRate loop_rate(1);     while(rclcpp::ok()) {   sensor_msgs::msg::Image msg;   msg.encoding = sensor_msgs::image_encodings::RGB8;   .....       //4. 发布   pub->publish(msg);         loop_rate.sleep(); }

4. 添加依赖项

  4.1 package.xml

在dev_ws/src/test_dmo/package.xml中,ament_cmake描述的编译依赖过后之后粘贴下面两行 添加:

<exec_depend>rclcpp</exec_depend>

 

   <buildtool_depend>std_msgs</buildtool_depend>     <buildtool_depend>sensor_msgs</buildtool_depend>     <buildtool_depend>cv_bridge</buildtool_depend>  //rgb需要       <depend>std_msgs</depend>     <depend>sensor_msgs</depend>     <depend>cv_bridge</depend>

  //rgb图像需要

4..2 CMakeLists.txt

 打开同目录下的CMakeLists.txt文件。在已有的依赖find_package(ament_cmake REQUIRED)下面添加:

find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)

find_package(cv_bridgeREQUIRED)

然后设置编译规则,添加一个my_demo(节点)的可执行文件,以便ros2 run可以运行这个文件

add_executable(my_demo src/test_demo.cpp) ament_target_dependencies(test_demo rclcpp std_msgs sensor_msgs cv_bridge)

然后需要添加install(TARGETS…)部分以便于ros2 run可以找到这个可执行文件

install(TARGETS   test_demo   DESTINATION lib/${PROJECT_NAME}

5. 编译

 回到工作空间目录: 

 colcon build 

或者 colcon build --package-select test_demo

6. 运行

 回到工作空间目录: 

 source install/setup.bash

 ros2 run test_demo my_demo

7.rivz2 查看图像

8. 同一个node下创建服务

   8.1 创建srv 文件

   cd dev_ws/src/test_demo

   mkdir srv

   touch AddTwoInts.srv

   srv文件内容:

int64 a
int64 b
---
int64 sum

  8.2 配置

   package.xml添加:

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

CMakeLists.txt中添加:

#添加依赖

find_package(rosidl_default_generators REQUIRED)

#声明srv文件所属工程

rosidl_generate_interfaces(${PROJECT_NAME} "srv/AddTwoInts.srv" DEPENDENCIES )

  # 为了使用同一个包中的msg,srv,需要rosidl_target_interfaces, 把.srv编译成对应的头文件(通过ROS2的IDL模块 产生了头文件), 必须要有,否则找不到服务的头文件   rosidl_target_interfaces(test_demo ${PROJECT_NAME}  "rosidl_typesupport_cpp")

8.3 编译

 回到工作空间: colcon build

8.4实现

//源文件件中引入服务的头文件,编译时自动生成

  #include "test_demo/srv/add_two_ints.hpp"       //2. 创建服务   rclcpp::Service<test_demo::srv::AddTwoInts>::SharedPtr service =       node_handle->create_service<test_demo::srv::AddTwoInts>("add_two_ints", &add);    //3.一直等待服务回调        rclcpp::spin(node_handle);       //4. add回调函数 void add(const std::shared_ptr<test_demo::srv::AddTwoInts::Request> request,           std::shared_ptr<test_demo::srv::AddTwoInts::Response>  response) {   response->sum = request->a + request->b;   RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %d" " b: %d",                 request->a, request->b);   RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%d]", (long int)response->sum); }  

8.4编译

回到工作空间目录: 

 colcon build 

或者 colcon build --package-select test_demo

8.5. 运行

 回到工作空间目录: 

 source install/setup.bash

 ros2 run test_demo my_demo
8.6 测试服务   打开另一个终端
 source install/setup.bash //注意:key 后的:要有空格   ros2 service call /add_two_ints test_demo/srv/AddTwoInts '{a: 22,b: 33}'
8.7 相关命令   ros2 service list -t    

标签:服务,msgs,package,创建,rclcpp,srv,demo,test,ros2
From: https://www.cnblogs.com/april55/p/17805960.html

相关文章

  • 微服务架构
    (1)什么是微服务微服务顾名思义,就是很小的服务,所以它属于面向服务架构的一种。微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基......
  • 新一代云原生可观测平台之CCE服务监控篇
    本文分享自华为云社区《新一代云原生可观测平台之CCE服务监控篇》,作者:云容器大未来。在云原生容器化浪潮的当下,监控是确保业务稳定性最受关注的问题之一。那么,华为云CCE容器服务又是如何帮助用户提高运维效率呢?半年来,CCE容器服务的运维团队持续拜访用户,并总结用户在云原生运维场景......
  • Prometheus+Grafana实现服务性能监控:windows主机监控、Spring Boot监控、Spring Cloud
    1、Prometheus介绍Prometheus使用Go语言开发,中文名称叫:普罗米修斯。Prometheus是一个开源系统最初在SoundCloud构建的监控和警报工具包。自2012年成立以来,许多公司和组织已经采用了Prometheus,它现在是一个独立的开源项目并独立于任何公司进行维护。Prometheus于2016年加入云......
  • 使用idea以Maven方式创建父子工程项目
    idea版本:2019.2.4maven版本:3.6.1 1.创建父工程2.建子工程(module)3.删除无用文件夹 ......
  • 合适的网站服务器怎么挑
    选择适合的网站服务器是一个关键的决策,它将影响您网站的性能、可用性和安全性。以下是一些关于如何选择网站服务器的指南:明确需求:首先,明确您的需求。考虑您网站的性质、流量、数据存储需求、数据库需求和特殊功能。不同类型的网站可能需要不同类型的服务器。类型选择:根据您的需求,选......
  • 新一代云原生可观测平台之CCE服务监控篇
    本文分享自华为云社区《新一代云原生可观测平台之CCE服务监控篇》,作者:云容器大未来。在云原生容器化浪潮的当下,监控是确保业务稳定性最受关注的问题之一。那么,华为云CCE容器服务又是如何帮助用户提高运维效率呢?半年来,CCE容器服务的运维团队持续拜访用户,并总结用户在云原生运维......
  • Jtti:香港服务器促销70% off,100M带宽@不限流$ 99.3/月,免费20G DDoS防御
    Jtti:香港服务器促销70%off,100M带宽@不限流$ 99.3/月,免费20GDDoS防御 Jtti针对香港服务器发布了特价促销,70%off,每月仅需$ 99.3,具体配置为XeonE5-2660、500GSSD、16GB内存、100M大带宽@不限流,免费20G防御,可以安装Linux或者Windows操作系统。除了香港服务器以外,新加坡和美国机......
  • 阿里云服务器 ubuntu 20.04 执行命令添加apt仓库时报错 安装docker报错
    云服务器ECS初始安装docker报错##############出错时候看下面#####################执行命令添加apt仓库时:sudoadd-apt-repositoryppa:ondrej/php&&sudoapt-getupdate报错:sudo:add-apt-repository:commandnotfound解决办法:先执行:apt-get-yinstallsoftware-pro......
  • javaapi、spark、flink 创建Iceberg表,hive 和impala无法正常读取解决
    spark、flink创建Iceberg表中,元数据存储在hive的meta_store,发现hive或者impala无法正常读取报错。事实上解决方案是在spark、flink的SQL中执行语句:addiceberg相关引擎的runntime的jar;ALTERTABLEtSETTBLPROPERTIES('storage_handler'='org.apache.iceberg.mr.hive......
  • 前端歌谣的刷题之路-第六十八题-js动态创建节点
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......