Using TF2 on with Python 3

by NigoroJr 0 Comments

ROS1 officially supports Python 2, but there are many official libraries that are written with compatibility for Python 3. TF2 is one of them, and it may be a good idea to start using Python 3 for simple applications that make use of TF2.

What’s Required

My Environment

  • Ubuntu 16.04
  • ROS Kinetic
  • Python 2.7.12 (system)
  • Python 3.5.2 (system)
  • Python 3.6.4 (installed with pyenv)

Steps

Note: You may want to create a different catkin workspace for this. Otherwise, you’ll probably need to recompile all the packages that depend on TF2 libraries.

  1. Install pyenv following the instructions in the URL above
  2. CONFIGURE_OPTS=--enable-shared pyenv install <version> to install the latest Python 3 with the shared libraries
  3. Download geometry2 and put it in your catkin workspace
  4. Go into your catkin workspace and run pyenv local <python version you installed>
  5. Run pyenv rehash and make sure python --version displays the right version
  6. Install dependencies with: pip install catkin_pkg pyyaml empy rospkg numpy
  7. Run catkin_make -DPYTHON_EXECUTABLE=$( pyenv prefix )/bin/python3 -DPYTHON_LIBRARY=$( pyenv prefix )/lib/libpython3.so -DPYTHON_VERSION=3
  8. In a Python 3 console, run import tf2_ros.

If you get the following error when running catkin_make, make sure that the executables you’re pointing to exists, and that they’re the right version.

When I forgot to specify -DPYTHON_EXECUTABLE so cmake couldn’t find the right Python interpreter,

CMake Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find PythonInterp: Found unsuitable version "2.7.12", but
  required is at least "3" (found /usr/bin/python)
Call Stack (most recent call first):
  /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:386 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.5/Modules/FindPythonInterp.cmake:163 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  /opt/ros/kinetic/share/catkin/cmake/python.cmake:8 (find_package)
  /opt/ros/kinetic/share/catkin/cmake/all.cmake:147 (include)
  /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:20 (include)
  CMakeLists.txt:52 (find_package)

I got this while compiling rviz because I didn’t specify -DPYTHON_LIBRARY.

CMake Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find PythonLibs: Found unsuitable version "2.7.12", but required
  is at least "3.6" (found
  /home/naoki/.pyenv/versions/3.6.4/lib/libpython3.so)

If you get the following error in the Python console, suspect that you’re not using the right Python version:

>>> import tf2_ros
Cannot load geometry_msgs moduleTraceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/__init__.py", line 49, in <module>
    from .client import spin, myargv, init_node, \
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/client.py", line 52, in <module>
    import roslib
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslib/__init__.py", line 50, in <module>
    from roslib.launcher import load_manifest
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslib/launcher.py", line 42, in <module>
    import rospkg
ImportError: No module named 'rospkg'

Result

