QooPenBlog

技術や日常のあれやこれや

ROS2 Humbleで動かすTurtlebot3シミュレーション

概要

ROSの学習コンテンツのひとつにTurtlebot3というロボットがあります。
本記事ではそのTurtlebot3のシミュレーション環境をDocker上に構築するための手順をまとめます。
なお、本記事ではDockerの環境構築についての説明は省略します。

Github

ここで紹介する内容は下記リポジトリに置いてありますのでよければお使いください。

github.com

動作環境

Dockerを動かすUbuntu環境はネイティブ、WSL2のどちらでも動くことを確認済です。
ネイティブのUbuntu環境だと私の知識不足でX serverにアクセスできず、GUIアプリケーション(GazeboとかRviz2とか)が使えなかったのでTiryoさんが作成しているVNC環境を使わせていただきました。(助かる~~!

github.com

訂正
ネイティブのUbuntu環境でGUIが動かせなかったのはDockerのユーザー権限周りに問題があったようでした。公式チュートリアルに沿ってやり直したら無事に起動できました。
- Official Install Guide
- ユーザーグループの設定(重要)

Turtlebot3環境構築

TL;DR(読まなくても良いよ。の意)

最初、下記の記事を参考にしながら進めていましたが
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
で起動しようとしてもエラーで正常に立ち上がらず苦戦していました。

zenn.dev

エラーメッセージ

[spawn_entity.py-4] [INFO] [1708755625.431923993] [spawn_entity]: Waiting for entity xml on /robot_description
[spawn_entity.py-4] [INFO] [1708755625.445295021] [spawn_entity]: Waiting for service /spawn_entity, timeout = 30
[spawn_entity.py-4] [INFO] [1708755625.446068811] [spawn_entity]: Waiting for service /spawn_entity
[spawn_entity.py-4] [ERROR] [1708755655.517602461] [spawn_entity]: Service %s/spawn_entity unavailable. Was Gazebo started with GazeboRosFactory?
[spawn_entity.py-4] [ERROR] [1708755655.518336260] [spawn_entity]: Spawn service failed. Exiting.
[ERROR] [spawn_entity.py-4]: process has died [pid 2400, exit code 1, cmd '/opt/ros/humble/lib/gazebo_ros/spawn_entity.py -topic /robot_description -entity big_wheel -x -2.0 -y -0.5 -z 0.01 --ros-args'].

そのことをX(旧Twitter)で嘆いていたところ、porizou氏から助言が・・・!!

藁にも縋る思いでnavigation2のチュートリアルを試してみると、、

という感じで無事に動作できたので、
以降の環境構築ではnavigation2パッケージを使ってTurtlebot3シミュレーションを動かすことにしています。ご承知おきくださいませ。

Docker構築

環境構築用のDockerfile, docker-compose.ymlは下記の通りです。

Dockerfile

ARG ROS_DISTRO=humble

FROM osrf/ros:${ROS_DISTRO}-desktop
LABEL maintainer="KuwanoTomohiro<ku_fairlady_wa@outlook.com>"

# Set to not be asked to select keyboard settings
ARG DEBIAN_FRONTEND=noninteractive

# Install apt packages
RUN apt update && apt upgrade -y
RUN apt install -y \
    tzdata \
    x11-apps \
    build-essential \
    python3 python3-pip \
    python3-colcon-common-extensions && \
    apt clean && rm -rf /var/lib/apt/lists/*
ENV TZ=Asia/Tokyo

# Install dependent ROS2 packages
RUN apt update && \
    apt install -y \
    ros-${ROS_DISTRO}-gazebo-* \
    ros-${ROS_DISTRO}-cartographer \
    ros-${ROS_DISTRO}-cartographer-ros \
    ros-${ROS_DISTRO}-navigation2 \
    ros-${ROS_DISTRO}-nav2-bringup \
    ros-${ROS_DISTRO}-xacro
RUN apt clean && rm -rf /var/lib/apt/lists/*

# Install Turtlebot3 Packages
RUN apt update && \
    apt install -y \
    ros-${ROS_DISTRO}-dynamixel-sdk \
    ros-${ROS_DISTRO}-turtlebot3-gazebo \
    ros-${ROS_DISTRO}-turtlebot3-msgs \
    ros-${ROS_DISTRO}-turtlebot3
RUN apt clean && rm -rf /var/lib/apt/lists/*

# Create workspace & Clone Turtlebot3 simulation package
RUN mkdir -p /root/ros2_ws/src
RUN git clone -b ${ROS_DISTRO}-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git /root/ros2_ws/src

# Environment Configuration
RUN echo "source /opt/ros/$ROS_DISTRO/setup.bash" >> /root/.bashrc
RUN echo 'export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/$ROS_DISTRO/share/turtlebot3_gazebo/models' >> /root/.bashrc
RUN /bin/bash -c "source /root/.bashrc"

# Build packages
RUN cd /root/ros2_ws && \
    /bin/bash -c "source /opt/ros/$ROS_DISTRO/setup.bash; colcon build --symlink-install" && \
    /bin/bash -c "source install/setup.bash"
RUN echo "source /root/ros2_ws/install/setup.bash" >> /root/.bashrc

docker-compose.yml

version: "3.8"

services:
  dev:
    build:
      context: .
      dockerfile: docker/Dockerfile
      args:
        - ROS_DISTRO=humble
    image: turtlebot3-sim
    container_name: tb3_dev
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:rw # DockerでGUIを使用する設定
      - ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
    tty: true
    network_mode: host
    privileged: true
    environment:
      # Display X Server GUI.
      - DISPLAY=${DISPLAY}
      - QT_X11_NO_MITSHM=1
      # Set environment variables. It is instead of writing them in .bashrc.
      - TURTLEBOT3_MODEL=waffle
      - ROS_DOMAIN_ID=30

コンテナはdocker compose up -d --buildで起動、docker compose downで終了です。
コンテナがうまく立ち上がったら、中に入ってturtlebot3のGazeboを以下のコマンドで立ち上げます。

ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False

初回起動とかだとうまく立ち上がらないこともあるので、その時はCtrl+Cで終了してコマンドをもう一度やり直してください。

参考

謝辞

X(旧Twitter)で助言をくださった方々ありがとうございました。

ROSは大学時代によく触っていましたが、卒業後はあまり触れておらず、さらにROSからROS2に移り変わってしまったのでほぼビギナーも同然です。
そんな感じなので些細なことでも意見交換させていただけるのはとても嬉しいですし、相談のしやすいROSコミュニティは心強いですね。

これからも宜しくお願い致します(`・ω・´)b

クオータニオンの平均化【理論編】

※この記事はQiitaからの引越し記事です。

物体の姿勢の表し方には以下の2種類があります。

このうちクオータニオンオイラー角とは異なり、ある姿勢を一意に決めてしまうものなので、 オイラー角のように見た目の姿勢変化をそのまま値に反映することはできません。

本稿ではそんなクオータニオンの平均を取る手法について話します。

補足
「平均化」とは言わず、普通は「線形補間」と言います。
ただ、今回の目的が線形補間の中間地点を取得することなので、わかりやすさのために敢えて「平均化」と言ってます。

lerp() / slerp()

Unityで主に使われている手法で、2点間の異なるパラメータを[0〜1]の範囲で線形補間することができます。 詳しい話は以下参照

対数化による線形補間

 \displaystyle
\bar{q} = \exp (\sum{\omega_i\log{}q_i} )

これは前項のlerp()/slerp()にも使われてる気がする。。

クオータニオンの平均(Averaging Quaternions)

平均化されたクオータニオンは次のように表すことができます。

 \displaystyle
\bar{q} = \arg min_{Q \in R^{3 \times 3}} \sum{\| Q-Q_i \|}^2_F \\
q : quaternion~vector~(q \in R^4 , |q| = 1) \\
Q : rotate~matrix~(Q \in R^{3 \times 3})

なお、クオータニオンの特徴で、回転行列 Q は直交行列(orthogonal matrix)となります。

Step 1 数式の簡略化

 \displaystyle
\begin{align}
\bar{q} &= \arg min~\sum{\| Q-Q_i \|}^2_F \\
        &= \arg min~\sum{\mathrm{tr}\{ (Q-Q_i)^T(Q-Q_i) \}}
\end{align}

ここで、

 \displaystyle
\begin{align}
\mathrm{tr}\{ (Q-Q_i)^T(Q-Q_i) \} 
&= \mathrm{tr}(Q^TQ-Q^TQ_i-Q_i^TQ+Q_i^TQ_i) \\
&= \mathrm{tr}(Q^TQ)-\mathrm{tr}(Q^TQ_i)-\mathrm{tr}(Q_i^TQ)+\mathrm{tr}(Q_i^TQ_i) \\
&= 6-\mathrm{tr}(Q^TQ_i)-\mathrm{tr}(Q_i^TQ) \\
&= 6-2\mathrm{tr}(Q_i^TQ)
\end{align}

となるので、

 \displaystyle
\begin{align}
\bar{q} &= \arg min~\sum{\mathrm{tr}\{ (Q-Q_i)^T(Q-Q_i) \}} \\
        &= \arg min~\sum{\{ 6-2\mathrm{tr}(Q_i^TQ)} \} \\
        &= \arg max~\sum{\mathrm{tr}(Q_i^TQ)} \\
        &= \arg max~\mathrm{tr}(\sum{Q_i^TQ}) \\
        &= \arg max~\mathrm{tr}(Q\sum{Q_i^T})
\end{align}

Step 2 魔法の力による簡略化

ここでは魔法の力を借りることで更なる簡略化を施します。 (魔法の力については最後の章で話します。ひとまず受け入れてクダサイ。)

 \displaystyle
\begin{align}
\bar{q} &= \arg max~\mathrm{tr}(Q\sum{Q_i^T}) \\
        &= \arg max_{q \in R^4/|q|=1}~q^TKq \\
        &= \arg max~q^T(4M - I)q \\
        &= \arg max~q^TMq
\end{align}

ここでの K  M は以下の通り。

 \displaystyle
K = 4M - I_{4 \times 4} \\
M = \sum{q_iq_i^T}

Step 3 座標空間の変換

 M は先程の式より、対称行列(symmetric matrix)であることがわかります。 (すべての要素が実数である場合、「実対称行列」と呼びます。)

よって M に対角化を行い、元の数式に適用します。  M が対称行列なので、対角化によって現れる行列 P は直交行列であり、その大きさは1となります。

 \displaystyle
M = P^T \Delta P
 \displaystyle
\begin{align}
\bar{q} &= \arg max~q^T M q \\
        &= \arg max~q^T P^T \Delta P q
\end{align}

ここで、 y = Pq により、数式の空間を q から y へと変換します。  q のノルムが1であることと、行列 P が直交行列であることから、 この変換によってベクトル q はベクトル y へ、大きさは変わらずに、向きだけが変わったものとみなせます。

 \displaystyle
\begin{align}
\bar{y} &= \arg max_{y \in R^4/|y|=1}~y^T \Delta y \\
        &= \arg max~
y^T 
\left(
\begin{array}{ccccc}
\lambda_1   &           & 0 \\
            & \ddots    &   \\
0           &           & \lambda_n
\end{array}
\right)
y\\
\end{align}

Step 4 固有値固有ベクトル

ここで、 行列 \Delta 固有値 \lambda_i の中で、ある固有値 \lambda_k が最も大きい値であるとき、 行列 \Delta 固有ベクトル y_i の、ある固有ベクトル y_k も最大となります。

 \displaystyle
y_k^T = 
\left(
\begin{array}{ccccc}
0 & \ldots & 0 & 1 & 0 & \ldots & 0
\end{array}
\right)

したがって、クオータニオンの平均値は y_k となることがわかりました。

 \displaystyle
\begin{align}
\bar{y} &= \arg max_{y \in R^4/|y|=1}~y^T \Delta y = y_k
\end{align}

補足

前項での説明の補足を行っていきます。 リクエストなどがあればコメントください。

魔法の力について

Step 2では「魔法の力」ということにして説明をごっそり省きました。 なぜなら、この部分の変換がかなりハードであるためです。。(ユルシテクダサイ)

 \displaystyle
\begin{align}
\bar{q} &= \arg max~\mathrm{tr}(Q\sum{Q_i^T}) \\
        &= \arg max_{q \in R^{4\times1}/|q|=1}~q^TKq
\end{align}

この節ではこのとき何が行われていたのかを(ざっくり)説明していきます。

回転行列Q

クオータニオンのベクトル q を次のように表すとします。

 \displaystyle
\begin{align}
q &=
{\begin{bmatrix}
q_1 & q_2 & q_3 & q_4
\end{bmatrix}}^T \\
  &=
{\begin{bmatrix}
ϱ^T   & q_4
\end{bmatrix}}^T
\end{align}

クオータニオンの回転行列 Q はベクトル q を使って次のように表します。

 \displaystyle
Q = (q_4^2 - \| ϱ \|^2)I_{3 \times 3} + 2ϱϱ^T - 2q_4[ϱ \times \\ ]
 \displaystyle
[ϱ \times = {\begin{bmatrix} 0 & -q_3 & q_2 \\ q_3 & 0 & -q_1 \\ -q_2 & q_1 & 0 \end{bmatrix}} ]

地獄の式変換

 \displaystyle
\mathrm{tr}(Q\sum{Q_i^T}) =~??

回転行列 Q を展開し、上式をベクトル q のみで表していきます。

・・・嘘です。やりません。 やろうとしましたが、途中で青ざめて挫折しました。

研究室の人と頑張った跡

先人の知識によれば、ここを頑張って耐えしのぐことで以下の等式が得られるとのこと。 今回は先人の知識を「魔法の力」として利用させていただきました。感謝!

 \displaystyle
\mathrm{tr}(Q\sum{Q_i^T}) = q^T K q

クオータニオンの線形補間に関する基本的な手法です。 クオータニオンの値を対数化した後、

線形代数

説明に出てきた内容です。

  • 行列のノルム(Frobenius norm)
 \displaystyle
\| M \|_F = \sqrt{\sum_{i,j}{|m_{ij}|}^2} = \sqrt{\mathrm{tr}{(M^T M)}}
  • 対角和(trace)
 \displaystyle
\mathrm{tr}
\left(
\begin{array}{ccccc}
a & b \\
c & d
\end{array}
\right)
= a + d
 \displaystyle
\mathrm{det}
\left(
\begin{array}{ccccc}
a & b \\
c & d
\end{array}
\right)
= ad - bc
  • 交換法則

対角和と行列式には次のような交換法則が成り立ちます。

 \displaystyle
\mathrm{tr}{(AB)} = \mathrm{tr}{(BA)}
 \displaystyle
\mathrm{det}{(AB)} = \mathrm{det}{(BA)}

よって、対角行列 \Delta に対して次のような変換が可能です。

 \displaystyle
\Delta = 
\left(
\begin{array}{ccccc}
\lambda_1   &           & 0 \\
            & \ddots    &   \\
0           &           & \lambda_n
\end{array}
\right)
 \displaystyle
\mathrm{tr}{(M)} = \mathrm{tr}{(P^{-1} \Delta P)} = \mathrm{tr}{(\Delta)} = \sum{\lambda_i}
 \displaystyle
\mathrm{det}{(M)} = \mathrm{det}{(P^{-1} \Delta P)} = \mathrm{det}{(\Delta)} = \prod{\lambda_i}

参考文献

作業用デスクをDIYで自分好みにした話

自分のデスクはどんな机を使っていますか?

私はニトリで購入したデスクをかれこれ6年くらい使っています。


[幅120cm]デスク (デスク N トリシア 120) ニトリ 【玄関先迄納品】 【1年保証】

シンプルな作りで気に入ってましたが、6年も経つと天板や金属部の汚れが目立ちます。

そろそろ雰囲気を変えたいなぁと思っていたところで正月連休が到来。良い機会なので連休中にDIYでデスクをリフォームしました。

 

製作過程

リフォームする部位は汚れが目立つ天板とフレームです。(そう、全部。笑)

天板は木板を使って木目調に、フレームは汚れを落としたあとにペイントで上塗りしようと思います。

目指せインスタ映え✊✨

 

木材調達

ネットで先人達のDIYエピソードを漁ってみると多くの方がマルトクショップからお気に入りの木材を注文していました。

shop.woodworks-marutoku.com

試しに手元にある天板のサイズを測って見積りしてみると27,000円(ダークウォルナット、サイズ:1200×600×20、追加工なし)。

これを高いと取るか安いと取るかは個人差があると思いますが、個人的にはちょっと、、いや全然高いなぁという印象です💰

もう少し安く済ませたいので近所のホームセンターをいくつかハシゴしてみたところ、ラジアタパイン材🍍と出会いました。

f:id:QooBlog:20240131122805j:image

柔らかくて加工しやすいのでDIYでよく使われる木材というイメージですが、柔らかいため傷がつきやすく、丁重に扱わないと知らぬ間に圧痕がついてしまうなどデリケートな素材です。

まぁ、(程度によりますが)傷が後々に「味になる」のであまり気にしてません😎

 

木材カット&加工

木材はホームセンターのDCM瀬谷店で購入しました。

ここのDCMさんには「マイスター工房」というエリアがあり、マイスターと呼ばれるプロが様々な加工をしてくれます。

www.dcm-hc.co.jp

加工メニューと料金

 

私もプロに加工してもらいたくて、自宅で天板の図面を引いて年末にDCMへ持っていきました。

が、時すでに遅し。マイスターは既に正月休みでした🎍

でも、マイスターが居なくても問題ありません。

隣に「みんなの工作室」があります🛠

www.dcm-hc.co.jp

必要な工具がある程度揃っているので問題なく加工できました👍

そのままウキウキで帰宅して仮組み。ちゃんと組立てができてひと安心です。

仮組したデスク

 

木材に塗るオイル

これも先人達のエピソードより「ワトコオイル」が気になり、試しに購入してみました。

木材を加工した後にオイルを塗ると、オイルが木材に浸透し、水分や汚れから木材を守ってくれます。また、コーティングにより木材の乾燥を防ぎ、寿命を伸ばす働きもあります。

ペイントとは異なり、木の模様を残したまま色付けができるのでとても自然な仕上がりになることも魅力のひとつです。

オイルを塗ると雰囲気がガラッと変わります😎

オイルを塗ったら外で半日乾かし、その後ウエスで表面の余分な油を拭き取ると完了です。

 

完成

オイルを乾燥させている間にデスクの脚を黒で上塗りしました。

完成したデスクがこちら❗


f:id:QooBlog:20240201105734j:image

ラジアタパイン材で作った天板なので失敗するかなぁと不安に思っていましたが、ワトコオイルのおかげでとても味のある仕上がりとなり満足です✨

ちなみに数日間はオイルの匂い(≒体育館のワックスの匂い)が部屋に充満してて少し辛かったです😇

 

まとめ

今回は長年使ってきた自分のデスクをDIYでリフォームする話をしました。

テーブルの上に物があると散らかってるように感じますが、木目調の効果なんでしょうか…、何をおいてもカッコ良く見えるので許せてしまいますね🤤

木材をケチッて安い物を使いましたが十分な成果じゃないでしょうか🕺🕺

 

それでは次回もお楽しみに👋

卓上CNCの防音ケース製作

前回の記事にて防音ケースの構想を書きました。

qooblog.hateblo.jp

その投稿からかなり期間が空きましたが、すでにケースは完成していて現在も運用しています。防音も問題なく機能しており、日常生活に何も支障ないレベルです。

というわけで、ケースの製作について記事を書きたいと思います。

防音を検討している方はご参考ください。

 

 

必要な材料

防音ケースに使用した材料を紹介していきます。

ケース

普通のカラーボックスを使いました。扉付きを必ず選ぶようにしてください。

また、後述の吸音材・遮音材の厚み、所有しているCNCの大きさ等を考慮してサイズを選びましょう。あと作業性を確保するためにゆとりを持ったサイズ選定をするのも良しです。

 


キューブボックス(奥行40cm) ◆ 扉 ◆ ◇【P10倍★1/31まで】ベルメゾン 家具 ファニチャー ユニットボックス ユニット 組み合わせ くみあわせ 連結 新生活 シンプル リビング ユニット 組み替え 子ども おもちゃ 本 スタッキング ◇

 

吸音材

吸音材は「吸音率」の数値が高いものと厚みで選びます。

スポンジのような吸音材なども売られていましたが、形を整えるためにお風呂に漬け込んだりと手間がかかりそうだったのでパネルタイプを購入しました。


【正規品】防音ファストラボ公式【楽天1位3冠】(騒音の緩和に)吸音パネル スクエア型 ヘキサゴン型 12枚セット 吸音材 防音パネル 防音室 や 防音 騒音 の対策に【返金保証付き】土日もあす楽


EVENREACH 吸音材,吸音ボード 防音材 硬質吸音フェルトボード 難燃 防潮 防音材 吸音材 壁,防音シート,遮音材 防音材 部屋用 吸音対策 騒音軽減 防潮, 練習室 録音室 オフィス 室内装飾 消音 防音対策吸音材 防音と音響処理に最適 12枚,約1.1平米(30cm×30cm×0.9cm) (12, ホワイト)

 

遮音材

遮音材は「透過損失」の数値が高いものと厚みで選びます。

吸音材とごっちゃに書かれている商品説明があったりしますが多分間違っていて、遮音材は吸音材と違って音を跳ね返す役割なのでゴムシートのような素材になってるはずです。


遮音シート 【内側から騒音防止!】【欲しい長さだけ購入できる】切り売り 厚さ1.2mm×幅940mm×長さ1~10m巻 TS-12 防音 吸音 遮音 壁下防音 壁下 遮音シート 防音マット 防音シート 遮音材 防音材 シート 建材 騒音 足音 ピアノ 楽器 話声

 

固定具

吸音材、遮音材の固定はタッカーを使用しました。吸音材は軽いので釘でも固定できますが、遮音材が結構重たいのですぐに剥がれてしまいます。

遮音材をタッカーでしっかり固定した後に吸音材を細い釘で固定すると綺麗に仕上がります。


【メール便】 ハンドタッカー 強力 針幅12mm x 針足8mm 200本 セット PHT-2W 【 送料無料 タッカー ガンタッカー 壁紙 シート 張替え 張り替え ホチキス ホッチキス ステープル 針 工作 木工 DIY 手芸 正月 クリスマス 装飾 飾り付け 2WAY マルチ SUNDRY 】

 

オプション①:切粉の吸引ポンプ

切削をすると切粉が必ず出ます。その切粉を放置しておくとケース内が汚くなるので、吸引ポンプを設置して対策したいと考えていました。

探してみると色々出てくるのですが、性能を追い求めるとどうしても騒音が問題になります。

「CNCの音は改善しましたが、代わりにポンプの音がうるさくなりました。」だと笑えないので静音タイプのポンプを探していたところ、水槽用のポンプに静音タイプがありました。


吐出口数2口 静音設計 魚の移送/停電時用/釣り用 2W 酸素ポンプ 2口 水槽エアーポンプ エアーポンプ水槽用 水槽に酸素提供 アクセサリー付きエアポンプ 水槽に酸素提供 アクセサリー付きエアポンプ

 

エアーを吐出する商品ではありますが、小児科のお医者さんがいうには弁を裏表逆にすれば吸引ポンプになるとのこと。試してみるとホントでした😳

youtu.be

理屈は理解できますが、こんな簡単に改造できるのは驚きです。

ただ…吸引力が弱い。。。結構強めのポンプを選んだつもりでしたが、所詮は水槽用。切粉を全然吸うことができずに失敗となりました。

もっとこう…空気の流れとか考えながら検討した方が良さそうです。

 

オプション②:LEDライト

CNCの制御ボードから電源が取れるので、そこからLEDライトを点灯できるようにしましょう。Vビットの振れを確認するときなどにライトがあると都合がいいです。

私は100均で適当なライトを買ってきてLEDの部分だけを剥ぎ取って取り付けました。

 

完成した防音ケース

上記の部品を使って製作したケースがこちら💁

苦労はしましたが割と良い感じに収まってくれたので気に入ってます。

 

まとめ

ここまで読んでいただきありがとうございます。

今回は轟音CNCフライス用の防音ケースの製作について書きました。

初めての制作で苦労しましたが綺麗に仕上がって満足いく結果となりました。

次の記事では色々な加工パターンにおける防音性能を評価してみたいと思います。

 

インホイールモータ開発奮闘記#2

はじめに

前回はインホイールモータの開発動機と構想について書きました。

Ascentoが作りたい…‼︎‼︎という想いを胸にインホイールモータを製作してみます。

qooblog.hateblo.jp

 

本日のお題

ブラシレスモータ(以下、BLDC)を倒立振子ロボットの車輪として扱うにあたり、モータの速度制御や位置制御を正確にできなければいけません。

BLDC制御に関してはロータの回転を正確に把握しなければならず、どうやってその情報を取得しようかな?できるかな?というのが本記事のお題です。

 

使用するモータとドライバ

試作に使用するBLDCにはジンバル用のを使用します。

BLDCはドローン用のラインナップが充実していますが、羽をつける軸が邪魔なのでジンバル用を採用しました。(めっちゃクワッドコプター用って書いてありますが・・・)

 

また、BLDCの制御にはSTマイクロから出ているドライバを使用します。

コンパクトなサイズでありながら、豊富な制御とインターフェイスを兼ね備えているので採用しました。

www.st.com

モータ制御に必要な機能が網羅されているのでとても魅力的なドライバです。

ただし、制御するためには(細かい話は抜きにして)前述の通りロータの回転をセンシングできなければいけません。採用したBLDCにはエンコーダやホールセンサ(磁気センサ)が付属しておらず、市場にもこのサイズ感でセンサ付きのものはほとんど出回っていないのでひとまず後付けで対応したいと思います。

また、ロボットの足元を極力コンパクトにしたいので、エンコーダではなくホールセンサを使います。(安価だし・・)

 

ホールセンサの後付け

BLDCはロータについている永久磁石がステータについているU,V,W層の3種類のコイルから出る電磁気によって力を受けて回転します。


f:id:QooBlog:20240127133651j:image

 

回転を制御するためにはコイルに流す電流を調整する(=コイルから発せられる電磁気を調整する)ことが必要で、さらに効率よく回すためにはU,V,W層それぞれの前を通る永久磁石の磁気を計測して、その磁力に合わせてコイルの電流を調整する必要があります。(ベクトル制御)

 


高トルク&高速応答!センサレス・モータ制御技術 シンプルで高信頼!ベクトル制御で力強く,静かに回す (パワー・エレクトロニクス・シリーズ) [ 岩路 善尚 足塚 恭 共著 ]

 

今回使用するドライバ(B-G431B-ESC1)にはそのベクトル制御が備わっているので、あとはロータの磁気を計測できるようにするだけです。(STマイクロ様々ですね)

ホールセンサを使えば磁気を計測できるし楽勝やろ〜〜😁

 

………そう思っていた時期が私にもありました😇

「磁気が計測できる」というのは「金属がくっつく」ということです。試しにBLDCに金属を近づけてみたのですがほとんど反応がありません😨

永久磁石が貼り付けられている壁の裏側に微弱な反応があるだけでした。。。OTL

f:id:QooBlog:20240127133301j:image

その後も色々と検討しましたが、さすがにこの位置であればまともな計測ができました。
f:id:QooBlog:20240127133541j:image

f:id:QooBlog:20240127133900j:image

スペースがだいぶ限られるのでここにセンサを埋め込むのは気が進みませんでしたが、ここしか磁気が取れないので腹を括ります。。

やるしかない。

 

センサ埋め込み

ホールセンサをBLDCの筐体に埋め込むために基板をFusion360で設計して卓上CNCで製作しました。

f:id:QooBlog:20240127134514j:imagef:id:QooBlog:20240127134519j:image

さらっと言ってますが直径が10円玉サイズなのでハンダ付けが大変です笑

f:id:QooBlog:20240127134527j:image

なんとか配線を終え、ステータコイルを外して取り付けてみるとギリギリ…。

でもちゃんと干渉なく埋め込めてるから良いんです😎

 

オシロスコープにセンサの端子を接続してみると…

f:id:QooBlog:20240127144259j:image

UVWの3層ごとに位相が120°ずれた正弦波が無事に取れていました👍

埋め込み成功です❗❗

 

次回に向けて

ここまで読んでいただきありがとうございます。

次回は埋め込んだセンサを使って色々とBLDC制御を試してみようと思ってます。

しか~~し!今回のセンサ埋め込みを試行錯誤する過程でモーターのコイルをバラしてしまったので現在買い直し中です、、。

f:id:QooBlog:20240127144345j:image

届くまで少しかかるので、待ってる間に別の記事でも書こうと思います。(CNCの話でもしようかな。

インホイールモータ開発奮闘記#1

開発動機

今から5年ほど前の2018年くらいに、スイスのチューリッヒ工科大学の学生がAscentoという車輪型の倒立振子ロボットを製作しました。

このロボットは車輪で軽快に移動するのもさることながら、リンク機構によってモーター1つで曲げ伸ばし可能な足を持っているので段差をジャンプで乗り越えることができます。

youtu.be

当時大学生だった私はAscentoの動画を見て一目惚れし、いつか作りたいなと思い続けてきました。何度か作ろうとしたことはありましたが、決まっていつも同じ壁にぶち当たります。  

それがこの奮闘記のテーマにもなっているインホイールモータです。  

Ascents の車輪はブラシレスモータを採用していますが、タイヤとモータが一体になったインホイールモータを使用しているので足元が非常にすっきりしています。

せっかく作るなら同じインホイールモータで駆動させたいなと思っているのですが、市場に出回っているのはせいぜいバイク用の小さなインホイールモータくらいで、小型ロボットにちょうどいいサイズ感のものは出回っていません。。。  

そんなこんなで良いインホイールモータが見つからないので、そのうち出てくるだろう〜とのんびり構えていましたが、まぁ出てくる気配が微塵もありません。

一方で、近年のドローンブームのおかげかブラシレスモータのラインナップは増え続けているので「今なら作れるかも⁉︎」と思って今に至ります。

構想と方向性

Ascentoの車輪を参考にしつつ、市販のブラシレスモータを改造していきます。

モーターによっては倒立振子の車輪として使う際にトルク不足の懸念がありますが、車輪に減速機構を埋め込むと衝撃でギアが傷んでしまいそうなので、ブラシレスモータのステータをハブ、ローターが車輪、というのを基本構成とします。

あとローターとタイヤをいい感じに繋ぐホイールが見つかれば完璧ですが、ここは無ければ3Dプリンタで製作すればいいかな。。。まぁなんとかなるっしょ。

次回に向けて

読んでいただいてありがとうございます。

次回はパーツ選定とモータ制御のためのトライアルについて書きます。

blog.hatena.ne.jp

【Fusion360】電子デザインライブラリ作成の基本

はじめに

Fusion360で基板設計したいときに「手持ちの電子部品がライブラリに無い!どうしよう!」ってなることがよくあります。 そこでライブラリを新たに作ろうと意気込むわけですが、毎度やり方を忘れるのでまとめていきます。

対象読者

  • Fusion360の電子部品ライブラリに手持ちの電子部品を登録したい人
  • 電子デザインライブラリを開いてみたけど操作がいまいちピンとこない人(自分)

ライブラリに必要な情報

電子デザインライブラリ初期画面

ライブラリとして使うためには以下4つの情報が必要です。

コンポーネント
コンポーネント」はライブラリに含まれる電子部品をまとめたものです。
例えばピンヘッダなんかはピン数が同じでも真っ直ぐなタイプと直角に曲がったタイプ、表面実装タイプ、など色々あると思います。 ライブラリ作成ではそれぞれの②〜④を作成していくのですが、それらをひとまとめにするものがコンポーネントです。

②記号
「記号」は回路設計において、配線をつなげるために使用される図です。
電子部品の端子を図で表現します。

③フットプリント
「フットプリント」は基板設計において、部品がどこにどう配置されるかを表す図です。
電子部品の端子がハンダ付けされる面(フットプリント)と、そこにハンダ付けされた時の電子部品の姿勢を図で表現します。

④パッケージ
電子部品の外観を表すものです。
電子部品としての機能には直接影響しませんが、電子回路の完成モデルを生成するときに必要になります。
精巧なモデルを登録しておけばエモいモデルが作れるようになります。

ライブラリ作成

手持ちの電子部品(S49E)を使ってライブラリを作成していきます。

作成の流れ

ライブラリ作成は
記号→フットプリント→パッケージ→コンポーネント
の順番で作成していきます

記号作成

記号作成

回路図上で配線を接続する端子を定義していきます。
やることはシンプルで、ピンを配置→ピン名称を定義するだけです。

見栄えをよくするために四角で囲ってあげます。

記号はこれで完成です。

フットプリント作成

フットプリント作成

基板上で電子部品の端子がどの位置にどの向きで配置されるかを定義していきます。 基本的な流れは記号作成と同じで、端子が置かれるパッドを配置→パッド名称を定義していきます。 なお、パッド名称は記号で定義した名称と揃えてあげることで互いにリンクされます。 また、編集画面は基本的に基板を上方から見る方向で表示されています。半田づけする面を想像すると左右を間違えるので気をつけてくださいね。

こちらも端子だけだと味気ないので外形を書いて終了です。

パッケージ作成

電子部品の外観を定義していきます。 先ほど作成したフットプリントのデータを右クリックすると「新しい3Dモデルを作成」とあります。

フットプリントデータを右クリックして3Dモデル設計へ

ここを押してみると見慣れたCAD画面が作成されます。

XY平面にフットプリントが表示されており、このフットプリントに重なるように電子部品の3Dモデルを作成してください。 お察しの通り、XY平面は基板面になりますので、そのあたりを意識して作成するといいです。

作成した3Dモデル

コンポーネント作成

作成した記号、フットプリント、パッケージをコンポーネントに登録します。
(後日詳細を追記します)

以上でライブラリ作成は完了です。

さいごに

手持ちの電子部品をFusion360の電子部品ライブラリに登録する方法をざっくり説明しました。 とてもシンプルな構成の電子部品を使ったのでこれくらいであれば30分かからずに追加できるボリュームだと思います。 マイコン関係でも端子が増えるだけで基本的な流れは同じです。

他にも機能がたくさんあるようなので、知識が増えたら記事を書きたいと思います。 この記事についても指摘やコメントがあれば宜しくお願い致します。

卓上CNCの騒音問題を解決する防音ケースの構造とは

今回は購入した卓上CNCの騒音問題を解決する防音ケースの構造を考えていきます。
集合住宅でも安心して使えるような防音性能を目指したいと思います。 qooblog.hateblo.jp

防音について

音の性質

まずは敵を知ることから始めましょう。

「物理学における音:音波」Wikipediaより引用

物理学においては、音とは物体を通して縦波として伝わる力学的エネルギーの変動のことであり、波動としての特徴(周波数・波長・周期・振幅・速度など)を持つ音波として表せる。
音波を伝える物質は媒質と呼ばれる。音波は圧力変動の波動として伝わり、ある点での密度の変動を引き起こす。媒質中の粒子はこの波によって位置を変え、振動する。音について研究する物理学の分野は音響学と呼ばれる。
媒質が流体(気体または液体)の場合はずれ応力を保持できないため縦波しか伝播できないが、固体中では縦波・横波・曲げ波・ねじり波などとして伝播できる[8]。それら縦波以外の波も広義の音波に含む場合がある。

Wikipediaからざっくり解釈すると、
『音』は縦波で、流体を媒介して伝わる」ということが分かります。
また、音の振動は固体中を伝播することができ、縦波・横波・曲げ波・ねじり波など様々な形で伝播していきます。

高校物理で扱う「波」の分野にて、波には「反射」「屈折」「回折」「干渉」の4つの特性があるという話がありました。
音も縦波として流体中を伝わっているので、光と同じように上記4つの特性を持っていると言えます。

防音とは

音の特性を把握したところで、次は防音について調べていきます。
ひとえに「防音」といっても、吸音遮音防振など、複数の要素が含まれています。

  • 吸音:反響の低減・反射の抑制・騒音レベルの低減を行うこと
  • 遮音:発生した音を遮ること
  • 防振:振動している物体から、別の物体へ振動が伝わることを防ぐこと

吸音材と遮音材

世の中には「吸音材」と「遮音材」いうものがあります。その名の通り、吸音または遮音してくれる優れモノで、防音には必須のアイテムです。

通常は壁に音が当たった際に、先述した波の特性により音の反射が起きます。さらに音波は固体中を伝播するので、壁の裏側へと音が伝わり通過します。

一方で、吸音材と遮音材は音が内部を通過する際にエネルギーを音から熱へと変換することで、通過する音のエネルギーを奪うことができます! (スゲー!!
※材料や構造により違いがあります。

吸音材は「入射した音」と「通過した音」とを比較することで性能を評価することができます。 吸音材はその比率を「吸音率」と呼び、これが高いほど音の吸収性能が高いと判断します。

吸音材の評価では「吸音率」と呼ぶのに対し、遮音材ではこの比率を「透過率」と呼びます。 性能を示す指標としては、透過率の逆数の対数を10倍した「透過損失」という量が用いられるのが一般的で、透過損失の値が高いほど遮音性能も高いと判断します。

吸音材は音を通過させる代わりに入射した音のエネルギーを減らします。一方で、遮音材は吸音材よりも音を遮る能力が高く、入射した音のほとんどを反射させてしまいます。 したがって、防音をする際は吸音材を通した後に遮音材で跳ね返すという手段が一般的となっています。

たしかにこの構造であれば外部に音を漏らさずに内部の音を抑え込めそうです!!

防音ケースの構造を考える

防音についてわかってきたところで、いよいよ防音ケースの構造について考えていきましょう!

まず前提として、ケースの中央にはフライスを置き、周囲を壁で覆う構造にします。
また、ケースの中へアクセスしやすくするために、フライスの正面には扉をつけるとします。

壁の構造

フライスの周囲を覆う壁の内側には一般的な組み合わせである吸音材と遮音材のセットを配置したいと思います。
フライスの加工中に出る音は非常に高音なので、周波数が高い領域での性能を比較検討します。

フロア(床)の構造

加工中はフライスの振動がケースを伝播して外部へ漏れ出てしまう可能性があるので、フロアにはゴムシートを使います。
耐震用マットとかだといいんでしょうか?要調査ですね。

外部との接点

外部との接点も要注意です。
箱状のケースを床にドカッと置いてしまうと接触面積が増えてしまうので、それだけ振動が伝わりやすくなると考えられます。(主観です

なので今回製作するケースは高床式構造にすることで接触面を限定し、そこに耐震用の足をつけたいと思います。

まとめ

今回は「防音」をテーマに「音を遮る仕組みと構造」について調査しました。 とりあえず吸音材と遮音材を組み合わせればある程度の防音は確保できそうです。 次回はいよいよケースを製作していこうと思います。では!

qooblog.hateblo.jp

卓上CNCを購入しました

こんにちは。

突然ですが、電子工作をしているときに
「ジャンパワイヤのはんだ付け作業めんどくさいな・・・」 って思ったことはないでしょうか?
細かい作業で目が疲れるし、誤って火傷することもあるのでいい加減にはんだ付けを卒業したい・・・とずっと考えていました。

そんな折に見つけたこの動画↓↓

いやぁ、世の中便利になったものですね。 CNCでこれだけ綺麗に基板が彫れるのであればオリジナルの基板を制作し放題です。

というわけでさっそく卓上CNCを購入してみました。
加工範囲が126mm x 88mm x 38mmの小さなCNCです。

赤のメタルボディ(カッコイィ!!

saponote.hatenablog.com


DIY CNCルータキット、CNC1310 126x88x38mm、ミニフライス盤、USBデスクトップ彫刻機、ウッドメタル用、木工用、金属加工用 - DIY CNC Router Kit, CNC1310, Mini Milling Machine, USB Desktop Engraving Machine, For Wood, soft Metal, Woodworking, Soft-Metalworking

組み立て後に付属のビットを取り付けてスイッチオン!

ンビィィィィィィィィィィィィイイイイイイインンン!!!!!!
ガガガガガガガガガガガ!!!!!!!!!

ヒェェェェ!!めちゃくちゃうるさい~~~(´;ω;`)

まさかここまでうるさいとは予想してませんでした。。
騒音計で計測してみると70~80db!!!
うるさすぎて耳が逝きそうです。。設定が悪いのかな。。。

70~80db:騒々しい事務所、掃除機、電車の車内など

というわけでまずはちゃんと使えるように改良が必要そうです。
騒音対策は急務ですね。。( ˘ω˘)スヤァ

プライバシーポリシー

この記事は当サイト『QooPenBlog』における個人情報の取り扱いや免責事項についてをまとめたものです。

 

個人情報について

利用目的

当ブログでは、お問い合わせの際に、お名前、メールアドレス等の個人情報をご登録いただいています。

これらの個人情報は、質問に対する回答や必要な情報をご連絡する場合に利用させていただくものです。個人情報をこの目的以外で利用することはございません。

また当ブログでは、スパム・荒らしへの対応として、コメントの際に使用された IPアドレスを記録しています。

これは、はてなブログの標準機能としてサポートされているものです。スパム・荒らしへの対応以外にこの IPアドレスを使用することはありません。   

 

個人情報の保管

ユーザーの個人情報を正確かつ最新の状態に保ち、個人情報への不正アクセス・紛失・破損・改ざん・漏洩などを防止するため、セキュリティシステムの維持など必要な措置を講じて、個人情報の厳重な管理を行ないます。

 

個人情報の開示

【第三者への開示】

次の場合を除いて、ユーザーからいただいた個人情報を第三者に開示することはありません。

  • 提供者の同意がある場合
  • 法令に基づく場合
  • 不正行為やその他の違法行為を防ぐために個人情報の開示が必要となった場合
【本人への開示】

ご本人の個人情報の照会・修正・削除などをご希望される場合には、ご本人であることを確認の上、対応させていただきます。

 

広告の配信について

Google アドセンスなど

「QooPenBlog」は第三者配信の広告サービス「A8.net」「もしもアフィリエイト」を利用しています。
広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用します。Cookieを使用することでユーザーのPCを識別できるようになりますが、ユーザー個人を特定できるものではありません。

Cookieを無効にするやGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください。

Amazon アソシエイト

「QooPenBlog」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。 Amazonのアソシエイトとして、「キラッとはてログ」は適格販売により収入を得ています。

Amazonアソシエイトの個人情報の取扱方法についてはAmazonプライバシー規約をご覧ください。

 

アクセス解析ツール

「キラッとはてログ」では、Googleが提供している分析ツールGoogle Analyticsを利用して、訪問者の行動を分析しています。Google Analytics のデータのプライバシーとセキュリティについてはこちらをご覧ください。

Google Analyticsトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。

この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

 

免責事項

当ブログからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。  

また、当サイトに掲載しているすべての記事は、予告なしに変更・削除されることがあります。 予めご了承下さい。

 

肖像権について

当ブログは著作権や肖像権の侵害を目的としたものではありません。著作権や肖像権に関して問題がございましたら、お問い合わせフォームよりご連絡ください。確認後、速やかに対応いたします。

 

著作権について

「QooPenBlog」に掲載されている情報についての著作権は放棄しておりません。掲載している文章や画像などにつきましては、無断転載することを禁止します。  

当ブログからの引用に関しましては「引用元の明示」によって無償で引用頂けます。  

ただし、全文転載はお断りいたしております。引用許可範囲についても、事前予告なくこれを変更する事があります。

 

プライバシーポリシーの変更について

「QooPenBlog」は、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。

 

運営者:qoopen

 

初出掲載:2021年5月14日