ROS

ros1 和 ros2的区别 为什么用ros2.00.概述1.基本概念基本概念:ROS网络(ROS Graph)概念简介:节点(Nodes)客户端程序库发现2. ros2 的目标3. ros2 的架构4. ros1 和ros2的通信模型 0.概述 其实是为了解决ros1中的一些问题 主要是从下面几个文章整过来 古月居的博客https://www.guyuehome.com/805 Why ROS 2? http://desi... 阅读详情

MoveIt!Tutorials

The Kinematics and Dynamics Library (KDL)

1. orocos KDL√

Orocos KDL offocial site and git
将运动模型和规范简化为参考系相对运动的几何问题,KDL开发了一个独立于应用程序的框架,用于运动链的建模和计算,为几何对象提供类库(点、框架、线),各种系列的运动链以及它们的运动规范和插值。

  1. 使用几何图元
  2. 运动树
    KDL::Segments → KDL::Chain或Tree
  3. 运动学和动态求解器
  • ChainFkSolverPos √ 递归前向运动求解器
  • ChainFkSolverVel
  • ChainIkSolverVel
  • ChainIkSolverPos

2.urdfdom√

1.安装urdfdom_py(Python implementation of the URDF parser):

sudo apt-get install ros-kinetic-urdfdom-py

2.如何使用urdfdom解析URDF模型 urdfdom python 教程

3.对编写的arm7.urdf文件,使用以下命令测试:

rosrun pykdl_utils kdl_parser.py `rospack find test`/arm7.urdf

结果为:

URDF non-fixed joints: 9; KDL joints: 9
URDF joints: 11; KDL segments: 11
Root link: world; Random end link: Link6
base_link
Link1
Link2
Link3
Link4
Link5
Link6

3.Python中创建KDL tree√

对应python:
wiki tutorias
pykdl_utils
github下载
PyKDL API 参考
pykdl安装 pykdl_utils参考

KDL运动学函数参考KDLKinematics Class Reference

在当前目录下有一个 test.py 文件,直接执行这个 test.py ./test.py
报错:
can’t read /var/mail/future
原因是:使用 ./ + 文件名,系统默认会调用 bash 执行 test.py 而不是 python 解释器
解决方案:在文件目录下执行 python test.py
结果为:
在这里插入图片描述

4.C++中创建KDL tree

Start using the KDL parser

  1. Building the KDL parser
 $ rosdep install kdl_parser

这将安装kdl_parser的所有外部依赖项。要构建包,运行以下命令:

 $ rosmake kdl_parser
  1. Using in your code

首先,将KDL解析器作为依赖项添加到package.xml文件中:

  <package>
    ...
    <build_depend package="kdl_parser" />
    ...
    <run_depend package="kdl_parser" />
    ...
  </package>

要在c++代码中开始使用KDL解析器,包含以下头文件:

 #include <kdl_parser/kdl_parser.hpp>

从urdf构造KDL树有4种方法:

  • From a file
  • From the parameter server
  • From an xml element
  • From a URDF model

kdl_parser Namespace Reference
正逆运动学求解函数参考:从URDF到KDL(C++&Python)
(参考trac_ik_examples)修改package.xml以及CMakeLists.txt文件,添加kdl相关库的依赖(urdf、orocos_kdl、kdl_parser、roscpp)
添加编译生成文件的代码

add_executable(fk_test src/fk.cpp)

target_link_libraries(fk_test
  ${catkin_LIBRARIES}
  ${orocos_kdl_LIBRARIES}
)

