ROS学习:机械臂抓取自定义消息数据类型,话题msg和服务srv通信(C++实现)

2023-05-16

       

创建文件

mkdir -p ros_basic/src
cd ros_basic/
catkin init
catkin build
catkin create pkg ros_define_data --catkin-deps std_msgs roscpp rospy

 

话题通信

grasp.msg文件代码如下

uint16 x
uint16 y
float64 z
float64 angle
float64 width

发布话题

#include "ros/ros.h"
#include <ros_define_data/grasp.h>

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"grasp_publisher");
    ros::NodeHandle n;
    ros::Publisher grasp_info_pub = n.advertise<ros_define_data::grasp>("/grasp_info",10);
    ros::Rate loop_rate(1);

    int count = 0;
    while(ros::ok())
    {
        // 初始化ros_define_data::grasp类型的消息
        ros_define_data::grasp grasp_msg;
        grasp_msg.x = 100;
        grasp_msg.y = 181;
        grasp_msg.z = 0.324;
        grasp_msg.angle = 1.252;
        grasp_msg.width = 3.05;

        // 发布消息
        grasp_info_pub.publish(grasp_msg);

        ROS_INFO("Subcribe grasp Info: pos:(%d,%d),depth:%f,angle:%f,width:%f",
            grasp_msg.x,grasp_msg.y,grasp_msg.z,grasp_msg.angle,grasp_msg.width);
        
        // 按照循环频率延时
        loop_rate.sleep();
    }
    return 0;
}

订阅话题

#include "ros/ros.h"
#include <ros_define_data/grasp.h>

// 接受到订阅的消息后,会进入消息回调函数
void GraspInfoCallback(const ros_define_data::grasp::ConstPtr& msg){
    //将接受到的消息打印出来
    ROS_INFO("Subcribe grasp Info: pos:(%d,%d),depth:%f,angle:%f,width:%f",
            msg->x,msg->y,msg->z,msg->angle,msg->width); 
}

int main(int argc, char *argv[])
{
    // 初始化ros节点
    ros::init(argc,argv,"grasp_subscriber");
    // 创建节点句柄
    ros::NodeHandle n;
    ros::Subscriber grasp_info_sub = n.subscribe("/grasp_info",10,GraspInfoCallback);
    
    // 循环等待回调函数
    ros::spin();
    
    return 0;
}

运行结果

服务通信

grasp_.srv文件代码如下

# request
uint16 x
uint16 y         # 键盘输入坐标点
---
# response
uint16 distance  # 几何距离

客户端

#include "ros/ros.h"
#include <cstdlib>
#include <ros_define_data/grasp_.h>

int main(int argc, char *argv[])
{
    // 初始化ros节点
    ros::init(argc,argv,"grasp_client");
    // 从命令行获取两个数
    if(argc!=3)
    {
        ROS_INFO("usage:grasp_client X Y");
        return 1;
    }
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个client
    // 消息类型为ros_define_data::grasp_
    ros::ServiceClient client=n.serviceClient<ros_define_data::grasp_>("computing_distance");

    // 创建ros_define_data::grasp_类型的server消息
    ros_define_data::grasp_ srv;
    srv.request.x = atoll(argv[1]);
    srv.request.y = atoll(argv[2]);

    // 发布service消息,等待计算结果反馈回来,call表示发布服务请求了
    if(client.call(srv)){
        ROS_INFO("Distance:%ld",(long int)srv.response.distance);
    }else{
        ROS_ERROR("Failed to call service computing_distance");
        return 1;
    }
    return 0;
}

服务端

#include "ros/ros.h"
// 当前include文件夹中为本地地址devel下的include
#include <ros_define_data/grasp_.h>

// server设置回调函数,输入req,输出res
bool addCallback(ros_define_data::grasp_::Request &req,
                 ros_define_data::grasp_::Response &res){
    // 将输入参数中的请求数据相加,结果放到应答恢复中
    res.distance = req.x * req.x + req.y * req.y;
    ROS_INFO("request: x = %ld,y = %ld",(long int)req.x,(long int)req.y);
    ROS_INFO("response: distance = %ld",(long int)res.distance);

    return true;
}

