autoware中的MPC控制原理

MPC算法
引言\n\n模型预测控制(MPC)是一种控制方法,在每个控制周期内解决优化问题,以确定基于给定车辆模型的最优控制序列。计算得到的控制输入序列用于控制系统。

简单来说,MPC控制器计算一系列控制输入,以优化状态和输出轨迹,达到期望的行为。MPC控制系统的关键特性可以总结为以下几点:

  1. 未来轨迹预测:MPC通过预测未来状态和输出轨迹来计算控制序列。第一个控制输入应用于系统,并在每个控制周期中以滚动时间窗的方式重复此过程。

  2. 约束处理:MPC能够在优化阶段处理状态和输入变量的约束,确保系统在规定的限制内运行。

  3. 复杂动态处理:MPC算法可以处理复杂的动力学,无论是线性还是非线性。

选择线性或非线性模型或约束方程取决于MPC问题的具体形式。如果运动方程或约束中存在任何非线性表达式,优化问题就变为非线性。在接下来的章节中,我们将逐步解释如何在MPC框架内解决线性和非线性优化问题。请注意,在本文件中,我们利用线性化方法来适应非线性模型。

线性MPC的公式化

公式化为优化问题

本节专门介绍线性系统的MPC。在下一节中,还将展示作为应用的车辆路径跟随问题的公式化。

在线性MPC公式化中,所有运动和约束表达式都是线性的。对于路径跟随问题,假设系统的运动可以通过一组方程来描述,称为(1)。状态演变和测量以离散状态空间格式呈现,其中矩阵ABC分别表示状态转移、控制和测量矩阵。

\begin{gather} x_{k+1}=Ax_{k}+Bu_{k}+w_{k}\\ y_{k}=Cx_{k} \tag{1} \\ x_{k}\in R^{n},u_{k}\in R^{m},w_{k}\in R^{n}, y_{k}\in R^{l}, A\in R^{n\times n}, B\in R^{n\times m}, C\in R^{l \times n} \end{gather}

方程(1)表示状态空间方程,其中x_k表示内部状态,u_k表示输入,w_k表示由线性化或问题结构引起的已知干扰。测量由变量y_k表示。

值得注意的是,MPC的另一个优点是能够有效处理干扰项w。虽然在这里称其为干扰,但只要遵循方程的结构,它可以采取多种形式。

方程(1)中的状态转移和测量方程是迭代的,从时间k移至时间k+1。通过从初始状态和控制对(x_0, u_0)出发,并结合指定的预测步数N,可以预测状态和测量的轨迹。

为简化起见,假设初始状态为x_0k=0。\n\n首先,我们可以使用方程(1)计算k=1时的状态x_1,将初始状态代入方程。由于我们正在寻找输入序列的解,我们将输入表示为符号表达式中的决策变量。

\begin{align} x_{1} = Ax_{0} + Bu_{0} + w_{0} \tag{2} \end{align}

然后,当k=2时,使用方程(2),我们得到

\begin{align} x_{2} & = Ax_{1} + Bu_{1} + w_{1} \\ & = A(Ax_{0} + Bu_{0} + w_{0}) + Bu_{1} + w_{1} \\ & = A^{2}x_{0} + ABu_{0} + Aw_{0} + Bu_{1} + w_{1} \\ & = A^{2}x_{0} + \begin{bmatrix}AB & B \end{bmatrix}\begin{bmatrix}u_{0}\\ u_{1} \end{bmatrix} + \begin{bmatrix}A & I \end{bmatrix}\begin{bmatrix}w_{0}\\ w_{1} \end{bmatrix} \tag{3} \end{align}

k=3时,从方程(3)可得

\begin{align} x_{3} & = Ax_{2} + Bu_{2} + w_{2} \\ & = A(A^{2}x_{0} + ABu_{0} + Bu_{1} + Aw_{0} + w_{1} ) + Bu_{2} + w_{2} \\ & = A^{3}x_{0} + A^{2}Bu_{0} + ABu_{1} + A^{2}w_{0} + Aw_{1} + Bu_{2} + w_{2} \\ & = A^{3}x_{0} + \begin{bmatrix}A^{2}B & AB & B \end{bmatrix}\begin{bmatrix}u_{0}\\ u_{1} \\ u_{2} \end{bmatrix} + \begin{bmatrix} A^{2} & A & I \end{bmatrix}\begin{bmatrix}w_{0}\\ w_{1} \\ w_{2} \end{bmatrix} \tag{4} \end{align}

