空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

スレッドについて

プロセスとスレッドの違い

  • プロセス:メモリ領域が独立しているので安全、しかし切り替えに処理が多い
  • スレッド:切り替えのコストは低いが、干渉しないように考慮する必要がある

参考:

イケてるエンジニアになろうシリーズ 〜メモリとプロセスとスレッド編〜 - もろず blog

連載.NETマルチスレッド・プログラミング入門:第1回 マルチスレッドはこんなときに使う (1/2) - @IT

スレッド化のキーポイント

  • レスポンスタイム

ex: ダウンロード中のほかの操作など

ex: ネットワークやディスクへのアクセスは時間がかかるがCPUの処理は低いため、この時CPUを有効活用する

スレッドの実装のイメージ

わかりやすい👇

参考:

スレッド - Python入門から応用までの学習サイト

オーバーヘッド

  • 行いたい処理とは別に付加的に必要な処理や時間

ex : 送りたいデータではなく、その制御に使う処理

参考:

オーバーヘッドとは|overhead : 意味/定義 - IT用語辞典

コンテキストスイッチ

  • スレッド間での切り替え動作

参考:

連載.NETマルチスレッド・プログラミング入門:第1回 マルチスレッドはこんなときに使う (1/2) - @IT

rosのNamesに関して

名前の種類

  • base
  • relative/name
  • /global/name
  • ~private/name

参考:

ja/Names - ROS Wiki

Names - ROS Wiki

Namespace and Remapping - ROS Answers: Open Source Q&A Forum

ROS Naming and Namespaces | NooTriX

Remap

  • topic名やparameter名を簡単に変更できる

<launch>

  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>

参考:

Remapping Arguments - ROS Wiki

ja/Remapping Arguments - ROS Wiki

roslaunch/XML/remap - ROS Wiki

環境変数

参考:

ROS/EnvironmentVariables - ROS Wiki

デバッガのお勉強

rosのデバッガ、IDE

  • rosでもpdbが使える?

【ToDo】 rosでeclipsepdbを使ってみる

参考:

IDEs - ROS Wiki

debug ros node python - ROS Answers: Open Source Q&A Forum

How do I use eclipse with python (pydev) - ROS Answers: Open Source Q&A Forum

pythonのデバッガ

参考:

Pythonデバッガ(pdb)とテスト(pytest)についてのメモ - c-bata web

研究のプログラミングにおける悲劇を無くすためのGitとテスト - Kesin's diary

rosのCMakeListsのお勉強

T・B・D

install

install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
  FILES_MATCHING PATTERN "*.launch"

)
  • .launchだけをコピー
install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
  PATTERN ".svn" EXCLUDE)
  • .svnを除き、それ以外をコピー

mockテストのお勉強

mock.return_value

  • 返り値を指定できる

mock.called

mock.call_count

  • 何回呼ばれたか確認できる

mock.call_args

mock.call_args_list

  • 引数のリストがわかる

mock.side_effect

  • いろんなものが指定できる

例えば(イテレート)

side_effect = chain([1,2,3,4])

mock.method_calls

mock.mock_calls

  • mock_calls は、メソッド,特殊メソッド,戻り値のモックまで、モックオブジェクトに対するすべての呼び出しを記録する

mock.assert_called

mock.assert_called_once

mock.assert_called_with

mock.assert_called_once_with

mock.assert_any_call

assert_has_calls

参考:

26.5. unittest.mock — モックオブジェクトライブラリ — Python 3.6.1 ドキュメント

パッチデコレータ

@patch

参考:

Pythonのテストコードでmockを使ってみた | Developers.IO

mock(Pyhtonモックライブラリ)についてのメモ - Qiita

Pythonのデバッグとテストモジュール - Qiita

Pythonで学ぶ 基礎からのプログラミング入門 (34) Pythonのテスト手法 | マイナビニュース

ユニットテスト

# @raises 例外のテスト
@raises(Error)
def test_invalid_arg():
    actual = add(None, 1)

参考:

Python nose でユニットテストを書いてみた / 桃缶食べたい。

rospyのお勉強

rospy.get_param

  • パラメータサーバーから値をとってくる
rospy.get_param(param_name, default)

参考: rospy/Overview/Parameter Server - ROS Wiki

rospy.Time

  • rate,sleep,durationなどよく使うものが多い
  • rospy.Timer(period, callback, oneshot=False)
    • periodで指定した周期で定期的にcallbackが呼ばれる

参考:

rospy/Overview/Time - ROS Wiki

rospy.wait_for_message(topic, topic_type, timeout)

  • トピックを一回だけサブする関数

rospy.ROSInterruptException

  • KeyboardInterruptなどInterruptの操作のException