ROS学习笔记11(用C++写一个简单的消息发布和消息订阅)

ROS总结——ROS消息发布和订阅 消息发布器和订阅器 (C++)本博客总结绍如何用 C++ 编写消息发布器节点和订阅器节点。1.编写发布器节点 节点(Node) 是指 ROS 网络中可执行文件。接下来,将会创建一个发布器节点(“talker”),它将不断的在 ROS 网络中广播消息。切换到之前创建的 beginner_tutorials package 路径:$ cd ~/catkin_ws/src/beginner_tutor 阅读详情

1 写一个消息发布节点

首先切换到工作目录:

roscd beginner_tutorials

接着,创建src/talker.cpp,代码如下:

/*
 * Copyright (C) 2008, Morgan Quigley and Willow Garage, Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   * Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
// %Tag(FULLTEXT)%
// %Tag(ROS_HEADER)%
#include "ros/ros.h"
// %EndTag(ROS_HEADER)%
// %Tag(MSG_HEADER)%
#include "std_msgs/String.h"
// %EndTag(MSG_HEADER)%

#include <sstream>

/**
 * This tutorial demonstrates simple sending of messages over the ROS system.
 */
int main(int argc, char **argv)
{
  /**
   * The ros::init() function needs to see argc and argv so that it can perform
   * any ROS arguments and name remapping that were provided at the command line.
   * For programmatic remappings you can use a different version of init() which takes
   * remappings directly, but for most command-line programs, passing argc and argv is
   * the easiest way to do it.  The third argument to init() is the name of the node.
   *
   * You must call one of the versions of ros::init() before using any other
   * part of the ROS system.
   */
// %Tag(INIT)%
  ros::init(argc, argv, "talker");
// %EndTag(INIT)%

  /**
   * NodeHandle is the main access point to communications with the ROS system.
   * The first NodeHandle constructed will fully initialize this node, and the last
   * NodeHandle destructed will close down the node.
   */
// %Tag(NODEHANDLE)%
  ros::NodeHandle n;
// %EndTag(NODEHANDLE)%

  /**
   * The advertise() function is how you tell ROS that you want to
   * publish on a given topic name. This invokes a call to the ROS
   * master node, which keeps a registry of who is publishing and who
   * is subscribing. After this advertise() call is made, the master
   * node will notify anyone who is trying to subscribe to this topic name,
   * and they will in turn negotiate a peer-to-peer connection with this
   * node.  advertise() returns a Publisher object which allows you to
   * publish messages on that topic through a call to publish().  Once
   * all copies of the returned Publisher object are destroyed, the topic
   * will be automatically unadvertised.
   *
   * The second parameter to advertise() is the size of the message queue
   * used for publishing messages.  If messages are published more quickly
   * than we can send them, the number here specifies how many messages to
   * buffer up before throwing some away.
   */
// %Tag(PUBLISHER)%
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
// %EndTag(PUBLISHER)%

// %Tag(LOOP_RATE)%
  ros::Rate loop_rate(10);
// %EndTag(LOOP_RATE)%

  /**
   * A count of how many messages we have sent. This is used to create
   * a unique string for each message.
   */
// %Tag(ROS_OK)%
  int count = 0;
  while (ros::ok())
  {
// %EndTag(ROS_OK)%
    /**
     * This is a message object. You stuff it with data, and then publish it.
     */
// %Tag(FILL_MESSAGE)%
    std_msgs::String msg;

    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();
// %EndTag(FILL_MESSAGE)%

// %Tag(ROSCONSOLE)%
    ROS_INFO("%s", msg.data.c_str());
// %EndTag(ROSCONSOLE)%

    /**
     * The publish() function is how you send messages. The parameter
     * is the message object. The type of this object must agree with the type
     * given as a template parameter to the advertise<>() call, as was done
     * in the constructor above.
     */
// %Tag(PUBLISH)%
    chatter_pub.publish(msg);
// %EndTag(PUBLISH)%

// %Tag(SPINONCE)%
    ros::spinOnce();
// %EndTag(SPINONCE)%

// %Tag(RATE_SLEEP)%
    loop_rate.sleep();
// %EndTag(RATE_SLEEP)%
    ++count;
  }


  return 0;
}
// %EndTag(FULLTEXT)%

2 写一个消息订阅节点

创建一个src/listener.cpp,输入以下

/*
 * Copyright (C) 2008, Morgan Quigley and Willow Garage, Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   * Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

// %Tag(FULLTEXT)%
#include "ros/ros.h"
#include "std_msgs/String.h"

/**
 * This tutorial demonstrates simple receipt of messages over the ROS system.
 */
// %Tag(CALLBACK)%
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}
// %EndTag(CALLBACK)%

