动力学约束下的运动规划算法——两点边界值最优控制问题 OBVP

   OBVP 即 optimal bundary value problem,即最优的BVP, BVP 问题其实就是解决 state sampled lattice planning 的基本操作方法。

   如果,我们期望无人机从一个状态移动到另一个状态,即给定初始状态和终点状态,求解两个状态之间的局部轨迹,假设我们选取的目标函数(代价函数)是无人机三轴耗费的能量之和最少,如下式所示:

   J Σ = ∑ k = 1 3 J k , J k = 1 T ∫ 0 T j k ( t ) 2 d t . \begin{aligned}J_{\Sigma}=\sum_{k=1}^{3}J_{k}, \quad \quad J_{k}=\frac{1}{T}\int_{0}^{T}j_{k}(t)^{2}dt.\end{aligned} JΣ=k=13Jk,Jk=T10Tjk(t)2dt.

   状态量选取为三轴位置、三轴速度、三轴加速度、输入的控制变量选取为三轴jerk,如下式所示:

   state: s k = ( p k , ν k , a k ) Input: u k = j k \text{state:}\quad s_k=(\begin{matrix}p_k,\nu_k,a_k\end{matrix})\quad\text{Input:}\quad u_k=j_k state:sk=(pk,νk,ak)Input:uk=jk

   系统的模型或者说状态方程如下所示:

   s ˙ k = f s ( s k , u k ) = ( v k , a k , j k ) \dot{s}_k=f_s(s_k,u_k)=(v_k,a_k,j_k) s˙k=fs(sk,uk)=(vk,ak,jk)

   我们可以利用庞特里亚金最小值原理来求解该最优控制问题,在使用庞特里亚金最小值原理的时候,我们需要定义一个协态 ,有多少状态量就有多少协态 λ = ( λ 1 , λ 2 , λ 3 . . . . . . ) \lambda=(\lambda_{1},\lambda_{2},\lambda_{3}......) λ=(λ1,λ2,λ3......)

   下面先来介绍一下庞特里亚金最小值原理,其包含三个公式,第一个公式:协态量的导数是具有最优状态量和控制量的汉密尔顿函数的关于各个状态量的导数。

   λ ˙ ( t ) = − ∇ s H ( s ∗ ( t ) , u ∗ ( t ) , λ ( t ) ) \dot{\lambda}(t)=-\nabla_sH\left(s^*(t),u^*(t),\lambda(t)\right) λ˙(t)=sH(s(t),u(t),λ(t))

   其中, s ∗ 、 u ∗ s^*、u^* su分别是最优的状态量和控制量

   第二个公式是边界条件公式,如果边界条件不确定,则需要使用该公式。

   λ ( T ) = − ∇ h ( s ∗ ( T ) ) \lambda(T)=-\nabla h(s^{*}(T)) λ(T)=h(s(T))

   h被定义成终末状态的函数或者说终末状态的惩罚项(离我们期望的最终状态差距越大,该项值越大)。这个公式代表终末状态时间T的时候,协态与终末状态中最优的自由量的梯度的和等于0.。

   在上述的例子中,我们要求上面的问题中的终末状态的p,v,a均达到指定状态,那么这个公式就不需要使用了,因为终末状态没有任何自由度,如果说我们只希望终末状态的位置p达指定状态,v,a无所谓,那么我们可以根据这个公式写出两个边界条件来帮助我们确定待定系数。

   第三个公式:最优的控制是具有最优状态的汉密尔顿函数的最小值

   u ∗ ( t ) = arg ⁡ min ⁡ u ( t ) H ( s ∗ ( t ) , u ( t ) , λ ( t ) ) u^*(t)=\arg\min_{u(t)}H\left(s^*(t),u(t),\lambda(t)\right) u(t)=argu(t)minH(s(t),u(t),λ(t))


   那么接下来,我们正式来看一下如何使用上面介绍的庞特里亚金最小值原理来求解本文开始处介绍的问题,我们需要定义一个Hamiltonian汉密尔顿函数,它由状态量s(就是本问题中的p,v,a), 控制量u(也就是我们这里的jerk),以及协态 λ \lambda λ 组成

   H ( s , u , λ ) = 1 T j 2 + λ T f s ( s , u ) = 1 T j 2 + λ 1 ν + λ 2 a + λ 3 j \begin{aligned} H(s,u,\lambda)& =\frac{1}{T}j^{2}+\lambda^{T}f_{s}(s,u) \\ &=\frac{1}{T}j^{2}+\lambda_{1}\nu+\lambda_{2}a+\lambda_{3}j \end{aligned} H(s,u,λ)=T1j2+λTfs(s,u)=T1j2+λ1ν+λ2a+λ3j

   其中第一项中的 1 T j 2 \frac1Tj^{2} T1j2中的 j 2 j^{2} j2是目标函数 J k = 1 T ∫ 0 T j k ( t ) 2 d t . J_k=\frac1T\int_0^Tj_k(t)^2dt. Jk=T10Tjk(t)2dt.的被积分项,若目标函数的被积分项改为其他项,则此处也要进行对应修改。

   由庞特里亚金最小值原理的第一个公式,即将Hamiltonian汉密尔顿函数分别对状态变量p、v、a求偏导可得下式:

   λ ˙ = − ∇ s H ( s ∗ , u ∗ , λ ) = ( 0 , − λ 1 , − λ 2 ) \dot\lambda=-\nabla_sH(s^*,u^*,\lambda)=(0,-\lambda_1,-\lambda_2) λ˙=sH(s,u,λ)=(0,λ1,λ2)

   我们得到了一个 λ \lambda λ的微分方程,然后我们对其积分获得 λ \lambda λ的表达式, λ 1 \lambda_1 λ1是关于p的导数, λ 2 \lambda_2 λ2是关于v的导数, λ 3 \lambda_3 λ3是关于a的导数,所以 λ 1 \lambda_1 λ1的导数是 λ 2 \lambda_2 λ2 λ 2 \lambda_2 λ2的导数是 λ 3 \lambda_3 λ3。所以很容易写出下面的表达式

   λ ( t ) = 1 T [ − 2 α 2 α t + 2 β − α t 2 − 2 β t − 2 γ ] \lambda(t)=\frac{1}{T}\begin{bmatrix}-2\alpha\\2\alpha t+2\beta\\-\alpha t^2-2\beta t-2\gamma\end{bmatrix} λ(t)=T1 2α2αt+2βαt22βt2γ

   我们没有使用边界条件公式,那么如何来求解上面的系数α、β、γ呢?因为我们会指定初始状态和最终想要达到的目标状态,所以,我们可以利用 s ( 0 ) = ( p 0 , v 0 , a 0 ) s(0)=(p_0,v_0,a_0) s(0)=(p0,v0,a0) s ( T ) = ( p T , v T , a T ) s(T)=(p_T,v_T,a_T) s(T)=(pT,vT,aT)这两个条件来求解系数α、β、γ。

   我们将这三个系数放在这里,先利用庞特里亚金最小值原理的第三个公式求最优的控制 u ∗ u^* u,前面我们已经得出 H ( s , u , λ ) = 1 T j 2 + λ 1 ν + λ 2 a + λ 3 j H(s,u,\lambda)=\frac1Tj^2+\lambda_1\nu+\lambda_2a+\lambda_3j H(s,u,λ)=T1j2+λ1ν+λ2a+λ3j,然而第三个公式中使用的是最优的 s ∗ s^* s,而不是s, s ∗ ( t ) = ( p ∗ , v ∗ , a ∗ ) s^*(t)=(p^*,v^*,a^*) s(t)=(p,v,a) 所以:

   H ( s ∗ , u , λ ) = 1 T j 2 + λ T f s ( s , u ) = 1 T j 2 + λ 1 v ∗ + λ 2 a ∗ + λ 3 j , \begin{aligned} H(s^*,u,\lambda)& =\frac{1}{T}j^{2}+\lambda^{T}f_{s}(s,u) \\ &=\frac1Tj^2+\lambda_1v^*+\lambda_2a^*+\lambda_3j, \end{aligned} H(s,u,λ)=T1j2+λTfs(s,u)=T1j2+λ1v+λ2a+λ3j,

   我们先把待定系数α、β、γ视为已知量,利用 λ \lambda λ关于α、β、γ的表达式,进一步可以得到 λ \lambda λ的值,则上面的 H ( s ∗ , u , λ ) H(s^*,u,\lambda) H(s,u,λ)表达式中,仅含有唯一变量 j j j,则求下式的最小值

   u ∗ ( t ) = j ∗ ( t ) = arg ⁡ min ⁡ u ( t ) H ( s ∗ ( t ) , u ( t ) , λ ( t ) ) = arg ⁡ min ⁡ u ( t ) 1 T j 2 + λ 1 v ∗ + λ 2 a ∗ + λ 3 j \begin{aligned} u^{*}(t)=j^{*}(t)& =\arg\min_{u(t)}H\left(s^*(t),u(t),\lambda(t)\right) \\ &=\arg\min_{u(t)}\frac1Tj^2+\lambda_1v^*+\lambda_2a^*+\lambda_3j \end{aligned} u(t)=j(t)=argu(t)minH(s(t),u(t),λ(t))=argu(t)minT1j2+λ1v+λ2a+λ3j

   可以等价转换成,求一个 j j j使得下式最小

   1 T j 2 + λ 3 j \begin{aligned}\frac{1}{T}j^2+\lambda_3j\end{aligned} T1j2+λ3j

   即让上式对 j j j求导等于0,即

   2 T j + λ 3 = 0 \begin{aligned}\frac{2}{T}j+\lambda_3=0\end{aligned} T2j+λ3=0

   解得:

   j ∗ = − T 2 λ 3 j^*=- \frac{T}{2}\lambda_3 j=2Tλ3

   将其代入到 H ( s ∗ ( t ) , u ( t ) , λ ( t ) ) H\left(s^*(t),u(t),\lambda(t)\right) H(s(t),u(t),λ(t))的表达式中,并且将 λ \lambda λ关于α、β、γ的表达式也代入后,可得:

   u ∗ ( t ) = j ∗ ( t ) = arg ⁡ min ⁡ j ( t ) H ( s ∗ ( t ) , j ( t ) , λ ( t ) ) = 1 2 α t 2 + β t + γ \begin{aligned}u^*(t)&=j^*(t)=\arg\min_{j(t)}H(s^*(t),j(t),\lambda(t))\\&=\frac{1}{2}\alpha t^2+\beta t+\gamma\end{aligned} u(t)=j(t)=argj(t)minH(s(t),j(t),λ(t))=21αt2+βt+γ

   至此,我们得到了仅含有待定系数 α 、 β 、 γ α、β、γ αβγ的最优输入量 u ∗ u^* u的表达式,由最优的输入量 u ∗ u^* u进行一次积分,可以得到最优状态量中的 a ∗ a^* a,再进行一次积分得到 v ∗ v^* v,再进行一次积分得到 p ∗ p^* p,则最优的状态量 s ∗ s^* s的表达式如下所示:

   s ∗ ( t ) = [ α 120 t 5 + β 24 t 4 + γ 6 t 3 + a 0 2 t 2 + ν 0 t + p 0 α 24 t 4 + β 6 t 3 + γ 2 t 2 + a 0 t + ν 0 α 6 t 3 + β 2 t 2 + γ t + a 0 ] s^*(t)=\left[\begin{aligned}\frac{\alpha}{120}t^5+\frac{\beta}{24}t^4+\frac{\gamma}{6}t^3+\frac{a_0}{2}t^2+\nu_0t+p_0\\\frac{\alpha}{24}t^4+\frac{\beta}{6}t^3+\frac{\gamma}{2}t^2+a_0t+\nu_0\\\frac{\alpha}{6}t^3+\frac{\beta}{2}t^2+\gamma t+a_0\end{aligned}\right] s(t)= 120αt5+24βt4+6γt3+2a0t2+ν0t+p024αt4+6βt3+2γt2+a0t+ν06αt3+2βt2+γt+a0

   将t=0代入到上式,即利用初始条件 s ( 0 ) = ( p 0 , v 0 , a 0 ) s(0)=(p_0,v_0,a_0) s(0)=(p0,v0,a0),可以确定上式中由于积分产生的系数 p 0 、 v 0 、 a 0 p_0、v_0、a_0 p0v0a0

   再把t=T代入上式,利用终止状态的条件 s ( T ) = ( p f , v f , a f ) s(T)=(p_f,v_f,a_f) s(T)=(pf,vf,af),得到以下关系式

   [ 1 120 T 5 1 24 T 4 1 6 T 3 1 24 T 4 1 6 T 3 1 2 T 2 1 6 T 3 1 2 T 2 T ] [ α β γ ] = [ Δ p Δ v Δ a ] \begin{bmatrix}\dfrac{1}{120}T^5&\dfrac{1}{24}T^4&\dfrac{1}{6}T^3\\\dfrac{1}{24}T^4&\dfrac{1}{6}T^3&\dfrac{1}{2}T^2\\\dfrac{1}{6}T^3&\dfrac{1}{2}T^2&T\end{bmatrix}\begin{bmatrix}\alpha\\\beta\\\gamma\end{bmatrix}=\begin{bmatrix}\Delta p\\\Delta v\\\Delta a\end{bmatrix} 1201T5241T461T3241T461T321T261T321T2T αβγ = ΔpΔvΔa

   其中

  
   [ Δ p Δ v Δ a ] = [ p f − p 0 − ν 0 T − 1 2 a 0 T 2 ν f − ν 0 − a 0 T a f − a 0 ] \begin{bmatrix}\Delta p\\\Delta v\\\Delta a\end{bmatrix}=\begin{bmatrix}p_f-p_0-\nu_0T-\dfrac{1}{2}a_0T^2\\\nu_f-\nu_0-a_0T\\a_f-a_0\\\end{bmatrix} ΔpΔvΔa = pfp0ν0T21a0T2νfν0a0Tafa0

   由此,可以解得待定系数 α 、 β 、 γ α、β、γ αβγ

   [ α β γ ] = 1 T 5 [ 720 − 360 T 60 T 2 − 360 T 168 T 2 − 24 T 3 60 T 2 − 24 T 3 3 T 4 ] [ Δ p Δ ν Δ a ] \begin{bmatrix}\alpha\\\beta\\\gamma\end{bmatrix}=\dfrac{1}{T^5}\begin{bmatrix}720&-360T&60T^2\\-360T&168T^2&-24T^3\\60T^2&-24T^3&3T^4\end{bmatrix}\begin{bmatrix}\Delta p\\\Delta\nu\\\Delta a\end{bmatrix} αβγ =T51 720360T60T2360T168T224T360T224T33T4 ΔpΔνΔa

   将上述解得的待定系数 α 、 β 、 γ α、β、γ αβγ代入到上面推导出的 u ∗ ( t ) u^*(t) u(t) s ∗ ( t ) s^*(t) s(t)的表达式中,即可得到所需的最优输入量(控制量)和最优状态量,其仅与时间T有关了,为时间T的函数。

   此外,得到最优的 u ∗ ( t ) u^*(t) u(t)后,由于 u ∗ ( t ) = j ∗ ( t ) u^*(t)=j^*(t) u(t)=j(t) J k = 1 T ∫ 0 T j k ( t ) 2 d t . J_{k}=\frac{1}{T}\int_{0}^{T}j_{k}(t)^{2}dt. Jk=T10Tjk(t)2dt.,我们可以把最优的目标函数值也求出来(还需要将 α 、 β 、 γ α、β、γ αβγ代入,代入后下面 J J J的表达式就只跟T相关了):

   J = γ 2 + β γ T + 1 3 β 2 T 2 + 1 3 α γ T 2 + 1 4 α β T 3 + 1 20 α 2 T 4 J=\gamma^2+\beta\gamma T+\frac{1}{3}\beta^2T^2+\frac{1}{3}\alpha\gamma T^2+\frac{1}{4}\alpha\beta T^3+\frac{1}{20}\alpha^2T^4 J=γ2+βγT+31β2T2+31αγT2+41αβT3+201α2T4

   即,我们只需要给定一个时间T,所有的量都确定了,如果不给定T,则目标函数的最小值,只需要将 J J J对T求导等于0,解出最优的T,所有的量也可以确定了,至此,我们完整的解决了文章开头给出的问题。


   在上面的例子中,我们默认机器人必须到达指定的终末状态,即当机器人到达指定的终末状态时,终末状态的惩罚项为0,否则为无穷大:

   h ( s ( T ) ) = { 0 , i f s = s ( T ) ∞ , o t h e r w i s e h(s(T))=\begin{cases}0,&\quad if\quad s=s(T)\\\infty,&\quad otherwise\end{cases} h(s(T))={0,,ifs=s(T)otherwise

   若,我们不指定所有的终末状态,比如只指定状态量p,而不指定v和a,即v和a是自由的,对于这些自由的状态,需要利用庞特里亚金最小值原理的第二个公式,添加边界条件

   g i v e n s i ( T ) , i ∈ I given s_i(T), i\in I givensi(T),iI

   上式中属于 i i i中的状态是指定的状态,不属于 i i i的状态是自由状态,我们需要构建如下的边界条件

   λ j ( T ) = ∂ h ( s ∗ ( T ) ) ∂ s j , f o r j ≠ i \lambda_j(T)=\frac{\partial h(s^*(T))}{\partial s_j},forj\neq i λj(T)=sjh(s(T)),forj=i

在这里插入图片描述



   参考资料:

   1、深蓝学院-移动机器人运动规划

   2、庞特里亚金最小值原理解最优控制问题


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/408472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日五道java面试题之spring篇(五)

目录: 第一题. 使用 Spring 有哪些方式?第二题. 什么是Spring IOC 容器?第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么?第五题. BeanFactory 和 ApplicationContext有什么区别? 第一题. 使用 Spring 有哪…

【Web】CTFSHOW 常用姿势刷题记录(全)

目录 web801 web802 web803 web804 web805 web806 web807 法一:反弹shell 法二:vps外带 web808 web809 web810 web811 web812 web813 web814 web815 web816 web817 web818 web819 web820 web821 web822 web823 web824 web825…

03|Order by与Group by优化

索引顺序依次是 : name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74],在这个基础上使用了age进…

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中,我们已经讲解了SpringBoot项目当中支持的三类配置文件: application.properties application.yml application.yaml 在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方式当中…

什么是MapReduce

1.1 MapReduce到底是什么 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。这个定…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像,这种情况下编写dockerfile文件不可避免,本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令: env指令用于设置shell的环境变量&am…

DBAPI如何使用数组类型参数

DBAPI如何使用数组类型参数 需求 根据多个id去查询学生信息 API创建 在基本信息标签&#xff0c;创建参数ids &#xff0c;参数类型选择 Array<bigint> 在执行器标签&#xff0c;填写sql&#xff0c;使用in查询 select * from student where id in <foreach ope…

《Docker 简易速速上手小册》第6章 Docker 网络与安全(2024 最新版)

文章目录 6.1 Docker 网络概念6.1.1 重点基础知识6.1.2 重点案例&#xff1a;基于 Flask 的微服务6.1.3 拓展案例 1&#xff1a;容器间的直接通信6.1.4 拓展案例 2&#xff1a;跨主机容器通信 6.2 配置与管理网络6.2.1 重点基础知识6.2.2 重点案例&#xff1a;配置 Flask 应用的…

设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?

前言 在面向对象编程中&#xff0c;有一条非常经典的设计原则&#xff1a;组合优于继承&#xff0c;多用组合少用继承。 为什么不推荐使用继承&#xff1f; 组合比继承有哪些优势&#xff1f; 如何判断该用组合还是继承&#xff1f; 为什么不推荐使用继承&#xff1f; 继承…

企业微信怎么变更企业名称?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…

内核解读之内存管理(8)什么是page cache

文章目录 0. 文件系统的层次结构1.什么是page cache2.感观认识page cache3. Page Cache的优缺点3.1 Page Cache 的优势3.2 Page Cache 的劣势 0. 文件系统的层次结构 在了解page cache之前&#xff0c;我们先看下文件系统的层次结构。 1 VFS 层 VFS &#xff08; Virtual Fi…

Gitflow:一种依据 Git 构建的分支管理工作流程模式

文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程&#xff0c;主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突&#xff0c;并能快速地完成项目&#xff0c;因此在很多软…

人工智能与机器学习行业新闻:颠覆企业运营方式的 AI 趋势

AI 推动业务转型 人工智能 (AI) 和机器学习已经在重塑各行各业的业务模式。AI 通过处理和整合数据支持战略决策的制定&#xff0c;其规模和速度远远超过了人脑。无疑&#xff0c;未来我们还将在 AI 领域取得许多重大突破&#xff0c;而拥有大量数据的行业可能会从人工智能革命…

Mac OS 下载安装与破解Typora

文章目录 下载Typora破解Typora1. 进入安装目录2. 找到并打开Lincense文件3. 修改激活状态4. 重新打开Typora 下载Typora 官网地址&#xff1a;typora官网 下载最新Mac版&#xff0c;正常安装即可 破解Typora 打开typora,可以看到由于未激活&#xff0c;提示使用期限还剩下15…

Three.js-01快速入门

1.导入three.js库 说明&#xff1a;资源在主页里面能够找到&#xff0c;如果不想使用本地的three.module.js文件&#xff0c;也可以使用在线的文件。 import * as THREE from "../three.module.js"// import * as THREE from https://unpkg.com/three/build/three.m…

学习 LangChain 的 LCEL

学习 LangChain 的 LCEL 0. 引言1. 基本示例&#xff1a;提示模型输出解析器​1-1. Prompt​1-2. Model1-3. Output parser1-4. Entire Pipeline 0. 引言 LCEL(LangChain Expression Language) 可以轻松地从基本组件构建复杂的链&#xff0c;并支持开箱即用的功能&#xff0c;…

mongoose httpserver浅析

文章目录 前言一、结构体及其功能二、函数MG_LOGmg_http_listenmg_mgr_poll question参考链接 前言 mongoose是一款基于C/C的网络库&#xff0c;可以实现TCP, UDP, HTTP, WebSocket, MQTT通讯。mongoose是的嵌入式网络程序更快、健壮&#xff0c;易于实现。 mongoose只有mong…

【网络编程】okhttp源码解析

文章目录 配置清单框架结构解析 配置清单 首先了解一下okHttp的配置清单&#xff1a; Dispatcher dispatcher &#xff1a;调度器&#xff0c;⽤于调度后台发起的⽹络请求&#xff0c;有后台总请求数和单主机总请求数的控制。List<Protocol> protocols &#xff1a;⽀持…

idea 打jar包、lib文件夹

idea目录文件 idea四层级结构 idea操作Java文件的基本单位&#xff1a;项目&#xff08;Project&#xff09;。对应四级结构 第1层级架构&#xff1a;项目&#xff08;project&#xff09; 在 IntelliJ IDEA 中Project是最顶级的结构单元&#xff0c;然后就是Module&#xf…

[HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 网页标题:手机批发业务-商品备选区<