ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

ロボットの確率・統計 - 製作・競技・知能研究で役立つ考え方と計算法 -

ロボットの確率・統計- 製作・競技・知能研究で役立つ考え方と計算法 を読みました。

www.coronasha.co.jp

筆者の紹介動画はこちら。

youtu.be

読んでみてざっくりの感想としては、初めて見るような概念がほぼ無かったので(自分が)良く勉強したなと感じました。本棚の定位置キープで、気になることがあれば戻ってくる本です。

僕は最小二乗法の数学がよく分からなくなったときに、これなら分かる応用数学教室を読み直します。

https://www.amazon.co.jp/dp/4320017382

先生と生徒の語りがあって、簡単だけど丁寧に説明があるところは似ていると思います。一回読んでわからなくてもこんなことが書いてあるなだけ頭に入れて、実際に計算が必要になったときに読み直すと、ああそういうことかと理解が進みます。おそらくこのポジションの本です。

本の内容

内容は、数学の証明は結構すっ飛ばした上で、

  • 確率・統計の基礎
  • 確率分布の基礎
  • ベイズ
  • ベイズフィルター、パーティクルフィルター
  • 機械学習
  • 強化学習
  • クラゲ

と、一冊でカバーできるとは思えない領域を、軽口もいれながら説明しています。概念や数式の紹介で終わらず、もう一歩踏み込んで説明してあるのがうれしい。

大学一年生がこれを読んで一回全部わかるのは難しいです。とりあえずわかるところまで読んで、後は流し読みがお勧めです。気になった事があれば自分でもっと調べたり、もう一回知りたくなったら戻ってくる本です。巻末のポインターは充実してます。参考文献が国内で手に入る本も多く、次の一歩に困ることはないでしょう。大学の先生が書いた本は海外の重要な論文ばかりが並びがちですが、この本は勉強しやすい本を並べているのはすごくうれしいです。

僕はロボットに関しては素人でこの本がどれくらいロボティクスにおける確率統計を俯瞰しているのかは判断できないです。ただ、カルマンフィルタはなんとなく知ってるけど、パーティクルフィルターはわかんないとか、学習の進捗具合はわかる気がします。2年前に読んだら最初の確率統計の基礎以外は何にもわからなかったはずで、今読んでみて結構勉強したなと自信につながりました。

次の一歩

この本を読んで、もっと知りたくなった人向けです。

カルマンフィルターはPythonで学ぶベイズフィルタとカルマンフィルタが一番わかりやすかったです。

booth.pm

強化学習はゼロから作るDeep Learning④が良かったです。

natsutan.hatenablog.com

パーティクルフィルターは挫折したので 詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装をもう一度読み直したい

www.kspub.co.jp

お勧めの人

ロボット勉強している大学生にはとても良いと思います。 社会人で知らない間にロボット案件にアサインされて、右も左もわからずひたすら勉強しているけど手応え無い人にもお勧めです。 とはいえ、こういう数学を使わないロボットの仕事もいっぱいあるので、目次見て興味があれば買いましょう。

ROS 2を使ってロボのLEDをリモートで制御してみた

大事なことを最初に言うと、Windows10、WSL2、ROS 2の組み合わせは時間の無駄だからやめとけ。 素直にUbuntu PC用意するかWindows11のPro用意しよう。

GWを2日使って、DOFBOTのラズパイに入れたROS 2と別のUbuntu PCに入れたROS 2で通信させました。 これでUbuntu側からDOFBOTのLEDが制御できるようになりました。 うまくやればDOFBOT側は最低限のAPI呼び出しをするだけで、Ubuntu側でロボ制御の開発ができそうです。

Windowsさえ使わなければ、特に問題なく動きました。

DOFBOT側の設定

~/.bashrcに設定を書く。 ROS_DOMAIN_IDは設定しなくても大丈夫。 Ubuntu側のIPアドレスをROS_MASTER_URIとして環境変数に登録する。 自分のIPアドレスをROS_IPとして、環境変数に登録する。