如果k=n,那么

\begin{align} x_{n} = A^{n}x_{0} + \begin{bmatrix}A^{n-1}B & A^{n-2}B & \dots & B \end{bmatrix}\begin{bmatrix}u_{0}\\ u_{1} \\ \vdots \\ u_{n-1} \end{bmatrix} + \begin{bmatrix} A^{n-1} & A^{n-2} & \dots & I \end{bmatrix}\begin{bmatrix}w_{0}\\ w_{1} \\ \vdots \\ w_{n-1} \end{bmatrix} \tag{5} \end{align}

将(2)到(5)中的所有方程结合在一起,得到以下矩阵方程:

\begin{align} \begin{bmatrix}x_{1}\\ x_{2} \\ x_{3} \\ \vdots \\ x_{n} \end{bmatrix} = \begin{bmatrix}A^{1}\\ A^{2} \\ A^{3} \\ \vdots \\ A^{n} \end{bmatrix}x_{0} + \begin{bmatrix}B & 0 & \dots & & 0 \\ AB & B & 0 & \dots & 0 \\ A^{2}B & AB & B & \dots & 0 \\ \vdots & \vdots & & & 0 \\ A^{n-1}B & A^{n-2}B & \dots & AB & B \end{bmatrix}\begin{bmatrix}u_{0}\\ u_{1} \\ u_{2} \\ \vdots \\ u_{n-1} \end{bmatrix} \\ + \begin{bmatrix}I & 0 & \dots & & 0 \\ A & I & 0 & \dots & 0 \\ A^{2} & A & I & \dots & 0 \\ \vdots & \vdots & & & 0 \\ A^{n-1} & A^{n-2} & \dots & A & I \end{bmatrix}\begin{bmatrix}w_{0}\\ w_{1} \\ w_{2} \\ \vdots \\ w_{n-1} \end{bmatrix} \tag{6} \end{align}

在这种情况下,测量(输出)变为;y_{k}=Cx_{k},因此

\begin{align} \begin{bmatrix}y_{1}\\ y_{2} \\ y_{3} \\ \vdots \\ y_{n} \end{bmatrix} = \begin{bmatrix}C & 0 & \dots & & 0 \\ 0 & C & 0 & \dots & 0 \\ 0 & 0 & C & \dots & 0 \\ \vdots & & & \ddots & 0 \\ 0 & \dots & 0 & 0 & C \end{bmatrix}\begin{bmatrix}x_{1}\\ x_{2} \\ x_{3} \\ \vdots \\ x_{n} \end{bmatrix} \tag{7} \end{align}

我们可以将方程(6)和(7)组合为以下形式:

\begin{align} X = Fx_{0} + GU +SW, Y=HX \tag{8} \end{align}

这种形式与原始状态空间方程(1)相似,但引入了新矩阵:状态转移矩阵F、控制矩阵G、干扰矩阵W和测量矩阵H。在这些方程中,X表示预测状态,给定为

\begin{bmatrix}x_{1} & x_{2} & \dots & x_{n} \end{bmatrix}^{T}

现在,已经知道GSWH,我们可以将输出行为Y表示为输入U的函数。这使得我们能够计算控制输入U,使得Y(U)跟随目标轨迹Y_{ref}

接下来的步骤是定义成本函数。成本函数通常使用以下二次形式;

\begin{align} J = (Y - Y_{ref})^{T}Q(Y - Y_{ref}) + (U - U_{ref})^{T}R(U - U_{ref}) \tag{9} \end{align}

其中U_{ref}是目标或稳态输入,围绕此输入线性化用于U。\n\n这个成本函数与LQR控制器的成本函数是相同的。J的第一项惩罚与参考轨迹的偏差。第二项惩罚与参考(或稳态)控制轨迹的偏差。QR是正的和正半定的矩阵的成本权重。

注意:在某些情况下,U_{ref}=0被使用,但这可能意味着即使车辆正在转弯,转向角也应设置为0。因此在这里使用U_{ref}进行解释。这个U_{ref}可以根据目标轨迹的曲率或稳态分析进行预先计算。\n\n由于结果轨迹输出现在为Y=Y(x_{0}, U),成本函数仅依赖于U和初始状态条件,这导致成本J=J(x_{0}, U)。让我们找到最小化U

将方程(8)代入方程(9),并整理U的方程。