int main(int argc, char **argv)
{
  /**
   * The ros::init() function needs to see argc and argv so that it can perform
   * any ROS arguments and name remapping that were provided at the command line.
   * For programmatic remappings you can use a different version of init() which takes
   * remappings directly, but for most command-line programs, passing argc and argv is
   * the easiest way to do it.  The third argument to init() is the name of the node.
   *
   * You must call one of the versions of ros::init() before using any other
   * part of the ROS system.
   */
  ros::init(argc, argv, "listener");

  /**
   * NodeHandle is the main access point to communications with the ROS system.
   * The first NodeHandle constructed will fully initialize this node, and the last
   * NodeHandle destructed will close down the node.
   */
  ros::NodeHandle n;

  /**
   * The subscribe() call is how you tell ROS that you want to receive messages
   * on a given topic.  This invokes a call to the ROS
   * master node, which keeps a registry of who is publishing and who
   * is subscribing.  Messages are passed to a callback function, here
   * called chatterCallback.  subscribe() returns a Subscriber object that you
   * must hold on to until you want to unsubscribe.  When all copies of the Subscriber
   * object go out of scope, this callback will automatically be unsubscribed from
   * this topic.
   *
   * The second parameter to the subscribe() function is the size of the message
   * queue.  If messages are arriving faster than they are being processed, this
   * is the number of messages that will be buffered up before beginning to throw
   * away the oldest ones.
   */
// %Tag(SUBSCRIBER)%
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
// %EndTag(SUBSCRIBER)%

  /**
   * ros::spin() will enter a loop, pumping callbacks.  With this version, all
   * callbacks will be called from within this thread (the main one).  ros::spin()
   * will exit when Ctrl-C is pressed, or the node is shutdown by the master.
   */
// %Tag(SPIN)%
  ros::spin();
// %EndTag(SPIN)%

  return 0;
}
// %EndTag(FULLTEXT)%

3 构建节点

在CMakeLists.txt最后添加:

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

完整文件:

   1 cmake_minimum_required(VERSION 2.8.3)
   2 project(beginner_tutorials)
   3 
   4 ## Find catkin and any catkin packages
   5 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
   6 
   7 ## Declare ROS messages and services
   8 add_message_files(FILES Num.msg)
   9 add_service_files(FILES AddTwoInts.srv)
  10 
  11 ## Generate added messages and services
  12 generate_messages(DEPENDENCIES std_msgs)
  13 
  14 ## Declare a catkin package
  15 catkin_package()
  16 
  17 ## Build talker and listener
  18 include_directories(include ${catkin_INCLUDE_DIRS})
  19 
  20 add_executable(talker src/talker.cpp)
  21 target_link_libraries(talker ${catkin_LIBRARIES})
  22 add_dependencies(talker beginner_tutorials_generate_messages_cpp)
  23 
  24 add_executable(listener src/listener.cpp)
  25 target_link_libraries(listener ${catkin_LIBRARIES})
  26 add_dependencies(listener beginner_tutorials_generate_messages_cpp)


ref:http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber(c%2B%2B)

我的ROS入门(五):总算搞通ROS的服务节点订阅发布消息话题了 总算搞通ROS的服务节点订阅发布消息主题了。可以实习那几个东西。 记录一下吧,首先要一个工作空间。 在当前系统用户的home目录下的.bashrc文件中添加source /opt/ros/jade/setup.bash,才能运行ros相关的命令。 开始创建一个catkin工作空间 $ mkdir -p ~/catkin_lljws/src $ cd ~/catkin_lljws/src 阅读详情

相关推荐

ROS手动编写消息发布器和订阅器topic demo(C++)

1.首先创建 packagecd ~/catkin_ws/srccatkin_create_pkg topic_demo roscpp rospy std_msgs2. 编写 msg 文件cd topic_demomkdir msgcd msgvim gps.msg将以下代码写入:float32 x float32 y string statex 是横坐标,y 是纵坐标,state 是状态还记得以...

Nikki_o3o的博客 5051

ROS话题通信实现发布接收以及vscode编译配置(五)C++版本

[rosrun] Couldn't find executable named demo01_pub below /home/david/demo03_ws/src/plumbing_pub_sub 如果出现了这个报错那么应该是上面编译没选对 要选catkin_make:build这个编译任务然后要对应修改其json文件 #include "ros/ros.h" 导入包的时候显示报错先不用管,这是因为没有编译导致的

weixin_50920579的博客 3057

ROS发布/订阅Float64MultiArray数组类消息(C++和Python相互发布和订阅)

