20200613

Intel Realsenseのはじめた

タグ:pyrealsense

Windows10でintel realsense D435iをはじめた。

  • Intel RealSense Viewerを使用

  • pyrealsenseのインストール

の二つをやって手間取った。
2個目はいろいろやって、結局うまくいった。
原因はPythonのバージョン?

実行した順に書いていった。

Intel RealSense Viewerが起動しない。

そもそもIntel RealSense Viewerが起動しない。
下記エラーメッセージが出て(しかも全文表示されない)、はじまらない。

Backend in rs2_create_device(info_list:0000026F257C1900, index:0):
MFCreateDeviceSource(_device_attrs, &_source) returned: HResult 0x80070005: “アクセスが拒否されました。”

→win10のカメラのプライバシー設定が必要。
windows updateか何かのはずみで、Win10のカメラのプライバシー設定が入るらしい。
設定>プライバシー>カメラあたりで設定を変更してみる。

「Intel RealSense Viewer起動しない問題」はこれで解決した。

pip install pyrealsenseが通らない。

pip install pyrealsense

が通らない。結局通らなかったので諦めた。原因は、python3.8だったせい?

これを読んで下記条件を満たしたのに通らなかった。

  • Cythonのインストール
  • numpyのインストール
  • pycparser のインストール
  • wheelのインストール
  • 環境変数PYRS_INCLUDES を追加。rs.hのあるフォルダに通す。
  • 環境変数 PYRS_LIBS を設定。

結論

pip install pyrealsense

は通らない。

pythonのバージョンが悪いのかも…

上記設定はそのままで、
pipで自動でお任せしないで、.whlを自分でダウンロードしてpipした。
ついでにpythonのバージョンを3.7にした。

https://pypi.org/project/pyrealsense2/#files から、whlをダウンロード。現段階で、このサイトのリストにPython3.7までのファイルしかなかった。
自分はPython3.8を使っていた。
だからPython3.7にインストールしなおした

pip install (先ほどダウンロードした.whlのパス)

Windowsなら、ファイルブラウザ上でShift+右クリックして「パスをコピー(A)」を押せば、クリップボードに絶対参照でパスがコピーされる。

結論

pyrealsenseがインストールできて解決。

まとめ

Python のバージョン(3.8)が悪かったのか、
pip install pyrealsenseじゃダメだったのか。
不明。

もしかすると、python3.7にするだけでpip install pyrealsenseは通ったのかも。

実験上手な奴は、条件を一つだけ変える。
実験下手な奴は、条件をたくさん変える。

僕は断然後者です。

タグ:pyrealsense
posted by yuchan at 07:00 | Comment(0) | realsense

20200509

YouTubeのBlender公式チュートリアル(英語)で出てきた機能について、ひたすらメモする

このページの目的

Blenderを勉強する

3DCGを作りたくなった。

PS4のDetroit become humanをプレイして、リアルできれいなCGが作りたくなった。だからBlenderを勉強することにした。

ちょっと前はレンダリング方程式を勉強したくなったが、今は休止中。

欲求・目的・目標

欲求:全部できるようになりたい

これがあいまいだと、投げ出しそう。

  • モデリング、レンダリング、ライティング、UVいろいろ分野があるが、全部勉強していきたい。

だから、

  • 公式チュートリアル的なのをこなしたい。


目的:公式チュートリアルのトレース

YouTubeのBlenderの公式チュートリアルが英語なので、トレースし、日本語ブログ形式で解説する。

目標:記事10個

  • ノック形式で10個こなす。

posted by yuchan at 07:00 | Comment(0) | Blender

20200419

中速フーリエ変換 ~離散フーリエ変換よりは速い~

正直遅い

高速フーリエ変換より遅い。
でも、離散フーリエ変換より早い。
だから、「中速フーリエ変換」と名付けとく。

かかる時間
高速フーリエ変換<<<中速フーリエ変換<離散フーリエ変換
こんな感じ。

原理

離散フーリエ変換では、各周波数の三角関数と、入力信号の積の総和計算している。

三角関数の周期性を考慮して、入力信号f(x)を加法定理でまとめてから計算する。
→かけ算の数が減り早くなる。はず。

最後のほうに、exp(-ikn/N)をNを何個か振った状態で載せておくので、にらめっこして原理を察してほしい。
考え方は、途中まで高速フーリエ変換と一緒なはず。

低速フーリエ変換(普通の離散フーリエ変換)

import time
import numpy as np
arr = np.random.rand(1024)

start = time.time()

import math

N = len(arr)
W = [[math.e**(-1j*2*math.pi*k*i/float(N)) for i in range(N) ] for k in range(N) ]
out = [sum([arr[i]*W[k][i] for i in range(N)]) for k in range(N)]

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

中速フーリエ変換

import time
import numpy as np
arr = np.random.rand(1024)

start = time.time()

import math

def
order(Ns):
if len(Ns) == 1:
return Ns
N1=Ns[1::2]
N2=Ns[0::2]
N2 = order(N2)
return N1+N2

