ROS笔记四(基于Python、Kinetic):自定义服务类型

8.ROS编程学习:自定义服务数据python调用 7.ROS编程学习:自定义服务数据python调用 阅读详情

前言:

同消息定义一样,服务定义只是一个消息类型列表。不同的是服务调用同时具有输入和输出。

点击查看自定义消息类型

1.创建服务类型的源文件:

在my_code包下创建srv目录,用于存放服务源文件。下面定义一个WordCount服务,文件名WordCount.srv:

string words
---
uint32 count

"---"表示输入和输出的分割,string作为服务调用的输入,uint32作为服务调用的输出。

2.告知构建系统有新服务的定义:

向package.xml文件中添加以下代码即可:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

3.修改CMakeLists.txt文件参数:

修改find_packag()函数:

catkin_package()添加编译运行依赖:

add_service_files()添加自定义服务源文件文件名: 

最后,generate_message()添加自定义服务所依赖的消息类型:

4.编译 :

进入工作空间:

cd ~/catkin_ws

开始编译:

catkin_make

5.查看刚定义的服务:

rossrv show WordCount

Ubuntu16.04下安装ROS Kinetic(详细图文教程) 参考网址:链接1 参考网址:链接2 一、安装ROS 1、添加ROS软件预源,打开命令行输入以下代码: sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/ros-latest.list'122 2、添加密钥,输入... 阅读详情

相关推荐

ROS笔记——在conda的python3.7中使用ROS Kinetic

环境:ubuntu 16.04, ROS Kinetic, conda 4.8.3, python3.7 思路 在python3环境下,直接使用tf会有如下报错(rospy可正常使用): >>> import tf Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/ros/kinetic/lib/python2.7/dist-pack.

weixin_42315410的博客 1555

2.2.4 服务通信自定义srv调用B(Python)

ROS入门 2.2.4 服务通信自定义srv调用B(Python) 《ROS入门-理论与实践》视频教程镇楼 需求: 编写服务通信,客户端提交两个整数至服务端,服务端求和并响应结果到客户端。 分析: 在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个: 服务端 客户端 数据 流程: 编写服务端实现; 编写客户端实现; 为python文件添加可执行权限; 编辑配置文件; 编译并执行。 0.vscode配置 需要像之前自定义 msg 实现一样配置s

赵虚左 670

ROS笔记九(基于Python、Kinetic):gazebo中通过键盘输入控制turtlebot机器人移动和转向

前言: Twist消息能描述所有的3D运动,在控制差分驱动的平面运动机器人时,只需要使用其中的两个参数:线性速度(前进/后退)和绕竖直轴的角速度。所以只需要简单地发送线速度(米每秒)和角速度(弧度每秒)命令。这里需要两个程序:一个程序用来监听键盘地敲击事件然后通过ROS消息发布出去,另一个订阅这个ROS消息并输出一个Twist消息,从而实现键盘输入控制机器人地自由移动。 1.键盘驱动: 使用Python的termios和tty库将终端设置成原始模式并捕获键盘敲击事件,然后将事件以std_msgs/st

java0fu的博客 4190

ROS学习 服务通信自定义消息类型服务端实现(python )

服务通信自定义消息类型服务端实现(python )

qq_52111026的博客 455

