Fusion 360で4軸加工

Fusion 360で4軸加工用のデータを作り、加工をしました。
G-codeの作成自体は工具方向オプション内の原点の設定さえ正しくできていれば問題なく終わるのですが
実行していると…

Z 0. !?
危うく刃を折りかけました
何だこりゃ

Mach3用のConfigを使用していましたが、Configを見てみると
こんな記述がありました

こちらをfalseにして、もう一度G-codeを生成して無事解決。
いや~危なかった

追記:G28 か G53 か Clearance Height を選ぶ仕様になったようです。G28 をFalseにしても G53 が発動します(笑)
Clearance Height がベストですが、4軸加工をするときには使えないようで… 結局、今はCode EditorでG28を削除しています。

あとMach3でLoad From Hereを使うときは Rapid Height を Clearance Height にしておきましょう。これまたワークに突撃して死にます。


久しぶりにBifrostを使ってみるなど

久しぶりにBifrostをいじっていました
とはいえ特に変わっていなそう…

システムの単位スケールを現実世界と同じにして、白波を少し増やしたぐらいです。波の形が現実的ではない気がするし、白波も微妙なので再挑戦します。


ブエノスアイレス観光

二月ぐらいにブエノスアイレスとアムステルダムに行っておりました。
まずは、ブエノスアイレスについて書いていきたいと思います。