# export ROS_DOMAIN_ID=1
export ROS_MASTER_URI=http://192.168.1.20:11311 
export ROS_IP=192.168.1.18

source /home/dofbot/mashiro_ws/install/setup.bash

LEDを点灯させるソースコード

import rclpy
from rclpy.node import Node
from std_msgs.msg import Int8

import time
from Arm_Lib import Arm_Device

class LedSub(Node):
    def __init__(self):
        super().__init__("ledsub")
        self.sub = self.create_subscription(Int8, 't_led', self.callback, 10)
        self.arm =  Arm_Device()
        time.sleep(0.1)

    def callback(self, msg):
        self.get_logger().info(f'sub {msg.data}')

        if msg.data == 0:
            self.arm.Arm_RGB_set(50, 0, 0) #RGB Red light on
        elif msg.data == 1:
            self.arm.Arm_RGB_set(0, 50, 0) #RGB Green light on
        elif msg.data == 2:
            self.arm.Arm_RGB_set(0, 0, 50) #RGB Blue light on
        else:
            self.arm.Arm_RGB_set(0, 0, 0) #RGB Red light on
        # time.sleep(1)



def main():
    rclpy.init()
    node = LedSub()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        print("stop")
    del node.arm
    rclpy.shutdown()
    print("end of main")

if __name__ == '__main__':
    main()

Ubuntu側の設定

こっちは自分自身のIPアドレスを環境変数に入れるだけ。

export ROS_IP=192.168.1.20

Pythonのソースはこう

import rclpy
from rclpy.node import Node
from std_msgs.msg import Int8

class LedPub(Node):
    def __init__(self):
        super().__init__("ledpub")
        self.pub = self.create_publisher(Int8, 't_led', 10)
        self.timer = self.create_timer(1, self.timer_callback)
        self.i = 0

    def timer_callback(self):
        msg = Int8()
        if self.i < 3:
            msg.data = self.i
            self.i += 1
        else:
            msg.data = 0
            self.i = 0
            # self.destroy_timer(self.timer)
        self.pub.publish(msg)
        self.get_logger().info(f'Pub LED {msg.data}')



def main():
    rclpy.init()
    node = LedPub()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        print("stop")
    rclpy.shutdown()
    print("end of main")



if __name__ == '__main__':
    main()

ゼロから作るDeep Learning ❺ ―生成モデル編

ずっと首を長くして待っていたゼロから作るDeep Learning ❺ ―生成モデル編を読みました。

www.oreilly.co.jp

今間までのゼロからシリーズに比べるとコード少なめ、数式多めです。

全体の構成としては、確率統計のおさらいから、正規分布、GMM、ニューラルネットワークと順に説明していきます。ここまで前半。後半はVAEの説明、実装から入り、拡散モデルへと話が進んでいきます。

数式の説明はすごく丁寧なのですが、やはり難しいと感じました。完全に理解するためには、あと何周かしないと駄目そうでした。

コーディング部分は、実装上のテクニックよりは、出てきた数式をどうPythonに実装するかがメインです。

実際に手を動かして、拡散モデルの一部を動かすことができます。 例えばこれが拡散過程の可視化部分です。

まずは普通にループで100回ノイズを入れる所から入り、ループを使わずにノイズを入れる仕組みなどがわかりやすく書いてあって驚きました。 コードを動かす場合、CPUのみだと厳しいです。学習が出てきたらColabのGPUインスタンスを使うのをお勧めします。

最後はいざ絵を作るぞって手前で終わってしまいますが、そこまででもお腹いっぱいになりました。その先があっても多分理解できなかったと思います。

Deep Learningブームの初期で勉強したVAEが生成モデルの中心となっているところ、そこが驚きとともによく分かりました。

https://www.tensorflow.org/static/tutorials/generative/images/cvae_latent_space.jpg?hl=ja