\begin{align} J(U) &= (H(Fx_{0}+GU+SW)-Y_{ref})^{T}Q(H(Fx_{0}+GU+SW)-Y_{ref})+(U-U_{ref})^{T}R(U-U_{ref}) \\ & =U^{T}(G^{T}H^{T}QHG+R)U+2\left\{(H(Fx_{0}+SW)-Y_{ref})^{T}QHG-U_{ref}^{T}R\right\}U +(\rm{constant}) \tag{10} \end{align}

这个方程是U的二次形式(即U^{T}AU+B^{T}U)。

U的二次项系数矩阵G^{T}C^{T}QCG+R是正定的,因为QR的正定和半正定性要求。因此,成本函数在U中是一个凸二次函数,可以通过凸优化有效地求解。

应用于车辆路径跟随问题(非线性问题)

由于具有运动学车辆模型的路径跟随问题是非线性的,因此我们无法直接使用前面描述的线性MPC方法。有几种方法可以处理非线性,例如使用非线性优化解算器。在这里,我们沿着参考轨迹对非线性车辆模型进行线性化,因此非线性模型被转化为线性时变模型。

对于非线性运动学车辆模型,离散时间更新方程如下:

\begin{align} x_{k+1} &= x_{k} + v\cos\theta_{k} \text{d}t \\ y_{k+1} &= y_{k} + v\sin\theta_{k} \text{d}t \\ \theta_{k+1} &= \theta_{k} + \frac{v\tan\delta_{k}}{L} \text{d}t \tag{11} \\ \delta_{k+1} &= \delta_{k} - \tau^{-1}\left(\delta_{k}-\delta_{des}\right)\text{d}t \end{align}

车辆参考点为后轴中心,所有状态在该点进行测量。状态、参数和控制变量如下表所示。

符号 含义
v 在后轴中心测量的车辆速度
\theta 全局坐标系中的偏航(航向角)
\delta 车辆转向角
\delta_{des} 车辆目标转向角
L 车辆轴距(后轴与前轴之间的距离)
\tau 一阶转向动态的时间常数

在本示例中,假设MPC只生成转向控制,而轨迹生成器提供沿轨迹的车辆速度。运动学车辆模型的离散更新方程包含三角函数;正弦和余弦,并且车辆坐标xy和偏航角是全局坐标。在路径跟踪应用中,通常将模型重新公式化为误差动态,以将控制转换为调节器问题,使目标变为零(零误差)。

我们对以下线性方程的推导做小角假设。考虑非线性动力学,省略纵向坐标x,结果方程组变为:

\begin{align} y_{k+1} &= y_{k} + v\sin\theta_{k} \text{d}t \\ \theta_{k+1} &= \theta_{k} + \frac{v\tan\delta_{k}}{L} \text{d}t - \kappa_{r}v\cos\theta_{k}\text{d}t \tag{12} \\ \delta_{k+1} &= \delta_{k} - \tau^{-1}\left(\delta_{k}-\delta_{des}\right)\text{d}t \end{align}

其中\kappa_{r}(s) 是沿轨迹的曲率,参数化为弧长。

在更新方程中,有三个表达式受线性近似的影响:横向偏差(或横向坐标)y、航向角(或航向角误差)\theta以及转向\delta。我们可以对航向角\theta做小角假设。

在路径跟踪问题中,已知轨迹的曲率\kappa_{r}。在较低速度时,Ackermann公式近似参考转向角\theta_{r}(此值对应于上述提到的U_{ref})。Ackermann转向表达式可以写为:

\begin{align} \delta_{r} = \arctan\left(L\kappa_{r}\right) \end{align}

当车辆转弯时,其转向角\delta应接近\delta_{r}的值。因此,可以表示为:

\begin{align} \delta = \delta_{r} + \Delta \delta, \Delta\delta \ll 1 \end{align}

将此方程代入方程(12),并近似\Delta\delta为小值。

\begin{align} \tan\delta &\simeq \tan\delta_{r} + \frac{\text{d}\tan\delta}{\text{d}\delta} \Biggm|_{\delta=\delta_{r}}\Delta\delta \\ &= \tan \delta_{r} + \frac{1}{\cos^{2}\delta_{r}}\Delta\delta \\ &= \tan \delta_{r} + \frac{1}{\cos^{2}\delta_{r}}\left(\delta-\delta_{r}\right) \\ &= \tan \delta_{r} - \frac{\delta_{r}}{\cos^{2}\delta_{r}} + \frac{1}{\cos^{2}\delta_{r}}\delta \end{align}