日本から飛行機で30時間?くらい
なかなか疲れます。(初っ端から

しかも、日本のちょうど裏側で12時間の時差+四季逆転という
なかなかなハードさ

強烈な日差し
建物が完全に木に覆われています(笑)

危険度レベル1とかで
そこそこ脅されてから現地に行き
タクシーの運ちゃんにも「デンジャラスな国だ。油断するんじゃない。」と力説されましたが

初日の感想は、そんなにヤバそうじゃ無くね?
という感じでした。

公園で日向ぼっこしてる人とかいるし

中心部はダラスとそんなに変わらない?

バスなどはなかなかワイルドな運転でしたが…(笑)
急アクセル、急ブレーキ、ドアを開けたまま走り出すのが当たり前なようでした。

ちなみに後から分かったことですが、ブエノスアイレスのバスは番号が同じでも全然違うところに行ったりします。(この話は後ほど

こんな感じのおしゃれなバスと普通のバスと種類は様々

公共交通機関はバスと電車と地下鉄と一通りそろってます。

中国製の車両でした

そしてこれらの交通機関はSUBEというカード(スイカみたいなやつ)で乗れます。地下鉄と電車は一回の乗車で16アルゼンチンペソとかだった気がします。(70円ぐらいだったハズ
値上げが決まっているそうで、次行くときには高くなってるかもしれませんね

地下鉄は路線によってはそこそこスリがあるらしく、地元の人でもリュックは前に背負っていました。

Retiro-Mitre Station  大きい…

ブエノスアイレスは芸術が根付いているとでも言うんでしょうか
あちらこちらに絵が描かれています。

Centro Cultural Recoleta
落描きと言ってしまえばそれまでかもしれませんが、落描きというには勿体ない

日曜市にも行きました。いろいろ置いてあるぞ~

日曜市とは直接関係ありませんが、こんなものが…

そしてデモもやっておりました。
多分これ
https://www.pagina12.com.ar/173865-en-lucha-por-el-derecho-a-trabajar?fbclid=IwAR3JiBo8m_mc1JNqyNGWhzjZ-KR7FJI6BJ_UMyp3lO644rxl1qFm5kDIbq4

夜も中心部はそんなに危険そうではなかったので、ちょっと出歩いてみたり

ごみ収集、専用クレーンでごみ箱ごと吊り上げます(ごみ箱は半地下式)

サンバ?をやっていたり

あとお寿司がそこそこ広まっているようで(日本からの移民があったのも関係してる?)

なんだこれ、かわいい…

兵器博物館にも行っていました。

近くのティグレという街にも行きました。
別荘地らしい

子供が川に飛び込んでいたり
にゃ~ん

と楽しんでいたわけであります。

ところが

10日目ぐらいにして
ついつい適当にGoogle先生に頼ってしまったのです。
これが運の尽き
Google先生に言われた通りの番号のバスに乗り…

あれ?あれれ
この橋越えるんだっけ???

なんか随分と雰囲気の違うところへ…

お! でもこんな辺境の地っぽいところでもWiFi飛んでるんか
やるな
アルゼンチンとのんきなことを言っていたら

はい

やられました。

一緒に行った友人がカバンをひったくられました…
幸い、財布もパスポートも無事でしたが

油断するなとあれほどタクシーの運ちゃんに言われたのに

いいですか!!皆さん!!

この赤い橋(ニコラス・アベジャネダ橋)は渡ってはいけません!!
向こう側は警察がほとんどいません。マジで

中心部に恐ろしいほど警察官が配備されているのはこういうことねって感じです

とはいえ、面白い街です。ブエノスアイレスは
パリとダラスとブリスベンと東京と…まぁとりあえず、いろいろな街がごちゃごちゃに混ざり合っているような街並みです。
日本っぽい実用一辺倒な味気のない建物もありますし

このアンバランスさ
有名な本屋さんらしい
臨海部は綺麗ですし
夜もイイ

楽しかったです!!!


SteamVR ベースステーション 2.0 分解記

まずはじめに…

今回は、かなり荒っぽい分解をしています。(する羽目になったといった方が正しいですが)

iFixit流に言うなら、修理しやすさスコアは10点中0点、事実上「使い捨て」
といったところです。

「1万円ちょっとのものなんか修理するより新品渡した方が安いわ」というやつですね

大まかに分解したものはこんな感じ

各々の電子パーツは接点により電気的に接続するようになっており、組み立て工数の削減に貢献しているようです。

2.4GHz帯用のアンテナ

旧ベースステーションは日本電産製のモーターが二つありましたが、今回のものは垂直方向のもの一つに削減されています。

同様に、レーザー発振器も一台に削減されています。

心臓部のレーザーを部屋中に振り撒く機構

①は回転数検知用の赤外線センサーに赤外線を反射させるための施策だと思われますが、

モーターは四極のブラシレスモーターのはずで、外部のセンサーで回転数を検知して制御しなくてもそれなりの精度で回転数を一定にできるはずです。

それほどまでに回転数を正確に制御しなくてはならないということなんでしょうか?(わからん)

②③はレーザーの射出部です。上下二段分割にすることにより、旧ベースステーションのように縦横別の回転体を必要としなくなったようです。


Sourcetreeを捨ててForkに乗り換えてみた

Sourcetreeを捨ててFork使っていこうと思います。
Sourcetreeを使っていると、なにかと細かいことをしようとしたときにターミナルを使う羽目になり、あまりGUIである意味なくね?となったのが主な理由です。 (Forkも変わらないかもしれないけど…)
とはいえ、まだ使い始めたばかりなので、書くべきようなことはあまりありません… Fork最高です

とりあえず乗り換えてみて今一番感動してるのが
.Unityの差分を直接見れるじゃん
ということ

以下追記

Commitしていない差分があってもボタン一つで別ブランチに移れます。
オプションは、Stashを作って適用するか、変更しないか、差分を破棄するか、です。

最高ですね。

特定コミットの特定ファイルの差分をそのコミットの状態にしたり、そのコミットの前の状態に変更したりもサッとできます。わかりやすくてありがたい限り
GUIはこうあるべきですね。

その他にもRemoteのブランチをサッと削除できたりとか

RemoteのブランチをサッとRenameできたりとか
控えめに言って最高な機能がてんこ盛りなので皆さんもForkを使いましょう(笑)


Audio-driven facial animation workflow

MotionBuilderのAudio-driven facial animation workflowについてです。

基本的にヘルプ通りにすれば使えるんですがキーのベイクなどで詰まったので、備忘録として書いておきます。

モデルに直接音声ファイルをD&DでVoice デバイスが追加されます。
そして、このVoice デバイスからサウンド パラメータを追加すれば、Character Faceの方にも専用のエクスプレッションが追加されます。
が、
このエクスプレッションとサウンド パラメータは手動でRelationsから紐付けてやらなければいけません。(自動でつないでおいてくれてもよさそうなものですが)

当然つなぎ忘れると動きません

でshapeにエクスプレッションを関連付ければとりあえず動きはするはずです。

で次の壁がこちら
「Shapeの情報をPlotできない‼」
色々調べたのですが理由は以下のような簡単なもの

ヘルプに書いてよAutodeskさん…

参考になる動画など

https://www.youtube.com/watch?v=unW9o0jK8xc
https://www.youtube.com/watch?v=Jpi1evKFJNs

【CryENGINE】5.5でWindows Mixed Realityを試す

CRYENGINE 5.5でWindows Mixed Realityが無事動作するようになったみたいです。
が、相変わらずまだ不安定
ちょくちょく落ちます

で今回の本題はこれ
Entityまわりが更新されたわけですが

なんか怪しいですね
ちゃんと描画されていないような…

Shadowの設定ありましたっけ??

情報求む‼

<モデルはつみ式ミクさんをお借りしました>


Samsung の HMD Odysseyの分解・修理

頭部を固定するベルト部分のロック機構がバカになってしまったので修理しました。

クッション部を外し

ここはツメだけで留まっておりました。

さらに分解
タッピングビス6+1本です

どうやらこいつがダレて舐めていたよう

ポリウレタンチューブを突っ込んで様子見
構造上、外れてどこかいっちゃうことはないはず


【Python】scikit-learnを使ってみた

データは昭和電業社の「モータ制御開発 支援システム Simtrol-m」から
まぁこんなデータなわけです

普通のPID制御なんですが、これを学習させて実測値に近いシミュレートをしようという魂胆です
具体的には、
比例定数と積分定数、微分定数を突っ込めば、電流、電圧、回転数が出るよというものを目指します。

と書きましたが諸事情によりとりあえず積分定数のみ

import csv
import os
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
import numpy as np

train_X = []
train_Y = []
test_X = [[] for i in range(6)]
test_Y = [[] for i in range(6)]
filepathS = ["*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv"]

for a,filepath in enumerate(filepathS):
    basename = os.path.basename(filepath)
    basename = basename[:-4]
    basename = basename.split("d")

    ConstInteg = float(basename[1])
  
  #csv読み込み
    csv_file = open(filepath, "r", encoding="ms932", errors="", newline="" )
    f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

    i = 0
    for row in f:
        if i > 5 :
            print(row)

            train_X.append([ConstInteg,float(row[0])])
            train_Y.append([float(row[2]),float(row[3]),float(row[4])])

            test_X[a].append([ConstInteg,float(row[0])])
            test_Y[a].append([float(row[2]),float(row[3]),float(row[4])])

        i += 1

clf = DecisionTreeRegressor()
# 学習させる
clf.fit(train_X, train_Y)

print(clf.score(train_X, train_Y))

# -----------------------------------------------------
# 以下、結果

ConstantOfIntegration = 3.8

test_X1 = []
for b in test_X[1]:
    test_X1.append([ConstantOfIntegration,b[1]])

result = clf.predict(test_X1)

# 以下グラフ用
result = np.array(result)
test_X = np.array(test_X)

x = test_X[0][:,[1]]
y1 = result[:,[0]]
y2 = result[:,[1]]
y3 = result[:,[2]]

fig, (axL, axR) = plt.subplots(ncols=2, figsize=(22,12))

axL.plot(x, y1, label='(rpm)')
axL.set_title("Constant of Integration = "+str(ConstantOfIntegration))
axL.set_xlabel('time[s]')
axL.set_ylabel('Rotational speed')
axL.grid(True)

y_2000 = []
for c,yy1 in enumerate(y1):
    if yy1 >= 2000:
        y_2000.append(x[c])

axL.legend(title='2000rpm>= '+str(y_2000[0]), loc='upper left')

axR.plot(x, y2, label='(V)', color='r')
axR.plot(x, y3, label='(A)', color='m')
axR.set_title("Constant of Integration = "+str(ConstantOfIntegration))
axR.set_xlabel('time[s]')
axR.set_ylabel('Voltage / Intecity of Current')
axR.grid(True)
axR.legend(title='Vmax = '+str(max(y2))+'\nAmax = '+str(max(y3)))

plt.show()

シリアライズはしてません。

実行結果がこちら

学習データの範囲内ならそこそこの精度?
scikit-learn万歳!!
もっと学習用のデータが欲しい!!


【MAXScript】WPFをMAXScriptで使ってみる

Windows Presentation Foundation (WPF)のGUIをMAXScriptで使ってみよう企画?です。

ライブラリ(DLL)にしてMAXScriptでアクセスするという感じ

Visual Studioで普通にWPFアプリケーションを作成すると普通に.exeになってしまうので、ちょっと回り道をします。

「WPF ユーザーコントロール ライブラリ」として作成し
ウインドウを追加

あとはゴリゴリ書きたいことを書くだけ

今回はこんな感じ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace WpfControlLibrary1
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>

    public partial class Window1 : Window
    {
        private ObservableCollection<string> messages = new ObservableCollection<string>();
        private ObservableCollection<LvList> ListView_List = new ObservableCollection<LvList>();

        public Window1()
        {
            InitializeComponent();

            ListBox1.ItemsSource = messages;
            ListView1.ItemsSource = ListView_List;
        }

        public void AddItemToList(string mess) // MAX君から来たやつ
        {
            messages.Add(mess); // 突っ込む 
        }

        public void Fill_ListView(bool MAXcheck, string MAXName, string MAXState) // MAX君から来たやつ
        {
            LvList item = new LvList { Check = MAXcheck, Name = MAXName, State = MAXState }; // 追加する項目を作成
            ListView_List.Add(item); // Listに項目を追加

        }

        public class LvList
        {
            public bool Check { get; set; }
            public string Name { get; set; }
            public string State { get; set; }
        }

    }




}
<Window x:Class="WpfControlLibrary1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfControlLibrary1"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA9FFBD" Offset="0"/>
                <GradientStop Color="Black" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Grid Margin="10,10,10,9.6">
            <Grid.RowDefinitions>
                <RowDefinition Height="12*"/>
                <RowDefinition Height="10*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10*"/>
                <ColumnDefinition Width="5*"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="Button" Content="Button" x:FieldModifier="public" Margin="30.2,0,30,10.4" Grid.Column="1" Height="39" VerticalAlignment="Bottom" Background="#FF64BF68" Grid.Row="1"/>
            <ListBox x:Name="ListBox1" x:FieldModifier="public" Margin="10,10,10,10.4"/>
            <ListView x:Name="ListView1" x:FieldModifier="public" Margin="10,10,9.8,10.4" Grid.Row="1">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="28">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding Check}" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="300" />
                        <GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" Width="170"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    </Grid>
</Window>
fn main =(
	dotnet.loadAssembly (getFilenamePath (getSourceFileName()) +@"WpfControlLibrary1.dll")
	global Form1 = dotnetObject "WpfControlLibrary1.Window1"
		
	Form1.topmost = true	
	Form1.Show()
		
	Form1.AddItemToList "test"
	Form1.Fill_ListView true "こんにちは" "OK!!"
		
	fn test =(
		Form1.AddItemToList "Test!!"
	)
		
	dotNet.addEventHandler Form1.button "Click" test
)

main()

動きました

MAXでアクセスしたいUI要素には x:FieldModifier="public" を付けないとアクセスできません。
dotNet.addEventHandler WpfControlLibrary1.Window1 "Click" Fn で普通にイベントハンドラを追加できます。

dotNet.setLifetimeControl ******** #dotnetを実行するとMAX側にイベントハンドラを渡せるようです。これしないとgc()でメモリからハンドラが消える。

:おまけ
IL DASM便利です。