平衡两轮机器人而不使其向前/向后漂移

2024-05-13

我正在尝试设计一个控制器来平衡 2 轮机器人(约 13 公斤),并使其能够抵抗外力(例如,如果有人踢它,它不应该掉落,也不应该无限期地向前/向后漂移)。我对大多数控制技术(LQR、滑模控制、PID 等)都很有经验,但我在网上看到大多数人使用 LQR 来平衡 2 轮机器人,因此我选择 LQR。

我的问题是,尽管我能够使机器人不摔倒,但它会快速开始无限期地向前/向后移动,而且我不知道如何使其在地面上保持一定的位置。我想要实现的是,当机器人被外力踢到时,它必须能够停止向前/向后移动,同时保持平衡(不需要在地面上保持一个位置,我只是想让机器人停止移动)。 我可以从传感器访问的测量结果包括:两个轮子的位置 (x)、两个轮子的速度 (x_dot)、机器人的角位置 (theta)、机器人的角速度 (theta_dot)。 从现在起我尝试了两种方法:

  1. 将所有参考信号设置为 0 并尝试调整 LQR 增益。通过这种(简单)方法,我不确定相对于 x 和 theta 的增益 K 系数是否应该具有相同或相反的符号,因为,例如,如果机器人被踢离其 x 参考,则轮子应该移动使机器人返回到 0 点的方向,但这会使 θ 朝相反的方向移动。当机器人被踢时,我希望首先调整 theta 以制动外力给出的运动,然后 x_dot 应该与 theta 方向相同以停止机器人。
  2. 使用我可以凭经验/通过 MATLAB 找到的最佳 LQR 增益,并使用一些“启发式”,以便在给定机器人的当前状态(x、x_dot、theta、theta_dot)的情况下,选择状态变量的参考信号。我尝试了启发式“如果 x_dot 向前/向后移动,则使 theta 向后/向前倾斜”,这使得机器人在没有干扰的情况下避免向前/向后漂移,但是如果我踢机器人,它就会开始快速振荡,直到它掉落了(我试图调整LQR的K增益来解决这个问题,但我找不到任何解决它的方法)。

您建议我使用哪种方法?我应该实施一些更复杂的启发式方法(有什么建议吗?),还是应该调整 LQR 增益,直到找到完美的增益?我是否应该考虑将积分器(用于控制哪些状态?)与 LQR 一起使用?


快速总结:

自平衡时如何避免漂移:

直接跳到下面的“总结”部分。为了方便起见,引用了该部分:

为了保持您的两轮机器人平衡out让它向前/向后漂移,你应该有一个线速度控制器的命令为 0 m/s,而不仅仅是一个角度控制器角度命令为 0 度。你的线速度控制器计算所需的加速度这会融入你的线性加速度控制器,它计算出所需的倾斜角或俯仰角,它会输入到你的俯仰角控制器,它调整电机油门以实现该螺距(例如,使用 PID 或 LQR 控制器,或者您也可以为这个内部自平衡环路提供基于物理的控制器)。

为了实现你所说的不再随波逐流或向前滚动的目标,你会停在那里。

但是,我想更进一步:如果您的车辆有怎么办already漂移或滚动了一点,您不想将其移回到开始“消除”漂移的位置吗?

方法如下:...[添加一个位置控制器也,这也融入了速度控制器]...

Details:

基于物理“级联控制” https://en.wikipedia.org/wiki/PID_controller#Cascade_control和控制系统:多层控制

又名:对强大的车辆控制器的所有必要控制回路的完整描述,包括自平衡系统,如两轮自平衡赛格威机器人或四轴飞行器/无人机。

在任何复杂的控制系统中,都必须有多层控制器。