利用此表达式,\theta_{k+1}可以表示为:

\begin{align} \theta_{k+1} &= \theta_{k} + \frac{v\tan\delta_{k}}{L}\text{d}t - \kappa_{r}v\cos\delta_{k}\text{d}t \\ &\simeq \theta_{k} + \frac{v}{L}\text{d}t\left(\tan\delta_{r} - \frac{\delta_{r}}{\cos^{2}\delta_{r}} + \frac{1}{\cos^{2}\delta_{r}}\delta_{k} \right) - \kappa_{r}v\text{d}t \\ &= \theta_{k} + \frac{v}{L}\text{d}t\left(L\kappa_{r} - \frac{\delta_{r}}{\cos^{2}\delta_{r}} + \frac{1}{\cos^{2}\delta_{r}}\delta_{k} \right) - \kappa_{r}v\text{d}t \\ &= \theta_{k} + \frac{v}{L}\frac{\text{d}t}{\cos^{2}\delta_{r}}\delta_{k} - \frac{v}{L}\frac{\delta_{r}\text{d}t}{\cos^{2}\delta_{r}} \end{align}

最终,线性化的时间变化模型方程变为:

\begin{align} \begin{bmatrix} y_{k+1} \\ \theta_{k+1} \\ \delta_{k+1} \end{bmatrix} = \begin{bmatrix} 1 & v\text{d}t & 0 \\ 0 & 1 & \frac{v}{L}\frac{\text{d}t}{\cos^{2}\delta_{r}} \\ 0 & 0 & 1 - \tau^{-1}\text{d}t \end{bmatrix} \begin{bmatrix} y_{k} \\ \theta_{k} \\ \delta_{k} \end{bmatrix} + \begin{bmatrix} 0 \\ 0 \\ \tau^{-1}\text{d}t \end{bmatrix}\delta_{des} + \begin{bmatrix} 0 \\ -\frac{v}{L}\frac{\delta_{r}\text{d}t}{\cos^{2}\delta_{r}} \\ 0 \end{bmatrix} \end{align}

这个方程与线性MPC假设的方程(1)有相同的形式,但是矩阵ABw根据坐标变换而变化。为使其明确,整个方程写为:

\begin{align} x_{k+1} = A_{k}x_{k} + B_{k}u_{k}+w_{k} \end{align}

与方程(1)比较,A \rightarrow A_{k}。这意味着A矩阵是在轨迹附近的线性近似,在经过k步后(即k* \text{d}t秒)获得,如果提前知道轨迹。

利用此方程,依次写出更新方程(2)到(6)。

\begin{align} \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \\ \vdots \\ x_{n} \end{bmatrix} = \begin{bmatrix} A_{1} \\ A_{1}A_{0} \\ A_{2}A_{1}A_{0} \\ \vdots \\ \prod_{i=0}^{n-1} A_{k} \end{bmatrix} x_{0} + \begin{bmatrix} B_{0} & 0 & \dots & & 0 \\ A_{1}B_{0} & B_{1} & 0 & \dots & 0 \\ A_{2}A_{1}B_{0} & A_{2}B_{1} & B_{2} & \dots & 0 \\ \vdots & \vdots & &\ddots & 0 \\ \prod_{i=1}^{n-1} A_{k}B_{0} & \prod_{i=2}^{n-1} A_{k}B_{1} & \dots & A_{n-1}B_{n-1} & B_{n-1} \end{bmatrix} \begin{bmatrix} u_{0} \\ u_{1} \\ u_{2} \\ \vdots \\ u_{n-1} \end{bmatrix} + \begin{bmatrix} I & 0 & \dots & & 0 \\ A_{1} & I & 0 & \dots & 0 \\ A_{2}A_{1} & A_{2} & I & \dots & 0 \\ \vdots & \vdots & &\ddots & 0 \\ \prod_{i=1}^{n-1} A_{k} & \prod_{i=2}^{n-1} A_{k} & \dots & A_{n-1} & I \end{bmatrix} \begin{bmatrix} w_{0} \\ w_{1} \\ w_{2} \\ \vdots \\ w_{n-1} \end{bmatrix} \end{align}

由于它与方程(6)的形式相同,因此可以在之前的部分应用凸优化。

成本函数和约束条件

在本节中,我们详细说明如何设置成本函数和约束条件。

成本函数

误差和输入的权重