https://www.tensorflow.org/tutorials/generative/cvae?hl=ja から、まさかここから今の生成系AIにつながるとは。

目先のお絵かきではなく、生成モデルについてしっかりと考え方を知りたい人にお勧めです。

fletで四声練習アプリを作ってみた。

PythonでGUIを作るfletというフレームワークがあります。

flet.dev

一回、軽く何か作ってみたいけど良いお題無いかな~と思っていたらXでこんなPOSTを発見。

ちょうど良いと思って早速作ってみました。 画面はこんな感じ。見た目に凝る余裕は無かったです。

youtu.be

やってみた感想としては、ちゃんとドキュメント読まないと作れない。 Qiitaの日本語記事だけでなんとかなるかと思っていたけど、そこまで簡単では無かったです。 多分凝った物を作ろうとすると、結局Webアプリの知識が要りそうです。 Webアプリやっている人には楽かも、Tkinterの代わりには難しいかなという感じを受けました。

うれしいのは、fly.ioでなんとかしたらWebアプリになったこと。これはこれで大変だったけど動くと面白かったです。

ソースは酷いですが、初挑戦で3時間くらいならこんな物だと思う。

github.com

ROS 2使ってDofbotのLED光らせてみた

まずここを見ながら、元から入っているROSをアンインストールする。

qiita.com

humbleはインストールが出来なかったので、ここを見ながらrollingをインストールする。

docs.ros.org

desktopで問題無し。

sudo apt install ros-rolling-desktop

colconをインストールする

sudo apt install python3-colcon-common-extensions

ROS2とPythonで作って学ぶAIロボット入門を見ながらプロジェクトをつくってちょっと動かす。

www.amazon.co.jp

Pythonのソースを書く。 Dofbot用のライブラリ Arm_Libは元のラズパイイメージの状態でパスが通っているようで、どこからでもimportして利用できました。

import rclpy
from rclpy.node import Node

import time
from Arm_Lib import Arm_Device

class LedNode(Node):
    def __init__(self):
        print("generate node")
        super().__init__('led_node')
        self.get_logger().info("happy led")
        self.timer = self.create_timer(1.0, self.timer_callback)
        self.arm =  Arm_Device()
        time.sleep(0.1)
        self.count = 0

    def timer_callback(self):
        self.get_logger().info("led update")
        if self.count == 0:
            self.arm.Arm_RGB_set(50, 0, 0) #RGB Red light on
            self.count = 1
        elif self.count == 1:
            self.arm.Arm_RGB_set(0, 50, 0) #RGB Green light on
            self.count = 2
        elif self.count == 2:
            self.arm.Arm_RGB_set(0, 0, 50) #RGB Blue light on
            self.count = 0
        else:
            self.count = 0



def main():
    rclpy.init()
    node = LedNode()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        print("stop")
    del node.arm
    rclpy.shutdown()
    print("end of main")



if __name__ == '__main__':
    main()

これでLED点滅しました。

中国語検定3級合格した

4回目の挑戦でようやく中国語検定3級合格しました。 もし後の続く人の参考になればと思って学習方法まとめます。

毎日のルーチンワーク

  • NHKラジオ まいにち中国語(朝、夜)
  • duolingo
  • superchinese

この3つは試験関係無く、毎日続けました。

問題集

すでに3回落ちていて今回は絶対に受かりたかったので、問題集を一冊に絞りそれをやりきることにしました。

Amazon.co.jp: MP3音声付き 出るとこだけ! 中国語検定 3級 合格一直線 : 長澤 文子, 盧 尤: 本

いきなりこの一冊だけだと厳しいと思いますが、ずっと勉強していて後一押しの人には良いと思います。 ちょうど三ヶ月かけてやりきり、最後の一週で総復習をしました。

リスニング対策

毎回筆記よりはリスニングの方が点が取れていたのですが、基本的に何を言っているか分からないけど、なんとなくで選んでいました。点は取れているが手応えが無い状態だったので、3ヶ月ずっと試験問題を听写し続けました。

