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;
}
相关推荐
zylyehuo4 天前
ROS1(20.04 noetic) + PX4 + AirSim
ros·drone
想要成为计算机高手5 天前
11. isaacsim4.2教程-Transform 树与Odometry
人工智能·机器人·自动驾驶·ros·rviz·isaac sim·仿真环境
Zhichao_977 天前
【ROS1】09-ROS通信机制——参数服务器
ros
想要成为计算机高手8 天前
10. isaacsim4.2教程-RTX Lidar 传感器
数码相机·机器人·ros·仿真·具身智能·vla·isaacsim
城北有个混子8 天前
【机器人】—— 3. ROS 架构 & 文件系统
机器人·ros
Mr.Winter`11 天前
轨迹优化 | 基于边界中间值问题(BIVP)的路径平滑求解器(附C++/Python仿真)
人工智能·机器人·自动驾驶·ros·路径规划·数值优化·轨迹优化
Hi2024021712 天前
基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
数码相机·docker·ros·相机·机器视觉·ros2·单目测距
想要成为计算机高手13 天前
9. isaacsim4.2教程-ROS加相机/CLOCK
人工智能·机器人·ros·仿真·具身智能·isaacsim
Dirschs22 天前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros