2023年11月7日火曜日

Blenderのマウスカーソルがジャンプする問題

 起動オプションで --debug

blender --debug

とすれば中ボタンドラッグごのカーソルがジャンプする問題が解決した

https://projects.blender.org/blender/blender/issues/85014

より

2023年9月20日水曜日

ダイクストラ法

 chat-gptにコーディングしてもらったダイクストラ

「クラスカルでパスファインダーを」ってリクエストしたら

ダイクストラを勧められた

クラスカルが作るのは経路でなくツリーなのだ


    参考動画






<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script>
<div id="p5canvas"></div>

<script>

class Graph {
  constructor() {
    this.vertices = [];
  }

  addVertex(x, y) {
    this.vertices.push({ x, y, edges: [] });
  }

  addEdge(source, destination, weight) {
    if (this.vertices[source] && this.vertices[destination]) {
      this.vertices[source].edges.push({ target: destination, weight });
      this.vertices[destination].edges.push({ target: source, weight });
    } else {
      throw new Error("Invalid vertex");
    }
  }

  calculateDistance(vertex1, vertex2) {
    const { x: x1, y: y1 } = this.vertices[vertex1];
    const { x: x2, y: y2 } = this.vertices[vertex2];
    return Math.hypot(x2 - x1, y2 - y1);
  }

  dijkstra(startVertex, endVertex) {
    const distances = Array(this.vertices.length).fill(Infinity);
    const visited = Array(this.vertices.length).fill(false);
    const previous = Array(this.vertices.length).fill(null);
    distances[startVertex] = 0;

    const queue = [{ vertex: startVertex, distance: 0 }];
    while (queue.length) {
      queue.sort((a, b) => a.distance - b.distance);
      const { vertex } = queue.shift();

      if (visited[vertex]) continue;
      visited[vertex] = true;

      if (vertex === endVertex) break;

      const neighbors = this.vertices[vertex].edges;
      neighbors.forEach(neighbor => {
        const newDistance = distances[vertex] + neighbor.weight;
        if (newDistance < distances[neighbor.target]) {
          distances[neighbor.target] = newDistance;
          previous[neighbor.target] = vertex;
          queue.push({ vertex: neighbor.target, distance: newDistance });
        }
      });
    }

    const path = [];
    let currentVertex = endVertex;
    while (currentVertex !== null) {
      path.unshift(currentVertex);
      currentVertex = previous[currentVertex];
    }
    return { distances, path };
  }

  printGraph() {
    for (let i = 0; i < this.vertices.length; i++) {
      const { x, y, edges } = this.vertices[i];
      console.log(`Vertex ${i} (${x}, ${y}) with edges:`);
      edges.forEach(edge => {
        console.log(`  -> Target: ${edge.target}, Weight: ${edge.weight}`);
      });
    }
  }
}

function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}


// 使用例

let graph = new Graph();

const startVertex = 0;
const endVertex = 3;

let dijkRet;

const vtx=[50,200,350,500,125,275,425,125,275,425];
const vty=[150,150,150,150,75,75,75,225,225,225];


const edges=[
 [0,1,5],[1,2,5],[2,3,5],
 [4,5,5],[5,6,5],[7,8,5],[8,9,5],
 [0,4,5],[0,7,5],[1,4,5],[1,7,5],
 [1,5,5],[1,8,5],[2,5,5],[2,8,5],
 [2,6,5],[2,9,5],[3,6,5],[3,9,5],
 ];
 

function setup() {
  createCanvas(550, 500).parent("p5canvas");
  textSize(17);
  
  runDijkstra();
 }

 function runDijkstra(){ 
  graph=new Graph();
  for(let i=0;i<vtx.length;i++){
   graph.addVertex(vtx[i], vty[i]); 
  }

  for(let i=0;i<edges.length;i++){
   graph.addEdge(edges[i][0],edges[i][1],getRandomInt(10)+1); 
  }
   
  graph.printGraph();    
  dijkRet= graph.dijkstra(startVertex, endVertex);

  console.log(`Shortest Path from ${startVertex} to ${endVertex}: [${dijkRet.path.join(" -> ")}], Distance: ${dijkRet.distances[endVertex]}`);  
 }
  
 function mousePressed() {
  runDijkstra();
 }
 
 

 function draw() {
  background(100);
  
  stroke(255, 255, 155);
  strokeWeight(1);
  for(let i=0;i<graph.vertices.length;i++){
   fill(255);
   circle(graph.vertices[i].x,graph.vertices[i].y,15);
   for(let j=0;j<graph.vertices[i].edges.length;j++){
    let neiNum=graph.vertices[i].edges[j].target;
    
    if(neiNum>i){
     let x1=graph.vertices[i].x;
     let y1=graph.vertices[i].y;
     let x2=graph.vertices[neiNum].x;
     let y2=graph.vertices[neiNum].y;
     line(x1,y1,x2,y2);
    }
   }
  }
 
  for(let j=0;j<dijkRet.path.length-1;j++){
    let x1=graph.vertices[dijkRet.path[j]].x;
    let y1=graph.vertices[dijkRet.path[j]].y;
    let x2=graph.vertices[dijkRet.path[j+1]].x;
    let y2=graph.vertices[dijkRet.path[j+1]].y;
    fill(200,255,200);
    stroke(200,255,200);
    strokeWeight(5);
    line(x1,y1,x2,y2); 
  }
  
  
  for(let i=0;i<graph.vertices.length;i++){
   stroke(100);
   fill(100,255,100);
   text(i,graph.vertices[i].x,graph.vertices[i].y-10);
   for(let j=0;j<graph.vertices[i].edges.length;j++){
    let neiNum=graph.vertices[i].edges[j].target;    
    if(neiNum>i){
     let weit=graph.vertices[i].edges[j].weight;
     let x1=graph.vertices[i].x;
     let y1=graph.vertices[i].y;
     let x2=graph.vertices[neiNum].x;
     let y2=graph.vertices[neiNum].y;
     fill(240);
     text(weit,(x1+x2)/2,(y1+y2)/2);
    }
   }
  }
    
  noStroke(0);
  text("Shortest Path from  "+ startVertex+ "  to  " +endVertex+"  :",50,350);
  text("Distance:  "+dijkRet.distances[endVertex],50,370);
  text("[ "+dijkRet.path.join(" -> ")+" ]",50,400);
  text("When you click the mouse, it will recalculate.",50,480);

 }
</script>

2023年7月13日木曜日

p5.serialserverと p5.serial control と p5js用のローカルサーバーの メモ(arduinoと通信用)

rampsのarduinoとp5jsで通信したくなったので試行錯誤

p5.serialserverとp5.serial control が必要なようだ

(ローカルだけだとp5.serialcontrolはいらなかった、かつ

p5.serialcontrolはボーレート9600固定みたい。

macならなんとかなるみたいらしいが)

以下のサイトを参照

https://fabacademy.org/2022/labs/cpcc/students/garrett-nelson/assignments/week15/

https://itp.nyu.edu/physcomp/labs/labs-serial-communication/two-way-duplex-serial-communication-using-p5js/



p5.serialserverは

gitでクローンして(多分カレントディレクトリにクローンされた?)

git clone https://github.com/vanevery/p5.serialserver.git

インストール
npm install 
でできたようだ?
node startserver.js
で起動




p5.serialcontrolは
 p5.serialcontrol-linux-x64.zipをダウンロードしてunzip
中に有るp5.serialcontrolに実行権限を与え実行
すると
The display compositor is frequently crashing. Goodbye.
のエラーが出た
ので
コンソールから起動する あと末尾に以下のオプションを追加
--no-sandbox
これで起動した

ソースコードには以下を追加

<script language="javascript" type="text/javascript" src="https://cdn.jsdelivr.net/npm/p5.serialserver@0.0.28/lib/p5.serialport.js"></script>

でクロームでhtmlファイルを開けば見れる
ファイルの場所はどこでも良さそう




今回は必要なかったが忘れてたので

ローカルサーバーから起動しないとリソースとか読み込まないときなど

index.htmlを用意して

ターミナルでカレントディレクトリをファイルのフォルダにして

 npx --yes @js-primer/local-server

でサーバーを立ち上げて
ブラウザで
http://localhost:3000
に移動すると見える

node.jsらしい
node.jsはインストール済みだったので詳しくは
npxなんたらで検索したらいい



2023年6月20日火曜日

Arduino nano に12vを流すと挙動がおかしくなった

 Arduino nanoに12v定電圧電源をつないで使っていると挙動がおかしくなった
USB経由だと普通に動くのでオンボードのレギュレータが怪しい
調べるとレギュレータの放熱ができず壊れたようす


”電圧降下分は熱となり

L7805 では接合部 (ジャンクション) と周囲 (アンビエント) との熱抵抗 θja は TO-220 で 60°C/W 

Tj = (損失電力) * (熱抵抗) + (周囲温度)

ここで出力電流で 300mA 、周囲温度 30°C としたら、 (損失電力) = (入力電力) - (出力電力) はおよそ (12V * 0.3A) - (5V * 0.3A) = 2.7W - 1.5W = 2.1W ですから、 上の式とから次のようになります。

Tj = 1.2W * 60°C/W + 30°C = 126°C + 30°C = 156°C

絶対最大定格で動作時のジャンクションの最高温度は 125°C”


となるとヒートシンク必要なので外部にレギュレータをつけた

いまは普通に動いている



2023年6月8日木曜日

Ender3の”Heating failed”エラー原因と対処

Ender3がピピピピ鳴りながら停止する

RAMPSにボードを変えてMarlinを入れてからホットエンドのPIDの調節をしていなかったので

出たエラーのよう


設定時間内に設定温度に達しないとエラーになる

MarlinのThermal Runaway Protection機能らしい

今回は

MarlinのPIDの自動調節Marlin Autotuneで解決

GコードのM303がそのコマンドらしく、230℃で設定する場合

M303 S230 C8 U1

となる


試してみるとエラーはでなくなった。


他には

Thermal Runaway Protectionの

エラー判断の基準の時間と温度の設定が

Configuration_adv.hできるらしい


または

ヒーターカートリッジを50wにして早く温度を上げると

よさそう


今のヒーターは16.4Ω35wほど

(24v×24v)/16.4Ω=35

35w?40w無い?

なんで35w なんで



2023年5月27日土曜日

Gameconquerorのjsonのアドレスを計算し直して書き出し

 Gameconquerorのjsonのアレ


Gameconquerorでターゲットプログラムをリロードすると書き出したjsonファイルのパラメータのアドレスのオフセットが変わるので、
”同じパラメータのオフセットされたアドレス”一つを入力して
”jsonファイルを読み込む”とオフセットを計算して他の全アドレスに適用して'adlist.json’のファイル名で出力するプログラム

Gameconquerorで
1.ソフトのパラメータのリストを作成
2.json拡張子をつけて保存(これ大事)して終了
3.再起動して先のファイルを読み込むとアドレスがずれているので
リストの中のパラメータのどれか一つのアドレスをもう一度探す(末尾3桁は前と同じアドレス)

このページで
4.上部の入力フォームにさっき探したアドレスを入れる
5.入力フォーム下の”ファイルを選択”を押してGameconquerorで保存したjsonファイルを読みこむ
6.上手くいけば再計算されたアドレスのリストの入った”adlist.json”のファイル名で保存されるのでそれをGameconquerorに読み込んで終了、正確なアドレスリストが表示されるはず

2023年3月20日月曜日

バラしていたender3 を組み立てたので各種スライサーのインストールを試す

 分解していたEndaer3を組み立てた

curaはUSB 認識せず

pronterfaceはTypeError:Pen():argumentsナンタラのエラー解決できず見送り

    !usr/bin/python3.9 に書き換え、その他諸々もダメだった

sli3erでusbシリアル通信はできることを確認

usbの権限を書き換えてなかったことがわかる

”ubuntuでUSBシリアルデバイス等を扱う際、挿入時に書き込み・実行権限が付与されないため、挿入のたびに毎回権限をつけてやる必要がある。”らしいので

    sudo usermod -a -G dialout username

    sudo chmod a+rw /dev/ttyUSB0

        *usernameはユーザーネーム

毎回は面倒なので

書き込み、実行権限の自動付与

まずは、以下コマンドで設定ファイルを開く。

sudo gedit /lib/udev/rules.d/50-udev-default.rules

(old)

KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"

(new)

KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout", MODE="0777"

MatterControlに行き着く

       MONOをインストール

     sudo apt install gnupg ca-certificates

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys                                     3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF

    echo "deb https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo         tee /etc/apt/sources.list.d/mono-official-stable.list

     sudo apt update

        MatterControlのdebをインストールしようとするとmono-completeじゃないとダメ

        らしいので

        sudo apt-get install mono-complete

        ゲットした

        でMatterのインストールができた

    MatterControlを起動しようとするとエラー

        X11 Error: BadMatchなんたら

            以下の対応で解決

Find MatterContorl's appsettings.json file, typically /usr/lib/mattercontrol/appsettings.json

Open in appsettings.json in your favorite text editor.

Change Color and Depth parameters to "24"

Should look like this:

  "Color": 24,

  "Depth": 24,

これで起動できたが画面がおかしいウィンドウの中がバグってるように見える

フルスクリーンにしないと処理が進まないようだ

ウィドウを拡大縮小したり最大化すると再描画され最初の画面がでてきた

画面右上の縦に点3つのボタンを押すとShowControlsのタブを開くチェックボックスがある

チェックを入れてタブを開くとxyzその他のコントロールが開きUSB経由でコントロールできるようにはなった


ender3のミドルウェアはMarlinのヘッダーを書き換えたことは覚えていた

のでその時のファイル一式を探し出した

arduinoIDEのimageを実行するとhomeにarduinoフォルダができるので

そこにMarlinをフォルダごとマルっと置く

hardwareフォルダを作りその中にsanguinoのボード設定をフォルダごと入れる

home    

        |-    arduino    

                        |   -    Marlin

                        |    -    hardware    -    sanguino       

sanguinoは古いからかIDEでは扱ってないみたい         

                        





2023年2月8日水曜日

OpenAi Gymを録画




せっかくなので動画をとろうと

ググってもコレといった解決策がないなか

参考になる部分はしつつ

video_recorder.pyの中身とか見ながら

たどり着いた回答が以下のコード

pythonはインデントにうるさかった

Atomエディタ終了してた

あと追加で色々いれた

sudo がないと not writeable とか言われた

sudo pip install --upgrade gym

sudo pip install gym[atari]

pip install ffmpeg

sudo pip install ffmpeg

sudo pip install imageio-ffmpeg

sudo pip install moviepy

    moviepyはvideo_recorder.pyの注意書きにあった


以下pythonのコード

内容はともかく

録画できたので良しとする


import gym

from gym.wrappers.monitoring.video_recorder import VideoRecorder

env=gym.make("LunarLander-v2",render_mode="rgb_array")

vid = VideoRecorder(env, "./video.mp4")

env.action_space.seed(42)

observation, info = env.reset(seed=42)

for _ in range(1000):

observation, reward, terminated, truncated, info = env.step(env.action_space.sample())

vid.capture_frame()

if terminated or truncated:

observation, info = env.reset()

env.close()

vid.close()

openai gym をインストールしてルナランダーを動かすまで





chatgptに
ローカルで使えないか聞いてみた
chatgptはgpt3が必要で
gpt3のモデルのサイズは173GBだけど
ダウンロードさせないしマシンパワーも必要だから
一般向けではないよといわれたので
openai gymを試すことにした

pip install openai
    コマンド 'pip' が見つかりません。次の方法でインストールできます:
    sudo apt install python3-pip
pipが入ったので
    sudo pip install openai
          Getting requirements to build wheel ... error
          error: subprocess-exited-with-error
エラー
pipのアップグレード?
     python3 -m pip install --upgrade pip
wheelはpandasの機能っぽい
    pip install pandas
    pip3.10 install openai
        Successfully built openai
openaiは入ったみたい
    sudo pip3.10 install requests numpy tqdm
tqdmはなぜ入れたのかわからないが一応

でgymのライブラリを追加
    !pip3 install gym[box2d]
              error: command 'swig' failed: No such file or directory
コマンドswigでfailed 入ってなかったのでインストールする
    sudo apt-get install swig

よくわからないので全部入れる
pip3.10 install requests numpy tqdm install gym[all]

これでgymは動いた

ルナランダーのコードは
Basic Usageにあったのを使う

import gym
from gym.utils.play import play
env = gym.make("LunarLander-v2", render_mode="human")
env.action_space.seed(42)

observation, info = env.reset(seed=42)

for _ in range(10000):
    observation, reward, terminated, truncated, info = env.step(env.action_space.sample())

    if terminated or truncated:
        observation, info = env.reset()

env.close()


これを 'runar.py'とかのファイル名で保存して
    cd 
でカレントディレクトリをファイルのあるディレクトリにして
    python3 runar.py

でデモが見れた














 

raspiでseleniumの自動化用のファイル作り直し

2024/2/17に不注意でraspiのsdカードを壊し jupyterファイルのバックアップを取らずにos再インストールを試みるという 愚行を重ねたためまたjupyterで作業ファイルを作ることになったので念の為 残しておく 途中なので要らない行も有るかも これだけ再現できれば...