上の本の問題を听写して、最初は全然分からないので、丸覚えでも良いので書けるようにする。その勢いでシャドウーイングをやる。次の日に、同じ問題を听写して100%書けるようになるまで毎日続け、100%正解になったら次の課の問題に行くようにしていました。

効果は絶大で、問題に出る単語(黑板とか)を確実に押さえることができ、結果的にはリスニング95点でした。苦手だった長文のリスニングも、繰り返し無しの一回目で全部内容がわかりました。(これは初めての経験)

リスニングに関しては聞こえたままメモするというのが有効でした。今年の問題だと、食べ物の問題で「四川火锅」が出題され、単語的には聞き取れてもおかしくない単語ですがよく分からなかったのですーちゃーふーぐーでメモして正解できました。Sìchuān huǒguōが、四川火锅と分からなくても正解は選べるようになるとリスニングは楽かも。

听写自体は2年近く毎日続けていて、あるとき結局听写した漢字しか覚えてないよねって事に気がついたので、学習のメインは听写になっています。試験対策も听写が肝でした。

听写はこのアカウントをフォローしておけば、無限に続けられます。

筆記

声調はとにかく覚えようとして、それがまいにち中国語やdoulingoに出てくると、記憶に残るという形で覚えていきました。例によって二声と三声は良くわからないので、よく間違える単語は、二声はマリオジャンプ、三声はスクワットと身体を動かしながら覚えていきました。声調は手で上下をつけながら覚えるという話も聞きましたが、そんなんじゃ覚えられなかったです。

後は問題集を解きながら、間違えた問題はその文章を丸暗記して書けるようにしました。(書いて丸丸覚える)

丸暗記+听写で作文の方も高得点取れました。

まとめ

本によっては1ヶ月前から一気に勉強しようと書いてあるのもありますが、社会人だと三ヶ月みて勉強した方が良いと思います。特にリスニングは3ヶ月後くらいで成長をかんじるので、試験を見据えて三ヶ月前から毎日やるのが良いです。

n月刊ラムダノート Vol.4

だいぶ出遅れましたが、n月刊ラムダノート Vol.4 読みました。

n月刊ラムダノート Vol.4, No.1(2024)www.lambdanote.com

組込みプログラミングに興味がある人、春から組込み始める人にお勧めです。

手を動かして学ぶストリーム処理入門

IoT機器から垂れ流しでくるようなデータをクラウドサービスと合わせて処理する話です。Apache Beamとかその辺の技術ですね。最近は組込みエンジニアもこういうプロジェクトに参加することが多いので、実際に使われるサービス名や、やっていることの雰囲気を掴むのに良いです。

Windowを使った時系列処理の説明も分かりやすかったです。

WebAssemblyの制約を越える

WebAssemblyの技術について歴史的な話から、コンパイラの話までとても面白く読めました。 言語処理系に興味がある人は絶対楽しめます。

ローカル変数への読み書きは自由にできるけど、関数の戻り値は仮想マシーンで保護されているので書き換えができないなど、WebAssemblyで使われている技術が分かりやすく説明されていて良かったです。

セキュリティに関する話は、古典的なコンパイラの本にはあまり載っていないので勉強になりました。こういう本をもっと読みたい。

PicoRubyといっしょに学ぶ、プログラミング言語が電気回路を動かす仕組み

これは自分が新人の時に読みたかった記事です。 LEDの点灯の仕方、抵抗値の選び方を読んでいて、自分の新人の時の事を思い出しました。その頃からほとんど変ってないですね。唯一変ったのは、当時はLEDはLで引っ張るのが常識だったんですが、今はデバイスのH出力が安定して、かつ数mAでも十分明るいのでHでONにする基板多いですね。

UARTを使わずにGPIOだけでシリアル通信する方法は、知っているとどこかで役に立つかも。