install(TARGETS fk_test
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

还可以编写launch文件启动节点,需要添加launch依赖。(TRAC-IK实验详解)
在这里插入图片描述
注意:

  1. 运动学正解输出的是4×4的坐标变换矩阵,如需变成位姿、四元数或者欧拉角需要进行额外的转换。
  2. 运动学逆解的计算需要输入目标位姿和迭代角度初值,初值设置不要太离谱,不然收敛不了。
  3. 编译出错的原因:没有添加库的依赖;这些库之前必须安装好;不必要的程序包移到工作空间外。

5.eigen2

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 安装sudo apt-get install libeigen3-dev;默认安装路径为/usr/include/eigen3
    cd /usr/include/eigen3
    ls
    $ Eigen  signature_of_eigen3_matrix_library  unsupported  
    
  2. 复制命令 sudo cp Eigen/ .. -R ;将Eigen文件夹放在/usr/include 下
  3. 编写文件进行测试 vi myeigen.c;(#在哪个文件夹下进行测试?#)
    #include <iostream>
    #include <Eigen/Dense>
    using Eigen::MatrixXd;
    int main()
    {
    MatrixXd m(2,2);
    m(0,0) = 3;
    m(1,0) = 2.5;
    m(0,1) = -1;
    m(1,1) = m(1,0) + m(0,1);
    std::cout << m << std::endl;
    }
    
  4. 编译 g++ myeigen.c -o myeigen
  5. 运行 ./myeigen
  6. 结果
  • matlab正解逆解关节笛卡尔在ROS下的实验

MoveIt!中的运动学插件

KDL:

  • 优点:可求解封闭情况下逆运动学
  • 缺点:速度慢、可能找不到解

TRAC-IK:

  • 基于数值解,比KDL求解效率提高
  • 每次求解得到的关节位置不一定相同

IKFAST:由Open RAVE运动规划软件提供

  • 基于解析解(可以求解任意复杂运动链的运动学方程,并产生特定语音(如C++)的文件后供使用),可以保证每次求解的一致性
  • 比较稳定、速度快

1.TRAC-IK

trac-ik
改进了一般运动链的逆运动学。该项目为Orocos KDL(运动学和动力学库)中常用的逆雅可比矩阵方法提供了一个可选的逆运动学求解器。具体来说,KDL的收敛算法是基于牛顿法的,牛顿法在存在关节极限的情况下不能很好地工作,这在许多机器人平台上是常见的。TRAC-IK同时运行两个IK实现。一个是对KDL基于牛顿的收敛算法的简单扩展,该算法通过随机跳跃来检测和消除由于联合限制而导致的局部极小值。另一个是SQP(序列二次规划)非线性优化方法,它使用拟牛顿方法来更好地处理关节极限。默认情况下,当这两种算法收敛到一个答案时,IK搜索立即返回。此外,还提供了距离、操纵性和避碰性的次要约束,以便接收回“最佳”IK解决方案。

TRAC-IK: An Open-Source Library for Improved Solving of Generic Inverse Kinematics
source code
将KDL替换为TRAC-IK,ROS的软件源中已经集成了TRAC-IK的安装包,可以直接使用以下命令安装:

sudo apt-get install ros-kinetic-trac-ik-kinematics-plugin

然后修改机械臂MoveIt!配置功能包下的config/kinematics.yaml文件:

 kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin

再次运行demo.launch,默认加载的就是TRAC-IK运动学插件了
参考正解KDL逆解TRAC-IK

2.IKFAST

环境配置

安装程序

sudo apt-get install cmake g++ git ipython minizip python-dev python-h5py python-numpy python-scipy qt4-dev-tools

安装依赖库

sudo apt-get install libassimp-dev libavcodec-dev libavformat-dev libavformat-dev libboost-all-dev libboost-date-time-dev libbullet-dev libfaac-dev libglew-dev libgsm1-dev liblapack-dev liblog4cxx-dev libmpfr-dev libode-dev libogg-dev libpcrecpp0v5 libpcre3-dev libqhull-dev libqt4-dev libsoqt-dev-common libsoqt4-dev libswscale-dev libswscale-dev libvorbis-dev libx264-dev libxml2-dev libxvidcore-dev

?安装依赖项collada-dom,从源码安装

git clone https://github.com/rdiankov/collada-dom.git
cd collada-dom && mkdir build && cd build
cmake ..
make -j4
sudo make install

安装OpenSceneGraph-3.4

sudo apt-get install libcairo2-dev libjasper-dev libpoppler-glib-dev libsdl2-dev libtiff5-dev libxrandr-dev
git clone https://github.com/openscenegraph/OpenSceneGraph.git --branch OpenSceneGraph-3.4
cd OpenSceneGraph && mkdir build && cd build
cmake .. -DDESIRED_QT_VERSION=4
make -j4 (make -j$(nproc))
sudo make install

安装Flexible Collision Library 0.5.0

sudo apt-get install libccd-dev
git clone https://github.com/flexible-collision-library/fcl.git
cd fcl
git checkout 0.5.0  # use FCL 0.5.0
mkdir build && cd build
cmake ..
make -j4 (make -j `nproc`)
sudo make install

安装sympy 0.7.1 (注意版本,若版本不对会产生错误)

sudo apt install python-pip
pip install --upgrade --user sympy==0.7.1
pip install --upgrade pip

删除mpmath

sudo apt remove python-mpmath

安装MoveIt! IKFAST

sudo apt-get install ros-kinetic-moveit-kinematics

安装OpenRave

git clone https://github.com/rdiankov/openrave.git --branch master (git clone --branch latest_stable https://github.com/rdiankov/openrave.git)
git checkout 9c79ea260e1c009b0a6f7c03ec34f59629ccbe2c
cd openrave && mkdir build && cd build
cmake -DODE_USE_MULTITHREAD=ON -DOSG_DIR=/usr/local/lib64/ ..
make -j$(nproc)
sudo make install

注意:不建议采用sudo apt-get install ros-kinetic-openrave,会一并安装mpmath,导致后面生成IKFAET文件失败,因此采用源码安装的方式。

补充:若出现错误RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function. 可运行下面命令解决。

git config --global http.postBuffer 2097152000

配置IKFast插件

MoveIt! IKFast 安装
源安装:(在catkin工作空间)

git clone https://github.com/ros-planning/moveit_ikfast.git

(1)MYROBOT_NAME(机器人名字) - name of robot as in your URDF

export MYROBOT_NAME="arm7"

(2)若机器人模型为xacro格式需先转为urdf格式

rosrun xacro xacro --inorder -o "$MYROBOT_NAME".urdf "$MYROBOT_NAME".urdf.xacro

(3)机器人模型urdf格式转换为dae格式

rosrun collada_urdf urdf_to_collada "$MYROBOT_NAME".urdf "$MYROBOT_NAME".dae

(4)设置精度为小数点后5位,然后保留备份后重新设置dae格式机器人模型描述文件的精度

export IKFAST_PRECISION="5"//保留精度小数点后5位
cp "$MYROBOT_NAME".dae "$MYROBOT_NAME".backup.dae  # create a backup of your full precision dae.
rosrun moveit_kinematics round_collada_numbers.py "$MYROBOT_NAME".dae "$MYROBOT_NAME".dae "$IKFAST_PRECISION"

(5)查看模型

openrave-robot.py "$MYROBOT_NAME".dae --info links

模型三维结构

openrave "$MYROBOT_NAME".dae

(6)选择IK项(默认Transform6D )
http://openrave.org/docs/latest_stable/openravepy/ikfast/#ik-types
在这里插入图片描述
(7)设置运动规划组

export PLANNING_GROUP="arm"

(8)设置运动规划的关节组,以上面的模型关节数据为基础设置

export BASE_LINK="1"
export EEF_LINK="8"

(9)若关节数量大于6需设置一自由关节,若无则无需设置

export FREE_INDEX="1"

(10)设置IKFAST输出路径

export IKFAST_OUTPUT_PATH=`pwd`/ikfast61_"$PLANNING_GROUP".cpp

(11)生成IKFAST求解文件
6轴

python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot="$MYROBOT_NAME".dae --iktype=transform6d --baselink="$BASE_LINK" --eelink="$EEF_LINK" --savefile="$IKFAST_OUTPUT_PATH"

7轴

python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot="$MYROBOT_NAME".dae --iktype=transform6d --baselink="$BASE_LINK" --eelink="$EEF_LINK" --freeindex="$FREE_INDEX" --savefile="$IKFAST_OUTPUT_PATH"

备注:生成IKFAST文件时间一般较长,在半个小时左右,若生成失败可以降低精度或者需要修改模型本身。
(12)生成插件

export MOVEIT_IK_PLUGIN_PKG="$MYROBOT_NAME"_ikfast_"$PLANNING_GROUP"_plugin
cd ~/catkin_ws/src
catkin_create_pkg "$MOVEIT_IK_PLUGIN_PKG"
rosrun moveit_kinematics create_ikfast_moveit_plugin.py "$MYROBOT_NAME" "$PLANNING_GROUP" "$MOVEIT_IK_PLUGIN_PKG" "$IKFAST_OUTPUT_PATH"

非ROS方式

python /path/to/create_ikfast_moveit_plugin.py <myrobot_name> <planning_group_name>

编译工作空间

catkin_make

注意:create_ikfast_moveit_plugin.py默认该目录下存在名字为"$MYROBOT_NAME"_moveit_config的功能包如下,该功能包为机器人模型通过moveit_setup_assistant配置生成的功能包。

  plan_pkg = robot_name + '_moveit_config'
  plan_pkg_dir = roslib.packages.get_pkg_dir(plan_pkg)
  print 'Loading robot from \''+plan_pkg+'\' package ... '

使用IKFAST插件

修改使用的插件,cd到"$MYROBOT_NAME"_moveit_config功能包的config文件目录下,修改该目录下的kinematics.yaml文件或者采用下面方式找到该文件。

rosed "$MYROBOT_NAME"_moveit_config/config/kinematics.yaml
 
<planning_group>:
kinematics_solver: <myrobot_name>_<planning_group>_kinematics/IKFastKinematicsPlugin
替换
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin

配置参考古月居
MoveIt!中的运动学求解器
官方配置
Installing OpenRAVE on Ubuntu 14.04
Installing OpenRAVE on Ubuntu 16.04
IKFast: The Robot Kinematics Compiler
IndustrialTutorialsCreate_a_Fast_IK_Solution

MoveIt!运动学插件IKFAST配置
测试

方式一:运行"$MYROBOT_NAME"_moveit_config功能包的demo.launch检查是否成功。

方式二:编译ikfast61_"$PLANNING_GROUP".cpp文件进行测试。

ROS总结——ROS话题 理解ROS话题本博客是对http://wiki.ros.org/上ROS教程的学习总结,欢迎大家交流学习。本节介绍ROS话题(topics)以及如何使用rostopic 和 rxplot 命令行工具。1.运行turtlesim 首先确保roscore已经运行, 打开一个新的终端:$ roscore在一个新的终端中运行:$ rosrun turtlesim turtlesim_node需要通过键 阅读详情

相关推荐

ROS总结——ROS消息和ROS服务

创建ROS消息和ROS服务本博客是对http://wiki.ros.org/上ROS教程的学习总结,欢迎大家交流学习。本节详细讲解了如何创建并编译ROS消息和服务,以及rosmsg、rossrv和roscp命令行工具的使用。1.消息(msg)和服务(srv)介绍 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。 服务(srv): 一个srv

YongqiangGao的专栏 7838

ROS技术点滴 —— MoveIt!中的运动学插件

MoveIt!是ROS中一个重要的集成化开发平台,由一系列移动操作的功能包组成,提供运动规划、操作控制、3D感知、运动学等功能模块,是ROS社区中使用度排名前三的功能包,目前已经支持众多机器人硬件平台。 MoveIt!中的众多功能都使用插件机制集成,其中有一个重要的功能模块——运动学插件。 今天我们就来聊下MoveIt!中的运动学求解器。 一、KDL Kinematics and ...

sinolover的专栏 3034

ROS 环境变量详解(ROS EnvironmentVariables)

在进行实机测试时发生了一件事, 我通过网线连接到机器人, 机器人IP: 192.168.250.100, 我的IP: 192.168.250.145, 但是在配置联调时我的ROS_MASTER_URI=http://10.168.2.14, 此时我在PC启动的launch文件可以挂到机器人上的rosmaster下, 与机器人本机的节点进行通信, 这就已经很神奇了。

SmileJayNew的博客 3506

moveit trac_ik运动规划求解插件安装

照一些网站上安装是sudo apt-get install ros-kinetic-trac-ik-kinematics-plugin,使用moveit,在运行demo.launch时,我的是报错了的,在很长的一段搜索后,试了一下安装sudo apt-get install ros-kinetic-trac-ik,完了之后运行ok。 ...

qq_24624539的博客 2671

ROS1和ROS2分析总结

roscore:启动ROS的核心服务,包括参数服务器、日志节点等。这是运行所有ROS程序前首先要运行的命令。rosrun:允许用户直接通过包名运行包内的节点,而不需要知道这个包的路径。用法为rosrun [package_name] [node_name]。roslaunch:用于启动一个或多个ROS节点,通常是通过一个launch文件来定义的。

winstongit的专栏 2045

ROS:rosdep与ROS2的安装记录

ROS:rosdep与ROS2的安装记录

qq_54900679的博客 3724

MoveIt!中的运动学求解器

参考资料: MoveIt!入门教程-生成IKFast插件 在Ubuntu14.04上安装OpenRAVE ROS探索总结(五十二)—— MoveIt!中的运动学插件 Generate IKFast Plugin Tutorial Installing OpenRAVE on Ubuntu 14.04 MoveIt!中的运动学求解器 KDL Kinematics and Dyna...

坐于屋顶望月球 6454

ROS(二)FCL碰撞检测算法实现过程

碰撞检测是在特定时刻使用碰撞检测算法对两个刚体进行检测,判断当前位置是否可以运动。 FCL 开源检测库提供了物体碰撞检测以及物体接近距离的计算[51]。 FCL 能够检测 传统的三角平面和包括球体,方块,柱体等基础形状体的碰撞或者距离检测。除此之 外,还能对点云进行碰撞检测。 FCL 也可以处理可变形的模型,它不对模型做任何关 于变形的假设,并且假定在每个时间点上物体的边界被表示为三角网格...

Studying…… 1万+

FCL碰撞检测开源库的安装和链接

FCL碰撞检测库的安装和链接的避坑指南

yangrlan的博客 5297

ROS小车开发需要的ROS基础

3.2 ROS基础 作者:公众号:小白学移动机器人 3.2.1 初见ROS ROS历史起源是什么? ROS的总体设计是什么? ROS的应用框架是怎样的? 总结:ROS就是一个为了提高机器人开发的软件复用率,开发的一款具有独特的通信机制、丰富的开发工具、海量的应用功能、良好的生态系统集的工具。 关于ROS更多细节的东西比较多,可以听课、可以看书,但这里只会讲解一些ROS机器人开发中用到的,以及我认为比较重要的地方。在公众号:小白学移动机器人,发送:ROS,即可获得相关ROS学习资源,以下的文章,希望读者

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

机器人运动规划与控制

Robot Motion Planning and Control Editor: Jean-Paul Laumond Chapter 1: Guidelines in Nonholonomic Motion Planning for Mobile Robots Chapter 2: Geometry of Nonholonomic Systems Chapter 3: Optimal Trajectories for Nonholonomic Mobile Robots Chapter 4: Feedback Control of a Nonholonomic Car-Like Robot Chapter 5: Probabilistic Path Planning Chapter 6: Collision Detection Algorithms for Motion Planning

ROS指令大全(含ROS1和ROS2)

目前还在学习ROS+无人机框架中,,,更多更新文章详见我的个人博客主页。

MGodmonkey的专属博客 8354

ozcollide碰撞检测库

OZCollide是很不错的开源的碰撞检测库,它提供了一些便于调用的的C++ API,包含fast tri-box intrs及其其他多种高效碰撞检测算法,能够有效用于粒子系统的碰撞检测!

【ros/ros2】ros1和ros2的区别-要点记录

ros1和ros2的区别,要点记录

shuaixio的博客 1万+

MoveIt运动学插件IK-FAST文档

IKFAST作者Rosen Diankov的博士论文,里面详细介绍了IKFAST求六自由度机械臂的方法和处理冗余的方法

Python实战:用Sinkhorn算法搞定最优传输问题(附完整代码)

本文详细介绍了如何使用Python实现Sinkhorn算法解决最优传输问题,包括算法原理、关键步骤和完整代码示例。通过实际案例(如图像颜色迁移)展示其高效性和稳定性,适合机器学习开发者和数据科学家应用于分布匹配等场景。

weixin_30879169的博客 96

ROS时间概念总结:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate

ROS 里经常用到的一个变量就是时间,比如基于时间和控制量计算机器人的移动距离、设定程序的等待时间/循环时间、设定计时器等。本文总结了 roscpp 给我们提供的时间相关的操作。具体来说,roscpp 里有两种时间表示方法:时刻 (ros::Time) 和时长(ros::Duration)。其中Duration可以是负数。Time和Duration拥有一样的成员: int32 sec int32 ...

u014453443的博客 2万+

RK-XCKU5P RoCEv2 传感器桥工程分析报告

烧入后这块 FPGA 就是一个固定身份(CA:FE:C0:FF:EE:00 / 192.168.0.2 / 无 FEC 100G)的RoCEv2 UC 端点,每秒在 UDP 12267 广播自报家门;对端 CX5 只要关 FEC、配 192.168.0.101 +MTU 4200,就能 ping 通它、用 UDP 8192 读写它的全部寄存器、再按"ECB 旁路交换 QPN/rkey"的方式建立 UC RDMA 通道收发数据。

eloudy的专栏 243

ROS2测评——探索ROS2的性能

1. INTRODUCTION   近年来,诸如自动驾驶车辆的实时分布式嵌入式系统变得越来越复杂和多样化。 自2007年11月3日DARPA城市挑战赛以来,自主驾驶引起了人们的关注[34]。 机器人操作系统(ROS)[28]是开源中间件,经历了快速发展[11],并已广泛用于机器人应用(例如自动驾驶系统)。 ROS几乎完全是从头开始构建的,自2007年以来一直由Willow Garage [7]和开...

漫长IT路 1万+

Neo4j 智能供应链应用源代码简析

本文简析Neo4j智能供应链应用的源代码,让你也可以快速开发自己的供应链应用。

Neo4j 开发者博客 1679

《QGIS快速入门与应用基础》010:下载过程中常见问题(如网速慢、文件损坏)

针对QGIS下载过程中的常见问题提供了系统解决方案。主要解决下载速度慢(≤100KB/s)和文件损坏两大核心问题:通过切换国内镜像源(如清华大学、阿里云)、使用专业下载工具提升速度;采用MD5/SHA256校验确保文件完整性,并排查存储介质和杀毒软件干扰。文章还包含macOS权限问题、Linux依赖缺失等高频问题的速解方案,并附详细的排查流程图和预防技巧,帮助用户顺利完成QGIS下载。后续将详细介绍安装流程,适合零基础用户参考。

LuckyHanMo的博客 482

【ROS2】为什么要使用ROS2?《ROS2系统特性介绍》

2010年,ROS1首次发布正式版本,其研发的初衷是为设计PR2(个人服务型机器人)共用的软件架构。但随着ROS1技术的普及,ROS1开始广泛融入各领域无人系统的研发,陆续暴露了系统的诸多问题。为了适应新时代机器人研发的需要,2022年5月,ROS开发者团队推出新版本ROS2。.........

后厂村路蔡徐坤的博客 9599

基于A*算法的二维栅格地图路径规划与避障MATLAB仿真

本文将介绍如何使用MATLAB编写基于A*算法的二维栅格地图路径规划与避障的仿真程序。我们可以使用二维数组表示地图,其中每个元素表示一个栅格的状态,例如1表示障碍物,0表示可行走区域。接下来,我们需要定义A*算法的节点类。G值表示从起始节点到当前节点的代价,H值是启发式函数估计的从当前节点到目标节点的代价。算法,我们可以有效地找到起始点到目标点的最短路径,并在仿真中进行可视化展示。算法的基本思路是从起始节点开始,按照一定的启发式函数选择下一个节点,直到找到目标节点或者遍历完所有可行走区域。

ByteWhizX的博客 1273
上一篇: TOPP
下一篇: 使用moveit控制真实机械臂
柠檬是水果
博客等级 码龄8年 4粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值