ぱたへね

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

ROS 2でdofbotのurdfを表示する。

Dofbotは、yahboomが開発している教育用ロボットです。 開発用のリポジトリも公開されているのですがROS1の環境しかありません。

ROS 2でとりあえずurdfの表示までできたのでまとめました。 環境はwindows10で動いているwslです。

ファイルのコピー

公開されているファイルをを自分の環境にコピーします。今回はdofbot_urdfという名前にしました。

dofbot_ws\src\dofbot_moveitから、urdf, rviz, meshes, launchファイルがあればOK。

自分のpackageに対してcolcon buildをします。 meshesがinstall\dofbot_urdf\share\dofbot_urdf にコピーされないので手でコピーしました。 まあファイル変更することないのでよいでしょう。正しいやり方はあるはず。

urdfの修正

urdf内でSTLファイルを読み込むパスを指定しているので、filename="package:の所を自分のパッケージ名に修正します。

<?xml version="1.0" encoding="utf-8"?>
<robot name="dofbot">
    <link name="base_link">
        <visual>
            <origin
                    xyz="0 0 0"
                    rpy="0 0 0"/>
            <geometry>
                <mesh
                        filename="package://dofbot_urdf/meshes/base_link.STL"/>
            </geometry>
            <material
                    name="">
                <color
                        rgba="0.7 0.7 0.7 1"/>
            </material>
        </visual>
        <collision>
            <origin
                    xyz="0 0 0"
                    rpy="0 0 0"/>
            <geometry>
                <mesh
                        filename="package://dofbot_urdf/meshes/base_link.STL"/>
            </geometry>
        </collision>
    </link>
   省略

</robot>

rvizの修正

起動時のrvizファイルがROS1からROS2で少しパスが変っているので、一個ずつ直します。

例えばrviz/Displaysとなっているところを、rviz_common/Displaysへ変更していきます。

Panels:
  - Class: rviz_common/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Status1

rviz -d でこのファイルを読み込んで表示します。

ここまでが折り返し。 後は姿勢を上手くやるだけです。

launchファイルの修正

dislpay.launch.pyを修正する。

ポイントは、robot_descriptionにurdfへのパスではなく、ファイルを読み込んでその中身を与えること。

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution

from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare


rviz_config_file = "/mnt/q/wsl/mashiro_ws/src/dofbot_urdf/rviz/dofbot.rviz"
urdf_file = "/mnt/q/wsl/mashiro_ws/src/dofbot_urdf/urdf/dofbot.urdf"

def generate_launch_description():

    with open(urdf_file, 'r') as infp:
        robot_desc = infp.read()

    robot_description = {"robot_description": robot_desc}


    robot_state_pub_node = Node(
        package="robot_state_publisher",
        executable="robot_state_publisher",
        output="both",
        parameters=[robot_description],
    )
    joint_state_pub_gui_node = Node(
        package="joint_state_publisher_gui",
        executable="joint_state_publisher_gui",
        output="screen",
    )
    rviz_node = Node(
        package="rviz2",
        executable="rviz2",
        name="rviz2",
        output="log",
        arguments=["-d", rviz_config_file],
    )

    nodes = [
        rviz_node,
        robot_state_pub_node,
        joint_state_pub_gui_node,
    ]

    return LaunchDescription(nodes)

最後に

colcon build
source install/setup.bash

を行った後

  ros2 launch dofbot_urdf display.launch.py

でロボットが表示されます。

GUIで角度も変更できます。

スモールデータ解析と機械学習

スモールデータ解析と機械学習がとても良かったので紹介します。

www.ohmsha.co.jp

データを大量に集められないときにどうやって機械学習を進めるかを実際のアルゴリズムを使って説明しています。データが少ないときはDeep Learningは駄目と最初に書いてあり、Deep Learningについては全く記載がありません。ほぼ回帰と分類の話です。

読んでみたら業務で役に立ちそうだったので、気になったところをまとめて早速社内勉強会をしました。

speakerdeck.com

本の中ではデータが少ないが故のメリットについても解説があり、スモールデータだからといって諦めること無く、むしろ積極的に挑戦することを推奨していてモチベーション上がります。実務では意味のあるデータを大量に集めるのが難しいケースが多く、多くの人に役に立つ内容だと思います。

「表面的な機械学習の知識やプログラミング言語のスキルだけでは、現実の問題に手が出ない」とも書かれていて、ここで勝負するために数学力を高めようと勉強中です。

ROS 2のtf transformationメモ

WSLのROS2環境にtf transformationをインストールしたつもりが、ros2 runで実行するとこのエラーがでます。

Installing the transforms3d library by hand required. Please run
        sudo pip3 install transforms3d
[ros2run]: Process exited with failure 255

turtle_tf2_py のデモも動かない。 ドキュメント通りにやっても駄目。

srcの下にtf_transformationsをgit cloneしてbuildしても駄目。 pip3でのインストールは成功しているので、ros2 runから呼ばれるPython interpreterがtransforms3dを見つけられてないだけまではわかりますが、どうしたらよいのかがわからない。

何度も検索した結果、以下のコマンドで上手く動くようになりました。

python -m pip install transforms3d

pythonとpipがずれていたようです。

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

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

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