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;
}
相关推荐
Dirschs2 天前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
Mr.Winter`4 天前
轨迹优化 | 基于激光雷达的欧氏距离场ESDF地图构建(附ROS C++仿真)
c++·人工智能·机器人·自动驾驶·ros·ros2·具身智能
kyle~6 天前
计算机视觉---RealSense深度相机技术
人工智能·数码相机·计算机视觉·机器人·嵌入式·ros·传感器
龙猫略略略6 天前
ros+px4仿真中的二维激光雷达消息
ros·px4·激光雷达
Eric.Lee20216 天前
ROS2的topic桥接ROS1
ros·ros2到ros1桥接·ros的topic
Mr.Winter`7 天前
障碍感知 | 基于3D激光雷达的三维膨胀栅格地图构建(附ROS C++仿真)
人工智能·机器人·自动驾驶·ros·具身智能·环境感知
kyle~8 天前
ROS2---话题重映射
机器人·嵌入式·ros·控制·电控
城北有个混子9 天前
【机器人】—— 1. ROS 概述与环境搭建
机器人·ros
龙猫略略略21 天前
px4仿真使用fastlio的定位数据飞行
ros·px4·xtdrone·激光slam·fastlio