从最里面的控制器到最外面的控制器,以下是您所需要的:

  1. 俯仰角控制器:就你而言,你的最里面的控制器听起来像是俯仰角:我认为你正在使用 LQR 控制器来调整轮毂电机油门控制俯仰角。您也可以为此使用 PID 控制器,or相反,提出基于物理的前馈解决方案,并与 PID 反馈解决方案相加以消除误差。

    如果将俯仰角设定点设置为 0 度,那么只要没有外力作用在机器人上,并且机器人也开始静止,它就会保持直立状态。如果您推动机器人,它将开始以您施加的恒定速度线性平移(例如:向前或向后移动),同时保持固定的直立角度。从本质上讲,将俯仰角设定点保持在 0 度,这与推一个无动力的球或推车一样——它会根据牛顿第一运动定律(与惯性有关)沿着您推它的方向继续滚动:运动中的物体保持运动状态。

  2. 线性加速控制器:您需要添加一个外部控制器你在哪里调整俯仰角控制线性加速度(向前或向后)。

    可以这样想:这是一个物理问题:两轮赛格威机器人向前倾斜得越多,重力导致其“向前摔倒”的速度就越快。它“向前下落”的速度越快,您就必须越快地驱动这些轮子,以使这些轮子回到它的下方,使其保持固定的倾斜角度,而不是继续进一步倾斜,直到它撞到地面。移动其下方的轮子以防止其翻倒,会使其朝该方向加速。

    对于固定高度(对于空中车辆;或在水平表面上,对于地面车辆)和固定倾斜角度的倾斜车辆,线性加速度,a, is: a = g*tan(theta), where g = acceleration due to gravity = 9.81 m/s^2, and theta = tilt angle。这是我刚刚画的“力量平衡”图(侧视图:向下是朝向地面,向上是朝向天空):

    求解theta(倾斜角度),你会得到:theta = atan(a/g).

    So, a平移(向前或向后)方向的单位为m/s^2。随着时间的推移 (s),该平移加速度导致一定的平移速度(m/s^2 * s = m/s)。因此,如果您将其倾斜一会儿,让它加速,然后再次将其直立起来,那么您现在将以固定速度继续前进,假设地面平坦且没有摩擦。这就是当有人推或踢它时发生在你身上的事情!为了对抗这种翻译velocity,你需要一个速度控制器其中适用必要的加速度向相反方向转动,以停止车辆的运动。

  3. 线速度控制器:下一个控制器是速度控制器。您需要设置所需的速度(例如:0 m/s来停止车辆)。在此控制器中,您调整线性加速度控制线速度.

    然后您可以设置调整参数,tau [sec], 哪一个是时间常数您希望在哪个时间段内达到所需的速度。对于快速响应和低惯性系统,将其调整为非常小;对于缓慢响应和高惯性系统,将其调整为非常大。如果你把它调得太低,系统就会出现严重的抖动并对噪声做出响应——有点像在 PID 控制器中将控制循环设置得太快或将微分增益设置得太高。如果你调tau太高,系统会非常缓慢且反应迟缓。本质上,tau就像一个“增益”调整参数,其中response_gain = 1/tau。因此,较大的时间常数,tau,导致响应缓慢或“低增益”,并且小tau导致快速响应或“高增益”。

    你可以看到我的tau我的四轴飞行器飞行控制器中的值用黄色圈出:

    (此时此刻的视频链接 https://youtu.be/H5kXzpPFdII?t=20)。如图所示,当前设置为0.75 sec。我对上图中该参数的注释如下:

    time_const,tau(秒)(增益与 1/tau 成正比):0.75

    因此,这个“线速度控制器”是具有基于物理的控制器的另一层。为此,您需要物理运动方程:dv [m/s] = a [m/s^2] * dt [sec]。求解a你得到a = dv/dt。时间段,tau,你想通过它来完成这是你的dt(时间变化,以秒为单位),导致a = dv/tau.

    完整的计算示例到这一点:

    所以,如果你的实际速度是2.5 m/s你想要的速度是0 m/s,然后是所需的速度变化,dv,你需要的是dv = 2.5 m/s - 0 m/s = 2.5 m/s。你最终需要调整tau作为调整参数,通过实验或模拟和建模,或两者兼而有之。假设您选择了初始值tau的价值tau = 2 sec。然后,在该时间段内实现此速度变化所需的必要加速度tau is a = dv/dt = dv/tau = 2.5m/s / 2 sec = 1.25 m/s^2.

    您所需的线性加速度线速度控制器这是您的输入线性加速度控制器多于。求解俯仰角,theta, 来自线性加速度控制器 above: theta = atan(a/g) = atan(1.25 m/s^2 / 9.81 m/s^2) = atan(0.12742) = 0.1267 rad x 180 deg/pi rad = 7.26 deg。所以,输入7.25 deg(根据您的情况使用正确的符号)作为您的设定点俯仰角控制器为了在 2 秒的时间段 tau 内开始从 2.5 m/s 减速到 0 m/s。

    以合理的速度运行内部控制回路,也许是 50 到 500 Hz。

    以合理的速度运行外部控制回路,也许是 25 到 50 Hz。

    请注意,控制循环离“外部”越远,控制循环运行的速度就越慢。例如,自动驾驶汽车最外层的控制回路以 10 Hz 左右的频率运行,部分原因是这已经足够好了,部分原因是计算复杂性非常高,这是计算机所能做的全部。

    总之

    为了保持您的两轮机器人平衡out让它向前/向后漂移,你应该有一个线速度控制器的命令为 0 m/s,而不仅仅是一个角度控制器角度命令为 0 度。你的线速度控制器计算所需的加速度这会融入你的线性加速度控制器,它计算出所需的倾斜角或俯仰角,它会输入到你的俯仰角控制器,它调整电机油门以实现该螺距(例如,使用 PID 或 LQR 控制器,或者您也可以为这个内部自平衡环路提供基于物理的控制器)。

    为了实现你所说的不再随波逐流或向前滚动的目标,你会停在那里。

    但是,我想更进一步:如果您的车辆有怎么办already漂移或滚动了一点,您不想将其移回到开始“消除”漂移的位置吗?

    方法如下:添加另一层控制作为线性位置控制器在你之外速度控制器!

  4. 线性位置控制器:你会调整线速度随着时间的推移来控制线性位置。使用车轮编码器,您可以计算出您已经走了多远,并控制position让机器人回到开始的地方。或者,您可以简单地命令任意位置,使其行驶一定距离并在房间内导航。这是另一个基于简单物理/数学的前馈控制器,其中运动方程很简单v*t = d, where v [m/s]是速度,t [sec]是时间,并且d [m]是距离。

    有多种方法可以做到这一点。

    如果您的目标是到达某个位置并停止:

    一种方法是在给定时间内命令一定的速度,以达到所需的距离。例如:命令 0.5 m/s 持续 3 秒0.5 m/s * 3 sec = 1.5 m。然后,命令 0 m/s 在该点停止。您可能需要使用一些经验数据和启发法,提前一点命令 0 m/s 速度,以便让车辆有时间响应并停在您想要的位置,而不是超调。

    这可能被称为“滴答控制器”(我现在正在发明这个术语),您可以在其中编写一个函数以 X 速度驱动 N 秒,以实现 Y 编码器在该方向上的距离移动的“滴答”,并根据经验进行调整:必要的。您可以调整该控制器,甚至能够在短时间内使用快速速度脉冲处理小至 1 个编码器刻度的刻度,从而达到exact当您接近命令位置时您想要的位置。每次控制循环迭代,您都会根据您现在所在的位置以及您想要到达的位置,传递所需距离编码器“刻度”数量的新值以进行移动。因此,这种基于物理的“前馈”控制器的有趣之处在于,它隐含地也是一种“反馈”控制器,这很奇怪。一些迂腐的学者可能想出了一些特殊的方式来谈论这个问题,甚至可能有一些特殊的术语,但我不知道它们是什么。

    另一种方法是命令固定速度,例如:0.5 m/s,直到处于某个最小距离误差范围内,例如:0.5 m,然后切换到 PID 反馈控制器,该控制器命令velocity基于位置误差。这样,作为你的位置误差趋近于零,你的指令速度也将接近于零,这是有道理的。如果您的 PID 增益足够强,或者相反,如果您的位置误差足够大,则这与仅在位置上使用 PID 反馈控制器是一样的,您可以通过将速度命令限制为固定的最大值来使速度命令饱和。当然,即使对于微弱的增益,在一些足够大的距离误差下,命令的速度仍然会达到最大允许(饱和)值并被限幅。

    如果您的目标是保持固定速度,同时以此速度遵循 2D 路径:

    然后,您可以将速度控制器设置为固定值,同时更改命令航向以始终指向路径下方。我使用“引导点”技术或“纯粹追踪”算法来做到这一点,如我的这里有 3 个视频 https://github.com/ElectricRCAircraftGuy#heres-one-of-my-favorite-projects-ive-ever-done-autonomous-quadcopter-flight-controller-i-wrote-myself: 1 https://www.youtube.com/watch?v=LjuPA43HceQ, 2 https://www.youtube.com/watch?v=wY3oh2GIfCI, 。然而,由于我的车辆是悬停的四轴飞行器无人机,我可以奢侈地改变我的命令推力矢量而不是我的heading,因此我可以根据需要命令固定航向(即:保持无人机始终指向北方),同时更改命令的推力矢量以在不同的 2D (x-y) 方向上移动。

    使用车轮编码器与数值积分获得精确测量:

    虽然随着时间的推移对速度进行积分将获得距离,但在这种情况下最好使用数值积分或估计来计算前馈部分的命令速度输出。控制器这将输出所需的速度command在一定时间内time为了达到想要的效果位置改变.

    使用车轮编码器,您可以测量actual行驶的距离而不是估计它使用随时间变化的速度。

    如果您确实需要estimate通过积分移动的位置velocity over time,但是,您应该使用梯形数值积分,正如我在这里解释的:物理、测绘、机器人、游戏、航位推算和控制代码中的数值推导和集成 https://stackoverflow.com/a/72162992/4561887,因为它比矩形积分更准确并且实现起来很简单。同样,对于数值积分,简单的想法是velocity [m/s] * time [s] = distance [m].

    再次请记住,您不一定要集成到estimate the actual行驶的距离。相当,measure通过对编码器刻度进行计数来计算实际行驶的距离,因为这是一种更精确的测量。

如何测量编码器“刻度”或移动距离:

请记住,对于所有这些控制器:

  1. 您阅读了车轮编码器以确定车轮运动。
  2. 如果您没有车轮编码器,请读取电机霍尔效应传感器反而。它们的分辨率较差,但可以用来代替编码器。
  3. If you don't have hall effect sensors, but you are using 3-wire (3 phase) brushless motors, then you can read the back-EMF commutation waveforms or cycles instead, to read the commutation frequency and thereby estimate motor RPM (Rotations Per Minute). You can count commutation cycles to get an estimate of position, like from an encoder or hall effect sensors, but with less resolution still.
    1. 这很复杂,但可以通过 Arduino 等微控制器在软件中完成(我已经做到了)。您需要做的是将 Arduino Nano 上的地连接到车辆的电池地。然后,将另一根电线连接到 3 个无刷电机的任何相线,通过二极管限幅电路将换向电压从 V_bat 峰值降低到 ~4.5V 峰值,然后连接到 Arduino 引脚 D8,这是输入捕捉ATMega328 微控制器的引脚。通过中断使用软件中的输入捕捉来读取该相上的所有脉冲。
    2. Here is what those pulses look like (image source https://www.rcgroups.com/forums/showthread.php?952523-too-long-battery-wires-will-kill-ESC-over-time-precautions-solutions-workarounds): enter image description here.
    3. 小脉冲是 8 KHz~16 KHz 电机 PWM 油门脉冲。您需要在软件中以数字方式过滤掉这些内容。大梯形换相频率波为换相波形,它们的频率与您的电机转速成正比。因此,您可以测量换向频率来计算电机旋转频率或 RPM。该关系由无刷电机中永磁极的数量决定。我必须翻出我的笔记,但我相信等式是这样的:RPM = freq_commutation/(num_magnetic_poles*120)。关键是,换向频率可以通过微控制器的输入捕获引脚在软件中读取,然后通过基于电机中永磁极数量的简单方程转换为电机转速。请注意,高端电机驱动器(ESC - 电子速度控制器)使用正弦换向波形,而不是梯形,效率更高,扭矩更好,但换向频率原理是相同的。

所使用的级联基于物理的控制器摘要

The 您将使用的控制器类型在您的情况下,同样是从最里面到最外面的控制器:

  1. 俯仰角控制器:LQR(根据你所说)。您也可以使用PID。
  2. Linear acceleration controller: A physics-based feed-forward (the bulk of the control input).
    1. 或者,添加一个关于实际线性加速度与命令线性加速度误差的 PID 反馈来调整它,使实际线性加速度接近命令线性加速度。
    2. 将基于物理的前馈控制器和 PID 反馈控制器的输出相加。
  3. Linear velocity controller: A physics-based feed-forward (the bulk of the control input for low speeds).
    1. (可选)添加另一层物理控制来补偿空气阻力随着速度的增加. Drag [N] = C_D*q*A, where C_D [unitless]是您的特定车辆形状属性的实验阻力系数以及该形状如何与感兴趣的流体(在我们的例子中为空气)相互作用,q [N/m^2] = dynamic pressure = 1/2 * rho * v^2, where rho [kg/m^3]是空气密度,并且v [m/s]是速度,并且A [m^2] is 额区(这是基于几何形状的,因为机器人倾斜得越多,它就会减少)。

      让我们通过快速单位检查来验证阻力方程:Drag [N = kg*m/s^2] = C_D [no units] * q [kg/m^3 * m^2/s^2 = kg*m*m/(m^3*s^2) = kg*m/s^2 * m/m^3 = N/m^2] * A [m^2] = [N/m^2 * m^2 = N]是的!结果正确:阻力方程的右侧(C_D*q*A)确实有牛顿单位([N])。我正确地表述了方程。

      然后,在机器人加速时考虑空气阻力的额外物理层之上:

    2. 或者,添加一个关于实际线速度与命令线速度误差的 PID 反馈来调整它,以便actual线速度接近命令的线速度。

    3. 将所有控制器的输出相加。

  4. Linear position controller: A simple "physics-based" (integration of velocity with respect to time) feed-forward controller to achieve a desired position change in a given amount of time.
    1. To go to a desired position and stop:
      1. (可选)根据实际与期望添加 PID 反馈控制器(根据位置误差命令速度)position。保持总+/-轮编码器位移计数,并设法将其归零——位置或距离“误差”越大,朝向目标点的命令线速度应该越强。
      2. 当位置误差在一定范围内时,您可以运行基于物理的前馈控制器,然后运行 ​​PID 反馈控制器,或者仅使用如上所述的经过良好调整的“刻度控制器”,或者,only如果您愿意,可以使用 PID 反馈控制器,当然可以将最大命令速度输出饱和到某个合理的水平。
    2. To keep a fixed velocity while following a 2D path:
      1. You should command a fixed velocity while continually moving an aim-point down a target path, continually adjusting your commanded heading to get you to go in the right direction. Consider adjusting velocity dynamically based on things such as commanded turn radius to 1) keep from tipping over, and 2) allow you to follow difficult parts of the path easier. Tuning the lead point forward-projected distance down the desired path is a type of low-pass filter on the sharpness of the commanded path. This may sound a bit abstract, but see my 3 quadcopter videos above and I think you'll see what I mean.
        1. Ex: in this image from this video at this point in time https://youtu.be/LjuPA43HceQ?t=111, the blue path is an overhead view of the desired path for my quadcopter, and the red path is the commanded path, which is essentially low-pass-filtered by the lead-point-distance as a tuning parameter. The shorter the lead point distance, the more closely the red commanded path will overlay the blue desired path, and the longer the lead point distance, the more "smoothed" and circular the red commanded path will be. For really large lead point distances, the red commanded path is nearly circular.
          enter image description here
    3. 以上线性位置控制器都是基于“航位推算”,使用轮编码器刻度通过查看来测量距离相对距离变化从已知的起始位置。添加任何绝对位置测量需要绝对位置“真相源”,例如基于机外摄像头的定位系统,例如Vicon动作捕捉系统 https://www.vicon.com/hardware/cameras/ or 光轨 https://optitrack.com/系统(由@这里制作的东西 https://www.youtube.com/watch?v=xHWXZyfhQas)、基于声学的定位系统、GPS等,获取绝对位置的“真实数据”。这些“真实数据”可用于随着时间的推移慢慢调整机器人的内部航位推算位置估计。

