Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

hy2pyを使ってhyスクリプトをpythonスクリプトに転換する

hy2pyはhy環境に付属するpythonスクリプトコンバーターです。
何からの事情でPythonしかない先で使うときに活用できそうです。

実際のところ

(import time)
(import serial)

(setv ser ( serial.Serial "/dev/ttyACM0" 57600))

(defn robotTask [dist] (-> (+ "task," dist "\n") (str.encode) (ser.write)))

(robotTask "up")
(for [x ["right" "down" "left"]]
  (robotTask x)
  (.sleep time 6.0))

これを

$ echo sample.hy | hy2py3

でコンバートすると……こうなります

import time
import serial
ser = serial.Serial('/dev/ttyACM0', 57600)


def robotTask(dist):
    return ser.write(str.encode('task,' + dist + '\n'))


robotTask('up')
for x in ['right', 'down', 'left']:
    robotTask(x)
    time.sleep(6.0)

Hylang環境でpySerialをつかってシリアル通信やる

巷で大人気のPythonには豊富なライブラリ群があります。
教材の類も充実してますし、会社や研究室の先行プロジェクト資産もあるでしょう。
Hylangは幸いにしてPythonとの連携機能が充実しているので
こういった先行資産を活用しながら、徐々にLisp色に染めていくというスタイルを
現実的に実行可能なヤベぇ特徴を備えています。

今回はオープンソースなロボットアームOpen Manipulator Xを
シリアル通信経由で操作する単純なアプリケーションを考えます。

実際のところ

当該ロボットアームはUbuntu端末からシリアル通信経由で所定の指令文を送ることで操作します。
Pythonでやると、こんな感じになります。

import serial
ser = serial.Serial('/dev/ttyACM0', 57600)
ser.write("task,up\n")

これをHylangで書き直してみましょう。

ライブラリのインポート

まず、ライブラリインポートですが、これはそのまんま。

(import serial)

変数設定

次に変数設定。
letは残念ながらない*1ので、
Hy公式のスタイルに則ってsetvで値を定義します。
文字列はダブルクオートじゃないと受け取って貰えないので注意!

(setv ser ( serial.Serial "/dev/ttyACM0" 57600))

シリアルの書き込み

次に書き込みです。なんも考えないと、こんな感じの実装になるかと思います。

 (ser.write (str.encode "task,back\n"))

Clojure由来らしい魔界記法"スレッドマクロ"をつかうと……以下のように書き下せます。

(-> (str.encode "task,up\n") (ser.write) )

指令文本体は単体の要素として先に切り出して渡してあげてもいいので……

(-> "task,up\n" (str.encode) (ser.write) )

この例ですと旨味がないですが、"."記法を使う場合、
スレッドテイル・マクロを使い末尾にくっつけるようにして
こう書くこともできますね。

(->> "task,down\n" (.encode str) (.write ser) )

書き込み部を関数に切り分ける

スレッドテイル方式のものを関数に切り分けましょう。
defunじゃなくてdefnです。

(defn robotTask [dist] (-> (+ "task," dist "\n") (str.encode) (ser.write)))

(robotTask "up")

繰り返し処理も見通しよくなりますね。

(import time)
(for [x ["right" "down" "left"]]
  (robotTask x)
  (.sleep time 6.0))

感想

データをつくって渡していく構造、シェルスクリプト っぽいですね。
本格的にS式で作り込んで行けば、PythonやCだと目が回るような複雑な処理も
スマートに記述できそうです。

*1:欲しい時は自分で作りましょう

Ubuntu18 に Python上で動く魔界LISP "Hy"の環境をつくる

HyPython上に実装されたLISP方言です。
Pythonのライブラリを活かしながら、LISP的な記述ができる強みがあります。

今回はこのHy言語をUbuntu18LTSの上に構築してみます。

実際のところ

Python上で動いているので、当然Pythonの環境は必要です。
今回はPython3の上に構築しました。

導入

導入はほかのライブラリと同様pipでいけますが、標準のロード先にはないためgithubリポジトリから導入します。

$ pip3 install git+https://github.com/hylang/hy.git

使いかた基礎

$ hy
hy 0.17.0 using CPython(default) 3.7.3 on Linux
=> (+ 1 2)
3
=> (print 'hello)
hello
=> (defn say [hello] (print hello))
=> (say 123)
123
=>

【読書メモ】予備校のノリで学ぶ大学数学 ~ツマるポイントを徹底解説

予備校のノリで学ぶ大学数学 ~ツマるポイントを徹底解説

予備校のノリで学ぶ大学数学 ~ツマるポイントを徹底解説

予備校のノリってなんやねんという話ですが、
最近の人気講師ではありがちな、ギャグを含めて面白おかしく講義が進んで行くスタイルです。

divだのradだの、私が現役時代で十分理解できなかったところを
わかりやすく解説してくれるので、たすかります。

【読書メモ】みんなのM5Stack入門

みんな大好きスタック型つよつよマイコンボードM5Stackの本です。
一部の大きなお友達に大人気のM5StickCに言及した章もあります。

他のみんなの〜系と同様、そこまで突っ込んだ記述はないのですが
その分、人に勧めやすい本です。

【イベントログ】2025年のロボットやaiやiot業界を考える会 002

今回の会場はシドミード展で行った、アーツ千代田3331。


Pepperを高座にあがらせてみた。
NOT玄人の落語集団。
天狗連 - Wikipedia


Jetson TX2で動く自動操縦、Python製。
レベル2(人間が介在)なら、カリフォルニアの高速道路で実地テスト!!
github.com

"1st 1mile"に自動車制御系情報が集約されている。

ロボセンサー社
線みたいな振動センサー
CNCの先っちょの摩耗レベルを調べる機構
0.1Hz~1MHz


服薬指導のリモート
スマホタブレットなんて離島の人が使えない
なら身近な家電であるテレビをスマート化すればいいじゃない

【執筆中】Ubuntu 18 LTSの上にROS2環境を構築する

$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/open_manipulator/ros2/install_ros_dashing.sh && chmod 755 ./install_ros_dashing.sh && bash ./install_ros_dashing.sh
$ sudo apt install ros-dashing-python* ros-dashing-rqt*

以下の様なファイルを用意して

#! /bin/bash
cd ~/robotis_ws/src/  
git clone -b ros2 https://github.com/ROBOTIS-GIT/DynamixelSDK.git  
git clone -b ros2 https://github.com/ROBOTIS-GIT/dynamixel-workbench.git  
git clone -b ros2 https://github.com/ROBOTIS-GIT/open_manipulator.git  
git clone -b ros2 https://github.com/ROBOTIS-GIT/open_manipulator_msgs.git  
git clone -b ros2 https://github.com/ROBOTIS-GIT/open_manipulator_dependencies.git  
git clone -b ros2 https://github.com/ROBOTIS-GIT/robotis_manipulator.git  
cd ~/robotis_ws && colcon build --symlink-install  
$ ./setupLauch.bash

参考もと

OpenMANIPULATOR-X