Ubuntu16.04安装ROS kinetic踩坑全记录(apt-get出现依赖问题、python3与kinetic不兼容、安装ROS后不能导入cv2等

Ubuntu16.04安装ROS kinetic踩坑全记录(apt-get出现依赖问题、python3与kinetic不兼容、安装ROS后不能导入cv2等)使用ROS官网的安装命令sudo apt-get install ros-kinetic-desktop-full出现依赖问题完成官网给出的安装过程后,在python环境出现不能import cv2的问题 最近需要在实验室的服务器上安装ROS调试机械手,因为服务器的ubuntu版本是16.04,所以只能装kinetic版的ROS,过程中出现了很多坑,记录

qq_35218039的博客 1560

两轮差速机器人运动学模型

两轮差速底盘 1.1、底盘说明 两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 主要底盘有: 1、Turtlebot; 2、扫地机器人; 3、无人仓AGV小车; 4、轮椅; 底盘主要特点: 1、控制简单、里程计计算简单。 2、只能给定X方向速度、Z轴方向角速度。 1.2、底盘运动学分析 1.2.1、底盘模型 图1.2.1 常见的两轮差速底盘模型 1.2.2、机器人本身约束方程(物理特性) 图1.2.2 a 左侧是车的两个

su_fei_ma_su的博客 3万+

ROS高效入门第六章 -- 自定义ROS服务,编写python server+client样例

ROS高效入门第六章 -- 自定义ROS服务,编写python server+client样例

cy1641395022的博客 1438

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7798

【ros学习笔记】-6 自定义服务数据类型

在包下创建srv文件夹,在该文件夹下:创建文件:custom_srv.srv配置方式与配置msg文件相同,即:在CMakeList文件中添加编译选项:配置好后编译;在下会生成三个头文件。

qq_43657247的博客 520

基于OpenAI Agents构建多智能体工作流:从原理到实战

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个智能体(Agent)的协作与交互,解决单一智能体难以处理的复杂任务。其核心原理在于将任务分解、分配与协调,每个智能体具备特定能力,通过通信机制实现信息共享与决策协同。在工程实践中,多智能体框架的价值在于提升任务处理效率、增强系统鲁棒性,并支持模块化开发。典型的应用场景包括自动化工作流编排、复杂问题求解以及人机协同交互。本文以OpenAI Agents SDK为例,深入探讨如何利用其提供的智能体(Agent)、会话(Ses

weixin_28725959的博客 604

手把手教你用YOLOv11-seg-LSCD搞定树脂件瑕疵检测(附数据集与代码)

本文详细介绍了如何使用YOLOv11-seg-LSCD模型进行工业级树脂件瑕疵检测,包括环境配置、数据集构建、模型训练与调优、部署优化等全流程。通过LSCD模块的创新设计,有效提升了气泡、裂纹等微小缺陷的检测精度,适用于各类树脂制品的质量检测场景。

weixin_28677005的博客 418

ROS笔记六(基于Python、Kinetic):自定义动作类型

前言: 动作使用话题实现,其本质上相当于一个规定了一系列话题(目标、结果、反馈等)的组合使用方法的高层协议。相较于服务的同步通信机制,动作机制则是异步的。动作适用于大部分请求/响应式交互场景,尤其是执行过程不能立即完成。 1.创建动作类型的源文件: 在my_code包下创建action目录,用于存放动作源文件。下面定义一个满足定时器需求的动作Timer.action: ...

java0fu的博客 670

[DA45] 使用PageRank算法分析希拉里邮件中的人物关系

一. 相关知识 (一) PageRank算法 PageRank 算法是 google 公司的创始人拉里·佩奇和谢尔·盖布林于1998年提出的网页搜索优化算法. 详细内容请见百度百科:google pagerank. 如果你了解了该算法, 就能明白上一段的超链接从本页面链出, 链入百度百科的 PageRank 算法页面增加了该页面...

Vincent_Chu的博客 2378

ROS笔记三(基于Python、Kinetic):自定义消息类型

前言: 一个消息定义文件包含一系列的构成此消息的类型。这些类型可以是ROS内建消息类型比如std_msgs包中定义的或是自己定义的消息类型。定义消息后,需要catkin_make编译。 1.创建消息类型的定义文件: 在my_code报下创建msg目录,用于存放消息源文件。下面定义一个Complex消息,文件名Complex.msg: float32 real float32 imaginary 2.告知构建系统有新消息的定义: 向package.xml文件中添加以下代码即可: ...

java0fu的博客 958

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 375

JSP期末考试复习习题及答案

以下习题是对于平时课堂小测的整理,如有错误敬请指正! 欢迎一起交流~ 预祝各位小伙伴们考试顺利! Test1 一. 单选题 – 1.(单选题)当用户请求jsp页面时,JSP引擎就会执行该页面的字节码文件响应客户的请求,执行字节码文件的结果是() A. 发送一个JSP源文件到客户端 B. 发送一个Java文件到客户端 C. 发送一个HTML页面到客户端 D. 什么都不做 – 2.(单选题)下列动态网页和静态网页的根本区别描述错误的是( D) A. 静态网页服务器端返回的HTML文件是事先存储好的 B. 动.

技术小白 2万+

ROS笔记五(基于Python、Kinetic):通信机制——服务(server)

前言: 服务是另一种在节点之间传递数据的方式。服务其实就是同步的跨进程函数调用,让一个节点调用运行在另一个节点中的函数。服务适用于偶尔并且在有限时间里完成的通信情况。 1.定义一个服务端: q ...

java0fu的博客 802

C# 从数秒到毫秒:MySQL+Redis百万数据优化实战全解析

在处理百万级数据时,传统单体数据库常面临查询效率低下、数据库负载过高和用户体验差等问题。为解决这些性能瓶颈,可以采用MySQL分库分表、Redis缓存和异步统计的组合策略。 数据库分片:通过水平分表和分库实现,将单表数据分散到多个物理表或数据库实例中,降低单点负载。 Redis缓存:利用Redis缓存高频数据,减少数据库查询压力,提升响应速度。 异步统计:通过消息队列(如RabbitMQ)解耦统计任务,后台处理非实时任务,避免阻塞主流程。 这些优化策略能够显著提升系统性能,确保在高并发和大数据量场景下的稳定

墨夶的博客 852

ROS笔记七(基于Python、Kinetic):通信机制——动作(action)

前言: 动作使用话题实现,其本质上相当于一个规定了一系列话题(目标、结果、反馈等)的组合使用方法的高层协议。相较于服务的同步通信机制,动作机制则是异步的。动作适用于大部分请求/响应式交互场景,尤其是执行过程不能立即完成。 catkin_ws工作空间下my_code程序包里的文件目录结构: 1.定义一个动作服务器: ...

java0fu的博客 1485

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ROS笔记二(基于Python、Kinetic):通信机制——话题(topic)

前言: 话题实现了一种发布/订阅的通信机制,这是一种在分布式系统中常见的数据交换方式。节点在发送数据到话题上之前,必须先声明话题名和发送到该话题的消息所具有的类型。 1.声明一个话题 ...

java0fu的博客 714

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ROS入门笔记(五):ROS中运行rqt_plot的问题(kinetic)

1 问题 rosrun rqt_plot rqt_plot ggk@ggk-virtual-machine:~$ rosrun rqt_plot rqt_plot /usr/lib/python2.7/dist-packages/matplotlib/axis.py:1015: UserWarning: Unable to find pixel distance along axis for interval padding of ticks; assuming no interval padding n

即使是不成熟的尝试,也胜于从不执行的策略。 4515

ros调用anaconda的python3_ROS笔记——在conda的python3.7中使用ROS Kinetic

环境:ubuntu 16.04, ROS Kinetic, conda 4.8.3, python3.7思路在python3环境下,直接使用tf会有如下报错(rospy可正常使用):>>> import tfTraceback (most recent call last):File "", line 1, in File "/opt/ros/kinetic/lib/python...

weixin_39640414的博客 732

ROS下UR机械臂仿真控制(kinetic版)

描述 使用ROS的kinetic版本,在gazebo仿真系统下控制UR机械臂 问题 CMake Warning at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package): Could not find a package configuration file provided by "moveit_core" with any of the following names: moveit_core

weixin_42156097的博客 3087

ROS笔记八(基于Python、Kinetic):gazebo初探——实现turtlebot移动并避开障碍

前言:代码实现在gazebo7仿真环境中turtlebot机器人的随机移动并避开障碍物。 1.创建新的工作空间: 创建工作空间文件树: $ mkdir -p ~/wanderbot_ws/src $ cd ~/wanderbot_ws/src $ catkin_init_workspace 创建一个“wanderbot”程序包: $ cd ~/wanderbot_ws/src $ catkin_create-pkg wanderbot rospy geometry_msgs sensor_ms

java0fu的博客 2575

ubuntu16.04安装ros kinetic及遇到的问题

安装过程主要是参考官网安装教程,官网链接如下 http://wiki.ros.org/kinetic/Installation/Ubuntu 注意,ros的kinetic版本,只支持Wily (Ubuntu 15.10), Xenial (Ubuntu 16.04) and Jessie (Debian 8) for debian packages。 具体安装流程为: 1、设置source...

hailanglin的博客 914

ROS Kinetic创建Python3工作区出现“No module named ‘catkin_pkg‘”解决方案

ROS Kinetic创建Python3工作区出现如下问题解决方案 ImportError: “from catkin_pkg.package import parse_package” failed: No module named ‘catkin_pkg’ Make sure that you have installed “catkin_pkg”, it is up to date and on the PYTHONPATH. 官方教程中提供了ROS Kinetic支持Python3的方法,原文如

qq_35699473的博客 4649
上一篇: ROS笔记三(基于Python、Kinetic):自定义消息类型
下一篇: ROS笔记五(基于Python、Kinetic):通信机制——服务(server)
进击的香皂
博客等级 码龄8年 34粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值