最终(和哲学)想法

无论如何,在我看来,这就是想法。这就是我在四轴飞行器控制器上采取的方法:,并且该控制器也可以完美地适用于两轮赛格威式自平衡机器人,因为四轴飞行器与自平衡机器人遵循相同的原理。控件有很多选项和层。物理学即使不是大多数,也应该是许多学科的一部分。

我还要提到的是,我相信上面的整个事情几乎可以在any计算平台,从单个 Arduino Nano(ATmega328 微控制器)到功能强大的台式 Linux 笔记本电脑。我认为,它只需要适当的软件技能。工程很难。编程很复杂。但是,如果您对两者足够了解,您可以在 ATmega328(Arduino Uno、Nano 等)等非常弱的处理器上做非常复杂的事情。我已经在这些处理器上做了一些非常复杂的事情,而且我还有很多想做和学习的事情。

参考:

  1. 我的答案:物理、测绘、机器人、游戏、航位推算和控制代码中的数值推导和集成 https://stackoverflow.com/a/72162992/4561887
  2. 我大学物理笔记:eRCaGuy_Engineering/Equation_Sheets/Physics 110(普通物理 I)- 常数和方程 - Staples#2.pdf https://github.com/ElectricRCAircraftGuy/eRCaGuy_Engineering/blob/main/Equation_Sheets/Physics%20110%20(General%20Physics%20I)%20-%20Constants%20and%20Equations%20-%20Staples%232.pdf
  3. My quadcopter simulation: 1/3 - Autonomous quadcopter guidance and control (physics-based pure pursuit simulation) https://www.youtube.com/watch?v=LjuPA43HceQ
    1. 请参阅该视频下的注释。我在那里记下了a = F/m = g*tan(tilt_angle)。这就是我如何记住如何绘制上面的“力量平衡”图的方式。
  4. 我上面描述的基于物理的控制器的四轴飞行器现场演示:
  5. 我的所有 3 个飞行控制器视频:https://github.com/ElectricRCAaircraftGuy#flight-controller-videos https://github.com/ElectricRCAircraftGuy#flight-controller-videos
  6. https://en.wikipedia.org/wiki/Equations_of_motion https://en.wikipedia.org/wiki/Equations_of_motion

