1

私は、A、B、Cの3つの値を与える物理的な測定器(ロードセルを備えた力プラットフォーム)を持っています。ただし、これらの値(直交している必要があります)は、力とトルクの適用値と戻り値の間にクロストークを引き起こす測定装置。

次に、次のように、キャリブレーションマトリックスを使用して、測定値を実際の値のより適切な推定値に変換することをお勧めします。

ここに画像の説明を入力してください

問題は、一連の測定を実行する必要があることです。これにより、システム全体に最適なC行列を取得するために、異なる値measured(Fz, Mx, My)と最小二乗法が得られます。actual(Fz, Mx, My)

Ax = B1つの測定で問題を解決することscipy.linalg.lststqも、scipy.linalg.solve(正確な解決策を提供することで)解決することもできますが、それぞれが潜在的に異なる3x3行列を与える独自の方程式を持つ、一連の異なる測定を検討するにはどうすればよいですか?

読んでくれてありがとう、どんな助けでも大歓迎です。

4

1 に答える 1

1

私はmath.stackexchange.comにこれの数学的な部分だけを含む同様の質問を投稿しました、そしてこの答えは問題を解決しました:

math.stackexchange.com/a/232124/27435

将来誰かが同様の問題を抱えている場合に備えて、その答えのほぼ文字通りのScipy実装を次に示します(最初の行は初期化ボイラープレートコードです)。

import numpy
import scipy.linalg

### Origin of the coordinate system: upper left corner!
"""
    1----------2
    |          |
    |          |
    4----------3
"""

platform_width = 600
platform_height = 400

# positions of each load cell (one per corner)
loadcell_positions = numpy.array([[0, 0],
                                  [platform_width, 0],
                                  [platform_width, platform_height],
                                  [0, platform_height]])

platform_origin = numpy.array([platform_width, platform_height]) * 0.5

# applying a known force at known positions and taking the measurements
measurements_per_axis = 5
total_load = 50

results = []
for x in numpy.linspace(0, platform_width, measurements_per_axis):
    for y in numpy.linspace(0, platform_height, measurements_per_axis):
        position = numpy.array([x,y])
        for loadpos in loadcell_positions:
            moments = platform_origin-loadpos * total_load
            load = numpy.array([total_load])
            result = numpy.hstack([load, moments])
            results.append(result)
results = numpy.array(results)
noise = numpy.random.rand(*results.shape) - 0.5
measurements = results + noise

# now expand ("stuff") the 3x3 matrix to get a linearly independent 3x3 matrix
expands = []
for n in xrange(measurements.shape[0]):
    k = results[n,:]
    m = measurements[n,:]

    expand = numpy.zeros((3,9))
    expand[0,0:3] = m
    expand[1,3:6] = m
    expand[2,6:9] = m
    expands.append(expand)
expands = numpy.vstack(expands)

# perform the actual regression
C = scipy.linalg.lstsq(expands, measurements.reshape((-1,1)))
C = numpy.array(C[0]).reshape((3,3))

# the result with pure noise (not actual coupling) should be
# very close to a 3x3 identity matrix (and is!)
print C

これが誰かに役立つことを願っています!

于 2012-11-08T15:46:23.533 に答える