文章目录 1. TF数据的发送 法1:发送手动封装的tf数据 法2:发布已经封装好的tf数据 2. TF树的查看 (1)查看当前tf树: (2)查看两个frame的变换关系 (3)根据当前tf树创建一个pdf图 3. 定义位姿的常用API (1)定义空间点和空间向量
文章目录 使用案例 工具箱单位 动力学属性 动力学方程 使用案例 以艾利特EC66机器人为例,基本的运动学及动力学计算函数的使用如下: clear,clc,close all % 导入机器人 robot = importrobot('ec66.urdf'); currentRobotJConfig = homeConfiguration(robot) %
clear,clc; % 系统参数 m=2; g=9.81; I=1; L=0.5; % 状态空间模型 A = [0 1 0 0; 0 0 -m*g*L^2/I 0; 0 0 0 1; 0 0 m*g*L/I 0] B = [0; (I-m*L^2)/(I*m); 0; L/I] C = [1 0 0 0;
函数列表 函数 说明 modbus 创建MODBUS对象 read 从MODBUS服务器读取数据 write 对连接的MODBUS服务器执行写操作 writeRead 在单个MODBUS事务中对一组保持寄存器执行写然后读操作 maskWrite 在保持寄存器上执行掩码写入操作 instrhwi
主要通过MATLAB控制系统工具箱的内置函数实现。 1. 简单传递函数 栗子1: >> num1=[25]; >> den1=[1 1 25]; >> G1=tf(num1,den1) G1 = 25 ------------ s^2 + s + 25 Continuous-time tran
1. Switch 参考文献: Simulink switch模块的使用方法 对于Switch Case与If使用类似,具体可参考这篇博文:Simulink学习——switch-case语义的实现(switch-case子系统) 2. If及If Action Subsystem Number of inputs:输入端口的数目 If expression:
内容列表 法1:多元非线性回归方法 法2:cftool拟合工具箱 法1:多元非线性回归方法 scatter(unnamed(:,1),unnamed(:,2),10,'r','filled') myfunc = inline('beta(1).*sign(x)+beta(2).*x','beta','x'); beta0=[0.5,0.5]'; beta=nlin
使用方法 具体参考官方文档: 传送门1-timer 类 传送门2-计时器回调函数 传送门3-使用计时器安排命令的执行 四种定时模式: sigleShot:只执行一次,故Period属性不起作用,其他模式都可以执行多次 fixedDelay:上一次TimerFcn执行完毕时刻到下一次TimerFcn被加入队列时刻之间的间隔 fixedRate:
函数: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 返回输入序列x的上下包络线,作为其解析信号的大小。 % % x的解析信号是利用希尔伯特实现的离散傅里叶变换得到的。 % % 这个函数首先移除x的均值,然后在计算包络线之后再把它加回来。 % % 如果x是
从上图来看,S-function可支持多种语言编写,本文为MATLAB版使用笔记。 为什么使用S-function 博主个人认为,S-function可以看成一个单独的系统,在Simulink中,如果使用MATLAB Function模块,每次执行,仅仅是调用函数而已,无法记录上一次调用后产生的状态,而S-function则可以保存上一时刻状态,因此我认为这种情况下使用S-func
内容列表 1. 常用模式 2. 控制模式的设置(EtherCAT通讯DS402协议) 1. 常用模式 回零模式 (Homing Mode):顾名思义,用于寻零 轮廓位置模式(Profile Position Mode):上位机给定目标绝对/相对位置、速度、加减速参数,伺服内部的轨迹发生器根据以上参数生成目标位置曲线指令,经由驱动器内部实现三环控制 轮廓速
1. 公式 比例项可以让系统尽快达到一个小的误差范围,积分项对比例项作用产生的误差进行积分,也就是放大产生的误差,让其更快达到目标,但这时会导致系统过冲量较大,微分项的引入会抑制过冲。 作用: P:加快调节速度I:减小误差,从而消除静差D:改善系统的动态性能进行离散化处理 假设系统采样时间为△ t ,e ( t ) 将序列化为: 将输出u ( t )序列化得到: 比例项
声明 图片版权归原作者所有,侵权请联系! 1. 钢轮固定+柔轮输出 此时,传动比为减速器手册上所标注的减速比,一般为10的整数倍。 2. 柔轮固定+钢轮输出 此时,传动比为减速器手册上所标注的减速比+1,一般为10的整数倍+1。 3. 原因 选择不同的输出方式,其减速比不同的原因大概是为了减小齿轮的磨损,或者说为了让磨损更均匀,有利于使用寿命的增长,具
声明:本文为张晓辉博士在睿慕课开设的《工业机器人控制系统的设计》公开课学习笔记,版权归原作者及睿慕课所有,如有侵权,请联系删除。 第2章 控制系统功能组成 2-1 人机交互模块 2-2 数字控制核心模块 2-3 可编程逻辑控制模块 2-4 数据通信模块 非实时网络通信 实时网络通信 第3章 控制系统软件架构 3-1 基于PLCOpen的
PDO:过程数据对象(Process Data Object),过程数据的发送,实时、速度快,提供对设备应用对象的直接访问通道,它用来传输实时短帧数据,具有较高的优先权。PDO 传输的数据必须少于或等于 8 个字节,在应用层上不包含传输控制信息,报文利用率极高。 SDO:服务数据对象(Service Data Obiect),服务数据的发送接收,实时性要求不高,SDO一般用来配置
内容列表 1. libmodbus库的使用 2. Modbus TCP开发实践 案例1 案例2 3. Modbus TCP多机通信应用案例 1. libmodbus库的使用 Step 1:初始化RTU/TCP指针 modbus_t *ctx; ctx = modbus_new_tcp(“192.168.191.1”,502); Step 2:初始化变
内容列表 1 描述 2 环境(contexts) 2.1 RTU环境 2.2 TCP(IPv4)环境 2.3 TCP PI(IPv4和IPv6)环境 3 通用函数 3.1 释放modbus环境 3.2 设置从站ID 3.3 启用调试模式 3.4 超时设置: 3.5 用于数据操作的宏 3.6用于操作位和字节的函数(3.1.4版本修改) 3.7 设
内容列表 1. 关键词 2. 数据集 3. 框架 4.大会/论坛 5.相关论文 1. 关键词 模仿学习:Imitation learning 2. 数据集 图像识别领域的数据集:ImageNet目标检测的数据集:COCO机器问答的数据集:SQuAD 3. 框架 斯坦福的李飞飞实验室,开源了分布式强化学习训练框架SURREAL,用来加速学习过程。 团队
Power PMAC与上位机的Modbus通信1. 启动modbus服务器2. 用户共享内存缓冲区变量说明3. 读取和发送数据3.1 发送数据3.2 读取数据4. EtherCAT网络的使能声明1. 启动modbus服务器将以下程序写入全局变量文件中,建议新建一个单独的文件modbus.pmh文件来存放以下代码: /****************************************
Power PMAC中PLC程序及子程序的编写1. PLC程序的编写2. 使能和关闭PLC程序的方法3. PLC中运行运动程序的方法4. PLC调用子程序的方法5. 子程序的编写1. PLC程序的编写对于PLC程序的语法结构与运动程序prog写法相同,不再赘述,需要请翻看文章《Power PMAC运动控制器 —— 学习笔记2》,其他可以在PLC中使用的函数或者符号请在手册《Power PMAC S
Power PMAC中正逆运动学的实现1. 为什么要使用正逆运动学 ?2. 怎样创建正逆运动学子程序 ?3. 如何编写运动学程序?3.0 预备工作3.1 逆运动学3.2 正运动学3.3 运动学在C语言中的实现4. 官方例程讲解5. 机械臂运动学讲解声明1. 为什么要使用正逆运动学 ?正运动学:通过各关节角度求坐标系下的位姿逆运动学:给定坐标系下的位姿,反解各关节角度
Power PMAC中运动程序的编写 —— 下1. 坐标系和轴定义1.1 轴定义1.2 坐标系定义1.3 坐标系及轴的定义例程2. 运动模式的介绍2.1 相对模式与绝对模式2.2 运动模式(直线、圆弧、样条、PVT)3. 运动程序的编写3.1 编写流程3.2 运动程序模板(重要!)4. 数据跟踪5. 编程实例声明1. 坐标系和轴定义定义坐标系的两种方法: 坐标轴定义语句,用于将电机映射到具有简单
Power PMAC中运动程序的编写 —— 上0. 说明1. Power PMAC与驱动器的的连接2. Power PMAC中Project的结构树介绍(重要!)3. 硬件在控制器中的配置(重要!!)4. 在线命令介绍5. 参数和变量定义5.1 变量声明的关键字5.2 变量声明的示例5.3 特殊数值的表示6. 运算符的使用7. 程序语法whileifswitchgoto8. 后记声明前记: 在编
Power PMAC运动控制器——学习笔记1说明1. 硬件介绍2. 准备工作3. PMAC与上位机的连接4. 创建自己的伺服控制项目5. 程序下载流程6. 学习途径后记 有很多朋友跟博主一样,拿到PMAC控制器后一脸懵逼,技术只给了几个英文手册,便什么都不管了,咨询问题的时候敷衍了事。为了避免更多朋友像博主一样,决定跟大家分享一下Power PMAC运动控制器的使用经验。 项目结题
0. 插件类型 当前有6种插件类型: World Model Sensor System Visual GUI 可通过URDF文件引用的类型: ModelPlugins, 提供对 physics::Model API的访问,传送门 SensorPlugins, 提供对 sensors::Sensor API的访问,传送门 VisualPlugins
激光噪声 对于射线传感器,我们将高斯噪声添加到每个光束的范围内。您可以设置从中采样噪声值的高斯分布的平均值和标准偏差。对每个光束独立地采样噪声值。添加噪声后,将得到的范围钳位在传感器的最小和最大范围(包括该范围)之间。 mkdir -p ~/.gazebo/models/noisy_laser gedit ~/.gazebo/models/noisy_laser/mode
(1)gazebo发布的参数 /use_sim_time:Bool-通知ROS使用已发布的/ clock主题作为ROS时间。 如果应通过/use_sim_time参数使用仿真时间,则Gazebo使用ROS参数服务器通知其他应用程序,尤其是Rviz。 启动gazebo_ros时,gazebo应将其自动设置为true 如果gazebo发布到ROS的/clock话题作为ROS系
Gazebo文件级 /usr/include/gazebo-9/gazebo 1. 主题订阅 Gazebo基于TCP/IP套接字通信,该套接字允许单独的程序与Gazebo进行交互。Gazebo使用Boost ASIO管理通信层,Google Protobufs用来进行消息传递和序列化库。 使用发布者-订阅者机制,通过TCP/IP套接字与Gazebo通信的最简单方法是链接Ga
1. 平移摩擦 Gazebo的物理引擎(如ODE,Bullet,Simbody,DART)都有不同的摩擦模型,摩擦力参数列表可参见传送门。 假设使用的默认物理引擎ODE 摩擦力的工作原理 ODE中由两部分组成,mu和mu2,ODE将自动计算第一、第二摩擦方向: mu是第一摩擦方向的库伦摩擦系数 mu2是垂直于第一摩擦方向的第二摩擦方向摩擦系数 两个对象发生碰撞
风格: 所有Python代码必需放在一个模块的命名空间 ROS导出源码到依赖所在的路径,因此不能跟其他人的导入冲突 推荐使用模块名作为包名 # 不带msg/srvs的情况下: packagename |- src/ |- packagename.py |- scripts/ |- non-exported python files # 带msg/srvs的情况下: p
问题叙述:默认情况下,ROS_INFO是不支持中文编码的,如果在终端打印一些中文字符串,会显示一连串??????? 解决方案:将编码修改为utf8,程序开题添加如下代码: setlocale(LC_CTYPE,"zh_CN.utf8"); setlocale()函数用于设置程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,该函数位于头文件#include <locale.
编译报错 Error(s) in package ’ /home /miracle/catkin cobot/src/cobot base IdeModel/ package.xmL’:Error(s): The manifest of package ”cobot_ baseIdeModeL" (with format version 1) must not contain the follow
注意:sw_urdf_exporter V1.5版本已经没有此问题了下载网址:http://wiki.ros.org/sw_urdf_exporter 解决方案:把邮箱中的2改成@即可 解决方案:把display.launch文件中的 /robots 删掉 File -> save config添加滑动条:display.launch中的default参数把false改成ture
编译过程中出现如下错误:/home/jack/dhrobot_ws/src/dhrobot_demo/src/up_down_demo.cpp:62:84: error: no matching function for call to ‘ros::NodeHandle::subscribe(constchar [15], int, bool (&)(const Bool&))’r
编译过程中出现如下错误:beginner_tutorials/CMakeFiles/listener.dir/build.make:62: recipe for target ‘beginner_tutorials/CMakeFiles/listener.dir/src/listener.cpp.o’ failedmake[2]: *** [beginner_tutorials/CMakeFile
创建ROS消息和ROS服务 1.创建完msg, 编译过程中出现如下错误: CMake Error at beginner_tutorials/CMakeLists.txt:51 (add_message_files):Unknown CMake command “add_message_files”.– Configuring incomplete, errors occurred!See als
文章目录 1. 插件的添加 2. SDF参数说明 传感器通用参数: ForceTorque特定参数: 3. 说明 4. 示例sdf文件 1. 插件的添加 在相应的<joint>标签内添加如下代码: <sensor name="force_torque" type="force_torque">
文章目录 Step1:添加头文件 Step2:添加成员变量 Step3:修改`Load`函数 Step4:修改CmakeLists.txt文件 Step5:编译 Step6:使用ROS测试是否可控 Step1:添加头文件 #include <thread> #include "ros/ros.h" #include "ros/callback_queue.h" #include
文章目录 0. 准备 1. 修改SDF 2. 编写插件 3. 执行 4. 插件配置 修改插件,读取自定义SDF参数 创建API 测试消息传递API 0. 准备 sudo apt-get install libgazebo9-dev 修改SDF在相应的<model>标签下添加如下代码: <plugin name="velodyne_control
文章目录 1. 传感器 2. 关节测试 3. 模型外观 4. 传感器噪声 <?xml version="1.0" ?> <sdf version="1.5"> <world name="default"> <!--#####################################################################
文章目录 0.坐标系1. GUI2. 模型编辑器参数设置关节设置传感器添加添加插件 官方教程 API文档 gazebo_ros_pkgs包含了gazebo_ros、gazebo_plugins、 gazebo_msgs三个子包: gazebo_ros:提供ROS插件,包括消息和服务发布者,以通过ROS与Gazebo进行接口gazebo_plugins:与机器人无关的Gazebo插件,用于传感器,电
嗨伙计们,由于个人学习工作等原因沉寂了大半年,忙碌好不容易暂告一段落,今天罗伯特祥终于又和大家见面了! 前段时间,有好多网友email我问Elmo的Platinum Maestro运动控制器中modbus通信的问题,今天呢就系统的跟大家一起聊聊这件事儿。(多图预警) 1. modbus的扯谈 首先明确Modbus是干啥的,它其实就是一种工业现场总线协议标准,属于应用层报文传输协议,包括ASCI
文章目录 说明 1. 动力学模型 2. 仿真 程序1:位置先于速度更新 程序2:速度更新先于位置更新 3. 分析 问题1:仅仅换了更新位置,为什么会出现这么大的差别呢? 问题2:为什么步长影响会这么大? 4. 总结 声明 说明 今年3月初,博主西涯先生提出一个
文章目录 1. 什么时候会出现零空间 2. 零空间控制的基本原理 3. 应用 4. 说明 5. 零空间阻抗控制 6. 任务优先级控制 7. 无反作用零空间 先来三幅经典的案例图:  
声明:本文整理自网络,内容仅作博主学习笔记记录,版权归原作者所有! 官方参考文档: https://www.mathworks.com/help/ros/index.html?s_tid=CRUX_lftnav https://www.mathworks.com/help/ros/ros-in-simulink.html?s_tid=CRUX_lftnav 1. ROS
嗨伙计们,我又来啦~ 在上次的文章[《webots玩转控制论之LQR控制器》](https://www.guyuehome.com/17688)中,我们假设系统是全状态反馈的,基于LQR实现了倒立摆的平衡控制,但是在实际情况中并非所有状态量都是能够直接通过测量得到的,那么这时基于全状态反馈的控制就不一定有效了。为了解决这个问题呢,我们就需要设计一个状态观测器,去估计系统不
J0:假设位姿q(1xN)对应的雅克比矩阵(6xN),N为机器人关节的个数,机器人雅克比矩阵将关节速度与末端执行器空间速度V=J0*qd映射到世界坐标系中,即在末端执行器坐标系中计算雅可比矩阵并将其转换为世界坐标系 Jn:在末端执行器坐标系中,机械手雅可比矩阵将关节速度映射到末端执行器空间速度V = Jn*qd,这个雅可比矩阵通常被称为几何雅可比矩阵。
文章目录 算法求解过程 代码及解析(参考Robotics Toolbox) 算法求解过程 参数说明: a i a_iai:{0}-{i}之间的矢量距离 e i e_iei:在base系下描述的关节轴向量 p pp:{0}-{p}之间的矢量
先上结论: 在构型空间(也就是C空间中),不管机器人的构型如何,有几个自由度,它在构型空间中都只是一个点!!! 1. Work-Space与C-Space的关系: 方向 操作 特点 C-Space => Work-Space 正运动学 满射 Work-Space => C-Space
文章目录 题记 机器人学中的惯性张量 惯性张量在不同坐标系下的转换 下面来举个栗子! 几个概念 博主瞎扯淡(猜错请批评指正) 参考文献: 题记 很早就想谈谈这个话题,奈何时间不允许。最近相对比较闲,所以来侃一侃机器人学中的惯性矩阵这点事儿。 机器人学中
嗨伙计们,我又来啦~ 想了这么长时间,终于准备着手了!今天跟大家一起分享下webots中是如何实现LQR控制的。 今天就不多啰嗦了,下面开始进入我要跟大家分享的内容。 还是老样子,我们先来介绍一下文章安排:第一部分,我们将在webots中进行仿真建模;第二部分,我们会对仿真模型进行物理建模,得到动力学方程;第三部分,跟大
嗨伙计们,我又来啦~ 上次说以后要写点儿控制的东西,思前想后纠结了好久到底要写个啥,最终决定还是先从参数辨识开始,至于结合控制理论的小demo,容我梳理一下思路再来搞吧! 进入正题之前,请先允许我…… 我还是进入正题吧! 说起参数辨识,当初刚入坑的时候可算是被折磨的体无完肤,其实思路很简单,就是坑稍微多一点儿,论文都搞的太复杂,包括网上一些网友写的教程也是没有那么容易理
嗨伙计们,忙到爆炸的月更侠罗伯特祥又来和大家见面了!今天我们来聊聊协作机器人中柔顺控制那点事儿~ 我们先来讲下本次文章的安排,首先我们要在webots中建立一个连杆模型,然后我们需要对它进行动力学建模,基于这个模型,我们通过阻抗控制使它呈现出一个柔顺的效果! 那进入正题之前呢,请允许我先来打波广告~ 之前呢,几篇
嗨,又和大家见面了!上次我们在《Webots建模指南3 -ROS控制篇(上)》这篇文章中梳理了Webots与ROS的通信过程,今天我就来带大家一起实操一下,看看Webots怎样实现ROS联合仿真,话不多说,下面进入正题~ 1.准备工作 环境说明: Ubuntu 18.04 LTS Webots R2020a-rev1 ROS Melodic 相信大家是老ROS了,新
又和大家见面了!今天跟大家聊聊Webots是如何跟ROS联合仿真的,话不多说,直接进入正题~ 1.开餐前的准备 关于仿真环境和机器人咱就不再重复建模了,还用上次的小车,具体参见文章《Webots建模指南2 – 机器人建模》,只不过在它的基础上又加了一个激光雷达。 哦!瞧瞧这绿的让人发慌的车轮子,瞧瞧这可怜的Kinect,为了给激光雷达留位置只能悬空在那儿~
1. GPS from controller import Robot from controller import GPS robot = Robot() timeStep = getBasicTimeStep() gps = robot.getGPS("gps_name") gps.enable(timeStep) gps.disable() # 获取当前GPS测量值,
嗨伙计们,罗伯特祥又来和大家见面了! 最近,很多小伙伴私信我,问我到底应该使用哪款仿真器来仿真,所以笔者临时决定结合自己的使用经历写篇科普文跟大家一起来分析对比一下Gazebo、Webots和V-REP这几款常用的机器人仿真软件。 首先是Gazebo,相信熟悉ROS的朋友无人不知Gazebo,它是属于ROS生态的一款开源仿真器,功能很强大,正因为其开源特性被广泛
嗨伙计们,月更侠罗伯特祥又来和大家见面了!今天我们来聊一聊Webots中关于机器人建模的那点事儿,相信有了前面的基础,今天的文章对你来说So easy!话不多说,我们来看看怎么玩儿吧~ 1.四轮差速小车建模 环境建模我们就略过去了,直接上图: HingeJoint节点的使用: 首先添加一个Robot节点,在子节点children下新建一个Shape作为车身,重命名为car-body,然后
嗨伙计们,还记得上次提到的三种webots机器人建模方式吗?我们先来简单回顾一下: ① 使用webots模型树建模,同时这也是我们环境建模的主要方式; ② 使用三维建模软件导出VRML,通常我们导入模型的零部件,然后在webots内进行装配; ③ 利用已有的urdf/xacro转换,使用urdf2webots功能包可直接获得所需的模型; 今天跟大家
首先我必须得承认Gazebo功能有多强大,然而对于大多数刚入门的新手来说,使用Gazebo仿真的时候各种参数的配置简直让人头疼,一不小心终端就是一片“爆红”!所以今天就给大家推荐另外一款机器人仿真软件——Webots。经历了20年商业许可的它,2018年终于以开源的身份面向广泛的机器人爱好者,让我们一起来了解一下吧! Webots到底有多好用? “地表最强”我不敢说,但它绝对是能够帮我们快速实
小伙伴们,大家好!我是罗伯特祥,很荣幸受到古月大神的邀请成为古月居的签约作者,同大家一起分享我的技术成长经验。 相信很多小伙伴都有过这样的经历,开发机器人或者自动化设备的过程中买过一些运动控制器,使用时发现不知道从哪儿着手使用,技术手册看的稀里糊涂,咨询技术有时又被敷衍了事。为了避免小伙伴们踩我曾经踩过的坑,决定跟大家分享一下我曾经用过的运动控制器使用方法。 &nb
https://share.weiyun.com/Y3yZDS24
是的,感谢指正
该部分纯建模无代码,课程相关代码请移步至古月github仓库
用urdf2webots导入比较方便,编程控制参见自带例程
把库加入python环境路径
通过位置差分即可
把库的路径加到python环境路径中,可自行百度,官方其他环境配置参见https://cyberbotics.com/doc/guide/using-your-ide
修改方式如下:step1,先将传感器转换成base node step2,修改相关字段关于Lidar传感器节点的详细字段解释请参考https://cyberbotics.com/doc/reference/lidar
使用常量模块解决
是的老铁,详情请关注我的主页
感谢分享,期待更详细的内容~
内容有误,l并非质心位置
第一件事先检查模型有无问题,根据需要修改Motor及Sensor的名称,剩下的就是写controller了,具体参考我的最早的几篇webots教程文章,套路都是一样的
以父坐标系为参考系设置,webots的建模逻辑就是这样的
是可以的哈,urdf2webots建议使用最新版本
关于这个产品的后续教程大概率是没有了
哈哈哈哈我是elmo深度用户,欢迎交流,邮箱:robert.h.x.s@foxmail.com
可能是环境配置的问题,没有话题说明程序压根就没运行,后面报错的原因是没在环境变量里配置WEBOTS_HOME的路径
收到,感谢大佬的建议
笔误没写清楚,一个东西,单轴模型
没有遇到过你说的问题,还得根据你的实际情况来看看
链接: https://pan.baidu.com/s/1ltFC2y8tS2eLSf9ZD4z4MA 提取码: vcd3
嗨老铁,R2020b以后的版本可以直接导入stl等格式的模型
大佬,求系列代码学习一下,感谢分享,邮箱robert.h.x.s@foxmail.com
已看到github链接
感谢大佬的分享,求源码学习,邮箱robert.h.x.s@foxmail.com
方便发送你的项目吗,可以发送到robert.h.x.s@foxmail.com,我需要根据实际情况来看,getMotor会直接搜索对应的节点名称
需要根据具体的项目来看,getMotor对应的参数应该是base中device的name,错误提示说没找到这个节点,所以你应该检查'base'是否为base中的电机name
安排!
跟大佬学习学习,我也讨一份代码,邮箱songhongxiang@163.com
古月居优秀创作者
读万卷书,也要行万里路!
积分
粉丝
勋章
TA还没有专栏噢
第三方账号登入
看不清?点击更换
第三方账号登入
QQ 微博 微信