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;
}
相关推荐
勤自省17 小时前
ros生态系统
ros
kobesdu19 小时前
ROS导航调参指南:机器人模型、TEB/DWA与Costmap全解析
人工智能·机器人·ros
勤自省19 小时前
在Ubuntu20.04上安装ROS
linux·ros
绍磊leo2 天前
ROS2 企业级构建脚本:告别繁琐的命令行操作
ros
kobesdu4 天前
ORB-SLAM3:从特征提取到稠密点云建图
机器人·ros·orbslam
kobesdu5 天前
FAST-LIO2 + 蓝海M300激光雷达:从建图到实时栅格图的完整流程
算法·机器人·ros·slam·fast lio
kobesdu6 天前
综合强度信息的激光雷达去拖尾算法解析和源码实现
算法·机器人·ros·slam·激光雷达
ZTL-NPU6 天前
Jetbrains开发ros
ide·python·pycharm·编辑器·ros·clion
kobesdu8 天前
ROS Flutter GUI App:跨平台机器人可视化控制界面使用记录
flutter·机器人·ros
kobesdu8 天前
LeRobot “机器人万能接口”:现状与前沿进展
机器人·ros