MPC状态和控制权重以类似于LQR的方式出现在成本函数中(9)。在上述描述的车辆路径跟随问题中,如果C是单位矩阵,则输出y = x = \left[y, \theta, \delta\right]。(为了避免与y方向偏差混淆,此处使用e表示横向偏差。)

作为示例,我们确定预测步数n=2系统的评价函数的权重矩阵Q_{1}如下:

\begin{align} Q_{1} = \begin{bmatrix} q_{e} & 0 & 0 & 0 & 0& 0 \\ 0 & q_{\theta} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & q_{e} & 0 & 0 \\ 0 & 0 & 0 & 0 & q_{\theta} & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} \end{align}

在成本函数(9)的第一项(n=2)中如下所示(Y_{ref}设置为0):

\begin{align} q_{e}\left(e_{0}^{2} + e_{1}^{2} \right) + q_{\theta}\left(\theta_{0}^{2} + \theta_{1}^{2} \right) \end{align}

这表明q_{e}是横向误差的权重,q_{\theta}是角度误差的权重。在这个例子中,q_{e}充当比例-P增益,而q_{\theta}充当导数-D增益,用于横向跟踪误差。这些因素的平衡(包括R)将通过实际实验来确定。

非对角线项的权重

MPC可以在其计算中处理非对角线项(只要结果矩阵是正定的)。

例如,写出n=2系统的Q_{2}如下:

\begin{align} Q_{2} = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & q_{d} & 0 & 0 & -q_{d} \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & -q_{d} & 0 & 0 & q_{d} \end{bmatrix} \end{align}

使用Q_{2}展开评价函数的第一项:

\begin{align} q_{d}\left(\delta_{0}^{2} -2\delta_{0}\delta_{1} + \delta_{1}^{2} \right) = q_{d}\left( \delta_{0} - \delta_{1}\right)^{2} \end{align}

q_{d}的值按\delta变化的量加权,这将防止轮胎快速移动。通过添加这一部分,系统可以评估跟踪精度与转向角变化之间的平衡。

由于权重矩阵可以线性相加,因此最终权重可设置为Q = Q_{1} + Q_{2}。\n\n此外,MPC在一段时间内进行优化,可以考虑时间变化的权重。

约束条件

输入约束

MPC控制器的主要优势是能够处理任何状态或输入约束。约束可以表示为盒约束,例如“轮胎角度必须在±30度以内”,可以以以下形式表示:

\begin{align} u_{min} < u < u_{max} \end{align}

约束必须在线性MPC应用中保持线性和凸性。

输入导数约束

我们还可以对输入的偏差施加约束。由于转向角的导数是\dot{u},其盒约束为:

\begin{align} \dot{u}_{min} < \dot{u} < \dot{u}_{max} \end{align}

我们将\dot{u}离散化为\left(u_{k} - u_{k-1}\right)/\text{d}t,并将两侧乘以d t,得到的约束变为线性和凸性:

\begin{align} \dot{u}_{min}\text{d}t < u_{k} - u_{k-1} < \dot{u}_{max}\text{d}t \end{align}

沿着预测或控制时间段,例如设置n=3时:

\begin{align} \dot{u}_{min}\text{d}t < u_{1} - u_{0} < \dot{u}_{max}\text{d}t \\ \dot{u}_{min}\text{d}t < u_{2} - u_{1} < \dot{u}_{max}\text{d}t \end{align}

并对不等式符号进行排列:

\begin{align} u_{1} - u_{0} &< \dot{u}_{max}\text{d}t \\ + u_{1} + u_{0} &< -\dot{u}_{min}\text{d}t \\ u_{2} - u_{1} &< \dot{u}_{max}\text{d}t \\ + u_{2} + u_{1} &< - \dot{u}_{min}\text{d}t \end{align}

我们可以获得形式为

\begin{align} Ax \leq b \end{align}

的约束方程矩阵表达式。

因此,将此不等式调整为上述形式,可以在一阶近似级别包含对\dot{u}的约束。

\begin{align} \begin{bmatrix} -1 & 1 & 0 \\ 1 & -1 & 0 \\ 0 & -1 & 1 \\ 0 & 1 & -1 \end{bmatrix}\begin{bmatrix} u_{0} \\ u_{1} \\ u_{2} \end{bmatrix} \leq \begin{bmatrix} \dot{u}_{max}\text{d}t \\ -\dot{u}_{min}\text{d}t \\ \dot{u}_{max}\text{d}t \\ -\dot{u}_{min}\text{d}t \end{bmatrix} \end{align}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容