再次领略了ROS系统一个很好的特性,能兼容不同语言的节点,只要规范好发布信息的类型是匹配的,就能让不同语言编写的节点互相通信。 Target: 想让python写的node发布数组,而让C++写的node订阅这个发布的数据。 Method: 1.Python发布,C++订阅 1)先选择发布消息的类型,选定为Float64MultiArray 2)然后是python节点的代码: #!/usr/bin/env python # encoding: utf-8 # Echo client program im

Will_Ye的博客 1万+

Ros自定义消息话题通信代码(C++实现)

【代码】Ros自定义消息话题通信代码(C++实现)

qq_44701348的博客 678

ROS 的通信机制之话题订阅模型详解

话题订阅模型在ROS中的实现本质上依赖于底层的通信机制和网络编程。

weixin_46999174的博客 3441

创建ROS消息发布器(publisher)、订阅器(subscriber)

发布器和订阅器都是可执行文件。对C++语言,我们在.cpp文件中创建,并编译生成可执行文件, 发布器: 1、cd到包目录下,然后在src文件夹下创建.cpp文件; 2、.cpp文件包括以下部分:      ①包含(include)依赖库,如ros/ros.h、std_msgs/String.h、sstream等      ②主函数部分:  ros::init(argc,argv,

DjangoBUAA的博客 2760

C++发布订阅模式

发布订阅模式

youaremyalllove的博客 3287

ros c++ 简单教程

ros c++ 简单教程–刘田 文章目录ros c++ 简单教程--刘田cmake怎么写?catkin怎么用?• 新建一个ros_package• cmake中catkin怎么写?c++中ros 常用语法• c++中ros头文件怎么写?C++ 基本节点订阅发布的关键函数?• 发布函数和接受函数的简单示例• 发布函数• 接受函数• 类的方法实现订阅发布ros 中的服务怎么用?三种基本服务类型是什么?...

三川小哥 狂想曲 4641

ros学习11--Writing Publisher Subscriber(c++) (编写简单的发布者和订阅者(C++))

本文ubuntu20.04+ros1,是初学者按照官网初级教程学习记录,仅作个人学习记录,如有问题可联系本文作者。附上ros1官网链接ros2官网链接。

m0_60030502的博客 397

基于C++11模板实现的发布/订阅开发框架读取《雪中悍刀行》

基于C++11模板实现的发布/订阅开发框架读取《雪中悍刀行》

全球尺度遥感云计算平台:Google Earth Engine

Google Earth Engine(GEE)是一个基于 Google 云服务基础设施的遥感大数据分析平台,它结合 Google 强大的云计算能力与 NASA、ESA、NOAA 等机构的空间数据,用于在全球尺度解决一些非常重要的社会问题:森林退化、粮食安全、灾害预警、水资源管理、气候监测以及环境保护等。 GEE 官方宣传视频(版权归 Google 所有) Spacefan 的视频 ·303播放 发展背景 2008 年,手握 40 多年 LandSat 数据的美国地质调查局(USG...

qq_41240287的博客 5015

C++11 新特性:多執行序程式開發 Thread

http://kheresy.wordpress.com/2012/07/06/multi-thread-programming-in-c-thread-p1/ http://kheresy.wordpress.com/2012/07/06/multi-thread-programming-in-c-thread-p2/ http://kheresy.wordpress.com/2012/

头顶篮球的摇滚程序员 790

对称加密和非对称加密,数字签名和证书

在对称加密中,任何人都可以使用公钥进行加密。在数字签名中,任何人都可以使用公钥验证签名。数字签名,其实就是将非对称加密反过来使用。公钥私钥非对称加密发送者加密时使用接收者解密时使用数字签名验证者验证签名时使用签名者生成签名时使用谁持有密钥?只要有需要,任何人都可以持有个人持有既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密。公钥负责加密,私钥负责解密。既然是签名,那肯定是不希望有人冒充我发消息,所以只有我才能签名。私钥负责签名,公钥负责验签。

m0_70432049的博客 1410

ROS学习笔记(二)ROS消息发布(publish)与订阅(subscribe)(C++代码详解)

ROS消息发布与订阅实践及C++代码详解

直撞三千 2万+

云计算虚拟化实验(一)——虚拟机软件VMware的安装以及虚拟机系统的安装(Windows7+CentOS7)

主要内容: 1、虚拟机软件的安装(以VMware为例) 2、虚拟机系统的安装(Window7 + CentOS7) 3、虚拟主机网络互访 4、不同局域网内的虚拟主机互访(软路由——海蜘蛛) 0 ——首先介绍一下什么是虚拟化? 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在

gg_asd的博客 1万+

Aduino 通过I2C接口读取MPU6050模块数据

Aduino ESP9266通过I2C接口读取MPU6050模块数据 MPU6050模块 原理图 所需库:Adafruit_MPU6050 Adafruit_BusIO Adafruit Unified Sensor 接线示意图 ESP8266---MPU6050 VCC -- 3.3v GND -- GND D2 -- SDA D1 -- SCL 示例程序代码 #include <Adafruit_MPU6050.h> #include <Adafruit

perseverance51博客 621

ROS2学习笔记之C++编写简单发布订阅节点篇

ROS2学习笔记之C++编写简单发布订阅节点篇背景前期准备学习内容1. 为例程创建一个包2. 编写publisher发布者节点2.1 代码解释2.2 添加依赖2.3 CMakeLists.txt3. 编写subscriber订阅者节点4. 编译节点并运行总结 学习目标:用C++创建并且运行订阅发布的简单节点 背景 节点是一个通过ROS网络进行数据交互的可执行文件的进程。在这篇教程当中,我们编写一个...

dckwin的博客 1万+

qtcreator使用远程服务器编译代码

我并没有找到很好的windows上可以用的rsync工具,最后是装了wsl来调用rsync同步到代码后,在用ssh调用linux命令来编译的。安装wsl安装ubuntu启动wsl然后把windows里的ssh文件证书和配置复制到wsl里同时config的key目录需要改一下,这样就可以登录服务器了然后在home目录创建build.sh进行远程编译。

习惯就好zz的专栏 1382

ROS学习笔记(一)补充篇 参考创客制造

我吧ROS的CPP部分分成7个部分: 1、基础的node param 2、动态调节参数 3、关于TF变换 4、actionlib 5、插件技术 6、movebase 7、nodelet技术前言相比于ros学习笔记一,ros学习笔记一补充篇将会更加注重代码的讲解。ros学习笔记一只是像大观园一样,看看ROS这个领域的山山水水。而ros学习笔记一补充篇将会深入的补充这些山山水水的来源节点n

DavidHan008 1万+

Linux故障排查和性能优化面试题及参考答案

在 Linux 系统中,负载(Load Average)是衡量系统繁忙程度的一个重要指标,它表示系统在特定时间间隔内运行队列中的平均进程数。负载值反映了系统当前的工作压力,主要包括 CPU 等待运行的进程数量和处于不可中断睡眠状态(通常是等待 I/O 操作完成)的进程数量。负载平均值通常有三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟内的系统平均负载。例如,在使用uptime命令或查看文件时,会看到类似这样的输出,这三个数值依次表示过去 1 分钟、5 分钟和 15 分钟的负载平均值。

大模型大数据攻城狮的专栏 1082

华为OD机考真题 新系统 9月23号 【世界杯徽章换购】多语言题解

华为OD机试真题 新系统【世界杯徽章换购】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【世界杯徽章换购】多语言题解。

qq_45776114的博客 694

深入了解ROS细节之编写简单的消息发布器和订阅器 (C++)、mavros消息发布器和订阅器

深入了解ROS细节之消息发布器和订阅器、mavros消息发布器和订阅器 编写简单的消息发布器和订阅器 (C++) 编写发布器节点 『节点』(Node) 是指 ROS 网络中可执行文件。接下来,我们将会创建一个发布器节点(“talker”),它将不断的在 ROS 网络中广播消息、切换到之前创建的 beginner_tutorials package 路径下: cd ~/catkin_ws/src...

习惯积淀的博客 963

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

ROS发布和订阅数组消息/ C++ & Python

ROS发布和订阅数组消息/ C++ & PythonROS发布和订阅数组消息一个发布数组消息的talker节点(C++)一个订阅数组消息的节点(Python) ROS发布和订阅数组消息 前段时间需要用到C++来写节点发布数组消息,并用Python来订阅该消息,在网上搜索发现关于数组消息的帖子少之又少,遂把自己做的一点微小的工作发上来,欢迎指正. 一个发布数组消息的talker节点(C++)...

zxx258369的博客 5529

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ROS学习笔记-ROS订阅和发布节点

一个简单的ROS包,一个发布者,一个订阅者 刚开始学习ROS,参考网上的资料完成了测试节点的编写,记录一下。 个人习惯在home/Develop目录中做开发,于是在Develop目录下面创建了一个ROS目录,专门用作ROS开发 1,创建工作空间 在自己的ROS目录(随便一个目录即可)下面新建一个工程目录demo,在demo目录下面创建一个工作空间 创建相关目录 cd /home/Develop/...

qq_29022265的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ROS实现消息发布器和订阅器——Hello Word

维基百科ROS官方教程cn/ROS/Tutorials - ROS Wiki 通过节点间定义话题,实现ROS消息和服务通信

Yangy_Jiaojiao的博客 4051

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: ROS学习笔记6(理解ROS话题)
下一篇: ROS学习笔记12(用Python写一个简单的消息发布和消息订阅)
刘凯KAI
博客等级 码龄15年 663粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值