ros topic和service的使用

在做ldiar slam的时候,最常用的当属topic,偶尔也会用一下service,action则很少使用。现在一块来看一下topic的使用。

一、topic的使用

topic的消息订阅和发布

复制代码
#include<ros/ros.h>
#include<rosbag/bag.h>
#include<rosbag/view.h>
#include<std_msgs/String.h>
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>
#include<pcl/conversions.h>
#include<pcl_conversions/pcl_conversions.h>
#include<opencv2/opencv.hpp>

#include<image_transport/image_transport.h>
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/PointCloud2.h>
#include<sensor_msgs/Imu.h>
#include<nav_msgs/Odometry.h>
#include<sensor_msgs/LaserScan.h>
#include<sensor_msgs/Range.h>
#include<turtlesim/Spawn.h>
#include<std_srvs/Trigger.h>

class DataProcess
{
   public:
        DataProcess()
        {

        }

public:
    void processPointCloud2(const sensor_msgs::PointCloud2::ConstPtr& pc)
    {

    }

    void imuCallback(const sensor_msgs::Imu::ConstPtr& imuMsg)
    {
         std::cout<< imuMsg->linear_acceleration.x<< "   "<<  imuMsg->linear_acceleration.y<< "   "<<  imuMsg->linear_acceleration.z<< " \n";
    }



pcl::PointCloud<pcl::PointXYZI> pointxyz;
   pointxyz.width = 100;
   pointxyz.height = 1;
   pointxyz.resize(pointxyz.height * pointxyz.width);
     srand(time(nullptr));
     for(int i = 0;i < 100; i ++)
     {
        pointxyz.points[i].x = (rand()% 1000) / 10.0;
        pointxyz.points[i].y = (rand()% 1000) / 10.0;
        pointxyz.points[i].z = (rand()% 1000) / 10.0;
     }

     //-------------------------------------------点云的生成和转化----------------------------顺利完成---------------------
      // 这个函数在pcl_conversion./pcl_conversion.h文件中
      sensor_msgs::PointCloud2 pointCloudMsg;
      pointCloudMsg.header.stamp = ros::Time().now();
      pointCloudMsg.header.frame_id = "/camera_init";
      pcl::toROSMsg(pointxyz,pointCloudMsg);
      pcl::PointCloud<pcl::PointXYZI> pointxyzi2;
      pcl::fromROSMsg(pointCloudMsg, pointxyzi2);

      for( int i = 0; i < pointxyzi2.points.size();i ++ )
      {
            std::cout<< pointxyzi2.points[i].x<<"   "
            << pointxyzi2.points[i].y<<"   "
            << pointxyzi2.points[i].z<<"\n";
      }

    pcl::PointCloud<pcl::PointXYZI> point3;
    pcl::moveFromROSMsg(pointCloudMsg,point3);
          for( int i = 0; i < point3.points.size();i ++ )
      {
            std::cout<< point3.points[i].x<<"   "
            << point3.points[i].y<<"   "
            << point3.points[i].z<<"****\n";
      }

}

二、service的使用

以spawn为例子,学习service的使用。这个例子比较简洁,这样很容易学会。

1)客户端

复制代码
#include<ros/ros.h>
#include<turtlesim/spawn.h>

int main(int argc, char** argv)
{
   turtlesim::Spawn  spawn;
   spawn.request.x = 0.0;
   spawn.request.y = 1.0;
   spawn.request.theta = 1.0;
   spawn.request.name = "turtle2";

   ros::service::waitForService("/showspawn");
   ros::ServiceClient client = nh_.serviceClient<turtlesim::Spawn>("/showspawn");
   client.call(spawn);
}

2)服务端

复制代码
#include<ros/ros.h>
#include<turtlesim/Spawn.h>

  bool srvCallback1(turtlesim::Spawn::Request &req, turtlesim::Spawn::Response& respond)
   {
        respond.name = req.name;
        std::cout<<  respond.name <<std::endl;

        return true;
   }
int main(int argc, char** argv)
{
    ros::init(argc, argv, "rosbaglearn1");
    ros::NodeHandle nh_;
    ros::ServiceServer srv = nh_.advertiseService("/showspawn",  srvCallback1 );
   ros::spin();
    return 0;
}
相关推荐
前网易架构师-高司机2 天前
ROS2 Jazzy+Gazebo Harmonic 环境下,用 URDF 搭建机器人,配置物理属性、插件与桥接,修复车轮和激光雷达故障 (手把手保姆级教程)
开发语言·算法·golang·机器人·ros
波特率11520012 天前
在ROS2当中两种rmw比较(CycloneDDS和FastDDS)
ros·ros2·dds
kobesdu17 天前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
波特率11520017 天前
ROS2当中的几个关键的环境变量
机器人·ros·ros2
勤自省17 天前
ROS2从入门到“重启解决”:21讲8~12章踩坑血泪史与核心总结
linux·开发语言·ubuntu·ssh·ros
kobesdu19 天前
【ROS2实战笔记-20】ROS2 bag 录播与时间模拟:从基础操作到高级调试技巧
笔记·机器人·ros·ros2
kobesdu19 天前
【ROS2实战笔记-18】ROS2 通信的隐秘控制:DDS 配置参数如何决定系统性能
网络·人工智能·笔记·机器人·开源·ros·人形机器人
kobesdu19 天前
Cartographer 定位优化:降低计算量、提升实时性与稳定性
ros·移动机器人·cartographer
kobesdu22 天前
【ROS2实战笔记-14】多机器人系统的三层工具箱:从零基础集群到跨仿真实现
笔记·机器人·ros
dragen_light22 天前
6.ROS2-topic
ros