Python 3.6.4 (default, Jan 21 2018, 19:20:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import rospy
>>> import tf2_ros
>>> from geometry_msgs.msg import TransformStamped
>>> rospy.init_node('sample')
>>> static_tf = TransformStamped()
>>> tf_sb = tf2_ros.StaticTransformBroadcaster()
>>> static_tf.header.stamp = rospy.Time.now()
>>> static_tf.header.frame_id = 'base_link'
>>> static_tf.child_frame_id = 'laser'
>>> static_tf.transform.rotation.w = 1.0
>>> tf_sb.sendTransform(static_tf)
>>>

And that’s how you use TF with Python 3!

References

mbedでLチカができるようになった話

組み込みのHello World的存在である,LEDをチカチカさせるプログラム,所謂Lチカを正常に動かすことができるようになった話です.

LPC1768とgcc4mbedを使っています.

テスト用に以下のLチカプログラムを書きました.
これ以上簡単なプログラムはないというぐらいです.

#include "mbed.h"

DigitalOut myled(LED1);

int
main() {
    while (1) {
        myled = 1;
        wait(0.1);
        myled = 0;
        wait(0.1);
    }
}

gcc4mbedをインストールして, make deploy を走らせると……

チカチカの間隔が長い!!

0.1秒ではなく,1秒間隔になります.

0.1のところを変えても,やはり指定した秒数の10倍の間隔になります.

原因

mbed OS 5用のバイナリだと,こうなるみたいです.もともとLPC1768はmbed 2用のバイナリじゃないといけないらしく,それ用にしたらうまくいきました.

2017-10-21追記: ファームウェアをアップデートし,mbed OS 5にすることでも解決しました.RTOSが使えるようになって便利になりました.下記の解決方法より,ファームアップデートのほうがおすすめです.

解決方法

gcc4mbedの設定用環境変数 MBED_OS_ENABLE を変更する.

export MBED_OS_ENABLE=0

使うデバイスのスペックをちゃんと知っておかないと,こういうことが起こるんですね.

Karabinerでやっと気に入った配列にできた話

前置き

Happy Hacking Keyboardの素晴しい配列に慣れると,
一般的なUSキーボードのわけわからん配列には耐えることができなくなります.
Karabiner自体は,KeyRemap4MacBookと名乗っていた時代から使っていたのですが,
その頃から思い通りの設定にできなくてもどかしい気持ちになっていました.
そんな私がやっと思い通りの配列に変更することができたので,メモがてら共有します.

さて,以下が私のMacBook Air (Late 2012)のキーボード配列です.

ん?なぜ a の隣が o なのかって?
申し遅れましたが,私,Dvorakユーザです.
あとSKKとかACT09とかバリバリ使ってます.
まぁ今回の話はそのへんの変更ではないので気にしないでください.
ちなみにこの配列変更は,マイナスドライバーでぱちぱち外して,ぱちぱちはめこみました.

さて,このキーボードですが,気に入らない点が幾つかあります.

  1. 1 の左は Esc がいい!
  2. 1 の左のキーは, Shift~ としても使いたい!
  3. `~ はなくならないでほしい!
  4. CapsLockControl として使いたい!

以下が理由です.

  1. 私がVimのヘビーユーザだから
  2. コマンドラインで ~ はめちゃくちゃよく使うから
  3. ` はMarkdownでよく使う
  4. コマンドラインのヘビーユーザなら誰もがそうしていると思われる設定

つまり,こうしたいのです.

まぁ,本当は \Backspace にしたり,
Delete\ にしたり,Shift + Delete| にしているんですが,
そのへんはデフォルトでもできるので割愛.

要はHHKBみたいにしたいということ.

設定方法

必要なもの

  • Karabiner
  • Seil
  1. まずシステムの設定を開いて KeyboardModifier KeysCapsLockControl にする
  2. Seilで Control_L110 にする.これはPC Application Key
  3. Karabiner用に ~/Library/Application Support/Karabiner/private.xml を作る
  4. 以下の内容を追加する:
  <item>
    <name>Hogehoge</name>
    <identifier>private.hogehoge</identifier>
    <autogen>
      __KeyToKey__
      KeyCode::PC_APPLICATION,
      KeyCode::BACKQUOTE,
    </autogen>
    <autogen>
      __KeyToKey__
      KeyCode::BACKQUOTE,
      ModifierFlag::SHIFT_L,
      KeyCode::BACKQUOTE,
      ModifierFlag::SHIFT_L,
      </autogen>
      <autogen>
      __KeyToKey__
      KeyCode::BACKQUOTE,
      KeyCode::ESCAPE,
    </autogen>
  </item>

こうして作った private.xml を読み込ませて,さきほど追加した項目に
チェックを入れると設定が反映されます.

検証はしていませんが,処理の順番的に

  1. Seil (Control → PC Application)
  2. Karabiner (PC Application → `等)
  3. macOSの環境設定で適応したキー (CapsLock → Control)

っぽい?

役に立つページ

GentooでJetpackのXML-RPCエラーが出るとき

ちょっと時間がかかったので、メモ。

Problem

Jetpackをadminページからconnectしようとしたときに、XML-RPCのエラーが出る。
/xmlrpc.php にアクセスすると、ちゃんと期待されるメッセージは表示される。
でもconnectできない。

Solution

原因はPHP7を使えていないという単純なもの。なので、以下の手順でPHP5から7に変えてやるとできるようになる。

  1. /etc/conf.d/apache2-D PHP5 から -D PHP に変える。
  2. eselectphp7.X を選択する。
  3. apacheを再起動。