也可以看看:

  1. 我的答案:四轴飞行器距离 PID 控制器 https://stackoverflow.com/a/73031923/4561887
  2. 我可以购买潜在的车辆来试验我所描述的完整算法:ELEGOO Tumller 自平衡机器人汽车套件 兼容 Arduino、STEM 套件 儿童 STEM 玩具 https://amzn.to/3zdF00E。这将是一个非常有趣的项目。
  3. 谷歌搜索(LQR = 线性二次调节器)
  4. Google search for . This refers to the idea of "nested control loops", which is what my controller described above is/does.
    1. https://en.wikipedia.org/wiki/PID_controller#Cascade_control https://en.wikipedia.org/wiki/PID_controller#Cascade_control
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平衡两轮机器人而不使其向前/向后漂移 的相关文章

随机推荐

  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • 为什么这个 Ruby 方法返回“空值表达式”错误?

    我有这个简单的方法 def is palindrome sentence raise ArgumentError new expected string unless sentence is a String safe sentence s
  • Array.indexOf 如何比 Array.some 更高效

    这个问题的灵感来自于这个问题的竞争答案 具有多个参数的indexOf https stackoverflow com questions 39000151 indexof with multiple arguments 用户想知道一种有效的
  • 仅匹配空格或字符串开头/结尾之间的整数的正则表达式

    我目前正在使用该模式 b d b 用这些条目测试它 numb3r 2 3454 3 214 test 我只希望它捕获 2 和 3454 它非常适合捕获数字单词 除了边界标志 b 包括 作为一个单独的词考虑 我尝试排除句点 但在编写模式时遇到
  • Android onclicklistener 在第一次点击时不起作用

    我有一个带有默认文本的 EditText 现在 当用户单击该 EditText 时 默认文本应该更改为某些内容 我所拥有的是 我单击 EditText 光标出现在默认文本之后 没有任何反应 当我再次单击时 onClickListener 就
  • 无法获取 android.permission.CLEAR_APP_USER_DATA

    我正在开发需要特殊权限的系统应用程序 由于某种原因 我无法获得 CLEAR APP USER DATA 权限 但我可以使用 INSTALL PACKAGES DELETE PACKAGES 等 什么可能导致这种情况 显现 uses perm
  • 如何防止两个卷声明在 Kubernetes 上声明同一个卷?

    在 GKE 上的 Kubernetes 集群上 我有以下持久卷声明 PVC kind PersistentVolumeClaim apiVersion v1 metadata name registry spec accessModes R
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • Unix 纪元时间转 Java Date 对象

    我有一个包含以下内容的字符串UNIX 纪元时间 https en wikipedia org wiki Unix time 我需要将其转换为 Java Date 对象 String date 1081157732 DateFormat df
  • 使用 jquery 时出现控制台错误 - Uncaught TypeError: Object # has no method

    我尝试使用以下 js 添加类或 css 样式 但出现控制台错误 var i 0 question i addClass show 收到以下控制台日志错误 Uncaught TypeError Object has no method add
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 获取传单地图放大时的标记列表

    我是传单新手 我已按照以下步骤设置了地图https github com Asymmetrik ngx leaflet https github com Asymmetrik ngx leaflet 我正在尝试获取地图放大区域中的标记列表
  • 自定义 OpenVPN iOS 客户端 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个自定义 iOS OpenVPN 客户端 我找到了这个原生 OpenVPN 客户端核心源码https staging op
  • 通过ajax POST提交两次表单

    插入到mysql using php通过文件调用AJAX 前insert语句php代码执行select查询到查找重复记录并继续insert statement Issue 从ajax调用php文件时 它执行了两次并得到作为重复记录的响应 好
  • 在 Chrome 扩展中创建隐藏的 iframe

    是否可以在 google chrome 扩展中的 background html 页面上创建一个 iframe 并让它向网站发出请求 我不确定该扩展程序到底是如何工作的 chrome 会自动忽略所有显示标签还是会以不可见的方式运行它 它会正
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • jQuery UI 选项卡 - 将选项卡绑定到同一页面上的链接

    我正在尝试将选项卡绑定到同一页面上的链接 但我是 jQuery 的新手 需要一些帮助 我的选项卡使用 jQuery UI 站点的代码 但是 如何绑定同一页面侧边栏中的链接呢
  • 在 git 子模块中签出分支

    如何从子模块内更改分支 当我跑步时git branch从子模块内 我看到以下输出 gt git branch HEAD detached from 229a7b2 master 我如何将自己置于一个新的分支上 喜欢development 只
  • 将命令行参数传递给 emscripten 生成的应用程序

    当使用 Emscripten 编译 C 程序时 会生成一个 HTML 页面来显示程序的结果 我想知道如何将命令行参数传递给应用程序 例如 对于原始的 C 程序 它是 bfs 32 1 我能够通过向生成的 html 文件添加一行来传递命令行参
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L