N = len(arr)
out = [0]*len(arr)#np.zeros(10)

N0 = range(N)
order1 = order(N0)

N1 = arr[:len(arr)/2]
N2 = arr[len(arr)/2:]
N3 = [N1[i]-N2[i] for i in range(len(N1))]
N4 = [N1[i]+N2[i] for i in range(len(N1))]
N5=[]
i1 = 0
i2 = 1

while i1 < len(arr):
W = [math.e**(-1j*2*math.pi*order1[i1]*i/float(len(arr))) for i in range(len(arr)/2*i2)]
N5.append(sum([N3[i]*W[i] for i in range(len(N3))]))
if i1==len(arr)-2:
N5.append(sum(N4))
break
if order1[i1] > order1[i1+1]:
N1 = N4[:len(N4)/2]
N2 = N4[len(N4)/2:]
N3 = [N1[i]-N2[i] for i in range(len(N1))]
N4 = [N1[i]+N2[i] for i in range(len(N1))]
i2+=1

i1+=1

for i in order1:
out[order1[i]] = N5[i]

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

高速フーリエ変換

import time
import numpy as np
arr = np.random.rand(1024)
start = time.time()

import math
def FFT(f):
N = len(f)
if N == 1:
return f[0]
f_even = f[0:N:2]
f_odd = f[1:N:2]
F_even = FFT(f_even)
F_odd = FFT(f_odd)
W_N = [math.e**(-1j * (2 * math.pi * i) / float(N)) for i in range(0, N // 2)]
F = [0]*N
try:
F[0:N//2] = [F_even[j] + [W_N[i] * F_odd[i] for i in range(len(W_N))][j] for j in range(len(W_N))]
except IndexError:
F = [F_even + W_N[0] * F_odd]
try:
F[N//2:N] = [F_even[j] - [W_N[i] * F_odd[i] for i in range(len(W_N))][j] for j in range(len(W_N))]
except IndexError:
F.append(F_even - W_N[0] * F_odd)
return F

a1 = FFT(arr)

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

N=2の場合のexp(-ikn/N)

左が実数で右が虚数。
青丸がサンプル点。

002.png

N=4の場合のexp(-ikn/N)

004.png

N=8の場合のexp(-ikn/N)

008.png

N=16の場合のexp(-ikn/N)

016.png

おれはいったい、何をやっているのだ。

posted by yuchan at 19:00 | Comment(0) | python

20200314

Calculix 20本ノック:11本目: exampleの実行 Contact/Hertz2D

10本完了したので、目標を20本に変えてみた。
その11本目。

Calculixとは

フリーの解析ソフト。

  • ccx ソルバー
  • cgx プリポスト

環境

  • WSL

  • Xming

  • Calculix 2.11

  • gmsh

    gmshの機能を使ってメッシングすることがある。

  • imagimagick

    hcpyで画像作成するとき、convertするので使う。

  • pip2

  • matplotlib

  • gnuplot

ノック11本目: exampleの実行 Contact/Hertz2D

データの入手

公式サイトからのリンクで行けるGithubのexample

下記サイトのリンクから、自分のCalculixのバージョンにあったファイルを探す。

https://github.com/mkraska/CalculiX-Examples/releases

Contact

Hertz2D

平面ひずみ要素で、四角と1/4円をぶつけて接触させる。その時の応力分布をみる。
強制変位と荷重の2パターンで1/4円を移動させている。

ccx2.11では正しい結果がでない?

ccx2.11では収束しなかった。(頑張って条件をいじって結果をだしても、READMEのコンターの分布と同じにならなかった。)
ccx2.16のwindows版を使ったら、一発で通った。結果はREADMEの結果と同等のものが作れた。

READMEにあるmonitor.pyの結果と同じように収束しなかった。
このEXAMPLE全体に言えるが、初期設定では収束しないやつとかがある。
これもccxのバージョンのせいだと思っている。

内容

Hertzの接触を、FEMで求める。
球体とか円柱が、他の面等に接触した時の応力分布等を表したHertzの式というのがあるらしい。
周波数のHertz(Hz)と同じ人が考えたらしい。

まずはディレクトリの移動。

cd ~/CalculiX-Examples-2.11/CalculiX-Examples-2.11/Contact/

「~」は、サンプルを回答した場所のアドレス。

サンプルの実行

cgx -b pre.fbd

をすると、メッシュ、境界条件などのファイルが出力される。
これらのファイルは、.inpで読み込まれて使用する。

ccx Hertz

とすれば、同じ結果が出てくる…はずだった。

収束しない

STEP1は強制変位で動かしている。
STEP2は荷重変位で動かしている。
強制変位で動かしたほうが、収束はしやすいそうな。

STEP1は収束した。
ただ、STEP1はREADMEに書いてあるようなイテレーション回数で、収束しない。
STEP2の荷重で動かしているほうは収束しないで終わる。

なんで?

ccx2.11では結果が違う。

終息したSTEP1の結果だけを見てみる。

READMEにあるような、対称な応力分布になってくれない。片側の応力が出てこない。
接触面で応力が出ているけれども、サンプル画像では、内側で応力が発生していた。

SE_dc-zoom.png

ccx2.16(windows版)を使ってみる。

READMEと同じ結果が出てくる。
きっとこれが正しい結果なのだろう。同じ結果なので載せない。

ccxのバージョンは新しいのに限る。
以下の「余計なこと」は、すべてccx2.16でやった。

いろいろやってみる。

master slaveを入れ替えてみた

下記のようにマスタースレーブをひっくり返した。

*CONTACT PAIR, INTERACTION=contact, TYPE=SURFACE TO SURFACE
Ssblk,Sscyl

結果は変わらなかった。

SE_dc-zoom.png

平面応力要素でやった(デフォルトは平面ひずみ要素)

平面ひずみだから意味のある解析なのですが、あえて平面応力でやってみました。

ファイルall.mshの

*ELEMENT, TYPE=CPE8, ELSET=Eall

*ELEMENT, TYPE=CPS8, ELSET=Eall

に書き換えた。

SE_dc-zoom.png

cgx Windows版をメインで使わない理由

windowsで最新版(2.16)が使えるのに、わざわざlinux上の2.11を使う理由は、

  • cgxのGUIのメニューが一部使用できない箇所があった
    (常にではなく、frdのロード時(?)など限られたタイミングで起こる。)。
    下記画像、(左)WSL(Xming)のcgx2.11の右クリックメニュー(右)windows版のcgx2.16の右クリックメニュー
    windows版ではdatasetsが出ない。載せていないが、矢印を展開した先でも似たような現象が散見された。

windows版との違い.pngwindows版との違い2.png

だけど、

  • ccxは、windows版でも可。
    ccxはむしろ新しい方がいい。
posted by yuchan at 19:00 | Comment(0) | Calculix

20200302

Calculix 10本ノック: 10本目: exampleの実行 Kasten

Calculixとは

フリーの解析ソフト。

  • ccx ソルバー

  • cgx プリポスト


自分の環境
  • WSL

  • Xming

  • Calculix 2.11

  • imagimagick


データの入手

公式サイトのリンクから行けるGithubのページCalculixのexample

下記サイトのリンクから、使用しているCalculixのバージョンに合ったファイルを探す。

https://github.com/mkraska/CalculiX-Examples/releases



ノック10本目: exampleの実行 Kasten

Kasten

Kastenは、ドイツ語で"箱"。

大変形、塑性、不整のある座屈(小さい内圧)、シェル要素とreadmeの書き出しにあった。Buckling with imperfectionは不整のある座屈と翻訳するらしい。

箱が座屈するモデル。 S8 (8-節点 四角形シェル要素)


 cd ~/CalculiX-Examples-2.11/CalculiX-Examples-2.11/Kasten

「~」は、サンプルを解凍したアドレス。


exampleには存在しないけれど

1/4モデルを作成して、

  1. 材料非線形解析なしの場合

  1. 非線形解析なしの場合。

を用意した。


1/4モデルの作成

1/4モデル作成のため、pre.fbdを下のように書き直した。

 pnt p1 0 0 0
 pnt p2 50 0 0
 pnt p3 0 50 0
 line l1 p1 p2 12
 line l2 p1 p3 12
 
 seta lower all
 swep all upper tra 0 0 150 20
 flip A002
 
 seta miryz l L004
 seta mirxz l L005
 
 plot la all
 plus pa all
 plus sa all
 rot y
 rot d 10
 rot r 10
 frame
 hcpy png
 #sys mv hcpy_1.png geo.png
 
 div all auto 3
 elty all qu8
 mesh all
 send all abq
 
 send all abq pres -0.01
 send lower abq nam
 send upper abq nam
 send mirxz abq spc 246
 send miryz abq spc 156

4bunno1.png

1/4モデルの為に、Kasten.inp*boundary部分を下記のように書き直した。

 *boundary
 Nlower,1,6
 Nupper,1,6
 *include,input=mirxz_246.bou
 *include,input=miryz_156.bou

1/4モデルの為に、post.fbdをミラーコピーするように下記のように書き直した。

 copy all base1 mir x
 move base1 tra 100 0 0
 copy all base2 mir y
 move base2 tra 0 100 0

1/4モデルの解析結果

1.png


非線形解析なしの場合

非線形がない場合を見るために、Kasten.inpStepのnlgeomを削った。

2.png


材料非線形がない場合

材料非線形がない場合を見るために、Kasten.inp*plasticと、その下3行を削った。

あと、上記だけだと収束しなくなったので、*controlを追加して、収束条件を甘くしてしまった。

 *CONTROLS,PARAMETERS=FIELD
 5.0e-1,1e-1,1e-2,,2e-8,1.e-5,1.e-3,1.e-8

3.png


10本完成してしまった。次は25本くらいを目標に挙げておく。
やはり、example頼りになりそう。
posted by yuchan at 07:00 | Comment(0) | Calculix