int main(int argc, char *argv[])
{
    // ros节点初始化
    ros::init(argc,argv,"computing_distance_server");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建名为computing_distance的server,注册回调函数
    ros::ServiceServer service = n.advertiseService("computing_distance",addCallback);

    // 循环等待回调函数
    ROS_INFO("ready to computing distance");
    ros::spin();
    return 0;
}

运行结果 

先创建grasp.msg和grasp_.srv文件进行编译生成.h头文件

此时CMakeLists.txt文件配置如下

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  # 自定义消息时添加
  geometry_msgs
  message_generation
)
add_message_files(
  FILES
  grasp.msg
  # Message2.msg
)
add_service_files(
  FILES
  grasp_.srv
  # Service2.srv
)
generate_messages(
  DEPENDENCIES
  std_msgs
)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES ros_define_data
 CATKIN_DEPENDS roscpp rospy std_msgs geometry_msgs message_runtime
#  DEPENDS system_lib
)

自定义msg和srv编译生成的.h头文件路径如下图

 把四个.h头文件复制粘贴到下图位置

.h文件移动后CMakeLists.txt文件配置

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  # 自定义消息时添加
  geometry_msgs
  message_generation
)
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)
add_executable(server src/server.cpp)
add_executable(client src/client.cpp)
add_executable(publisher src/publisher.cpp)
add_executable(subscriber src/subscriber.cpp)
target_link_libraries(server
  ${catkin_LIBRARIES}
)
target_link_libraries(client
  ${catkin_LIBRARIES}
)
target_link_libraries(publisher
  ${catkin_LIBRARIES}
)
target_link_libraries(subscriber
  ${catkin_LIBRARIES}
)

package.xml文件配置

  <!-- self define some message data -->
  <build_export_depend>message_generation</build_export_depend>
  <exec_depend>message_runtime</exec_depend>
  <build_depend>geometry_msgs</build_depend>
  <exec_depend>geometry_msgs</exec_depend>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习:机械臂抓取自定义消息数据类型,话题msg和服务srv通信(C++实现) 的相关文章

随机推荐

  • 目标检测正负样本区分和平衡策略(anchor-based)

    最近看了一篇大佬写关于正负样本区分和平衡策略的博文 xff0c 研究了一下并且查了一下资料进行了补充 xff0c 加上个人的见解和解读 xff0c 在此做个总结 xff0c 欢迎大家补充指正 xff0c 侵权必删 大佬博文 xff1a 目标
  • voc旋转标注数据转dota类型

    voc旋转标注数据转dota类型 voc2dota pyListFilesToTxt pyroxml to dota py 在cv领域数据集的标注过程中 xff0c 用labelImg工具我们可以对数据进行标注 xff0c 标注生成的voc
  • CVPR2022: Oriented RepPoints论文模型实践(用dota数据集)

    CVPR2022 Oriented RepPoints论文模型实践 xff08 用dota数据集 xff09 论文 xff1a https arxiv org abs 2105 11111 github xff1a https github
  • DM365 adc学习笔记

    Data 2015 11 23 Author cjh Theme DM365 adc Note 数据手册并没有写明ADC 可采集电压的范围 xff0c 但是整个ADC模块的供电电压是1 8V xff0c 并且参照合众达的程序以及原理图 xf
  • python用PIL库批量裁剪指定大小的图像(自动填充裁剪不完的部分)

    概述 主要功能 xff1a 使用python代码裁剪批量图片 网上用python裁剪图片的代码有很多 xff0c 但是往往没有考虑到图片裁剪不完的情况 举个例子 xff0c 我有4096 1800的图片 xff0c 想把它批量裁剪成1024
  • 图像分割mask图上画出目标检测框

    概述 xff1a 最近在做跟语义分割有关的变化检测方向的工作 当遇到模型的输出是一张mask图的情况下 xff0c 单纯用肉眼看检测的效果可能不是很直观 这时我们可以利用python脚本 xff0c 调用opencv的cv2 connect
  • (深度学习)yolo(txt)与voc(xml)格式相互转换脚本

    提供了两个用来将voc格式的xml文件相互转换的简单脚本 xff0c 修改一下class类和文件目录即可使用 voc转yolo xff1a xml2txt py span class token keyword import span os
  • 【Pascal voc格式的xml文件与YOLO格式文件的互相转换图】

    一图了解xml格式与YOLO格式如何相互转换 xff1a 两种格式相互转换的代码可以参考我之前的文章 xff1a https blog csdn net SSSlasH article details 126927858 spm 61 10
  • 51单片机——LED点阵屏(显示滚动画面)

    目录 一 关于数码管 LED点阵屏显示的注意点 二 功能介绍 三 主要模块的介绍 3 1 74HC595模块和点阵屏显示函数 3 1 1 74HC595介绍 3 1 2 点阵屏显示函数MatrixLED 3 2定时器中断模块 四 程序实现
  • JAVA学习记录

    JAVA学习笔记 总结自how2j cn JAVA基础 HelloWorld 下载JDK 配置环境变量 检查配置是否成功java version 创建源文件 编写基础输出命令System out println 34 hello world
  • C# P2P实现点对点聊天

    P2P xff0c 英文Peer to Peer的缩写 xff0c 中译为对等互联或点对点技术 P2P技术可以让用户可以直接连接到其他用户的计算机 xff0c 进行文件共享与交换 xff0c 同时P2P在深度搜索 分布计算 协同工作等方面也
  • 目标检测自动标注python脚本

    在需要大量标注数据时 xff0c 可以先用少量样本训练一个模型 xff0c 在模型大致可以正常输出类别和位置坐标的情况下进行自动标注 xff0c 后续再进行少量的人工调整 xff0c 可以节省很大的精力 xff08 自动标注的格式仿照lab
  • 微博文本分类任务

    数据 借用了这位兄弟的数据 xff0c 4类文本分类问题 xff1a https blog csdn net qq 28626909 article details 80382029 代码参考 预处理工具torchtext学习参考了nlpu
  • Mac 安装Java反编译工具JD-GUI

    一 下载JD GUI软件 1 首先到Github下载JD GUI软件 xff1a github java decompiler jd gui Public 选择jd gui osx 1 6 6 tar 2 解压打开软件 xff0c 但是提示
  • Dm365 VPBE 后端模块讲解

    Data 2016 12 22 Author cjh Theme DM365 explain of VPBE 研一进来先是接触了TI的dm6437 一款DSP处理器 xff0c DaVinci系类主要用于图像及视频的相关处理 xff0c 和
  • ROS服务通信

    1 服务通信 服务通信也是ROS中一种极其常用的通信模式 xff0c 服务通信是基于请求响应模式的 xff0c 是一种应答机制 也即 一个节点A向另一个节点B发送请求 xff0c B接收处理请求并产生响应结果返回给A 比如如下场景 机器人巡
  • Action(动作通信Python)

    机器人导航到某个目标点 此过程需要一个节点A发布目标信息 xff0c 然后一个节点B接收到请求并控制移动 xff0c 最终响应目标达成状态信息 乍一看 xff0c 这好像是服务通信实现 xff0c 因为需求中要A发送目标 xff0c B执行
  • 键盘+moveit+rviz 控制六轴机械臂(仿真)

    首先下载代码 xff1a git clone https github com ssz160107 catkin ws arm git 打开文件夹如下图所示 打开一个终端运行mini 4wd six arm moveit config文件打
  • pip报错 ERROR: Could not install packages due to an OSError: [Errno 13] permission denied

    输入命令 python m pip install user pyqt5
  • ROS学习:机械臂抓取自定义消息数据类型,话题msg和服务srv通信(C++实现)

    创建文件 mkdir p ros basic src cd ros basic catkin init catkin build catkin create pkg ros define data catkin deps std msgs