Tag Archives

6 Articles

No PyCharm completion for rospy

Premises

I have a version of ros_comm cloned from GitHub.

  • Ubuntu 16.04
  • ROS Lunar

Problem

In PyCharm Professional 2018.1.1, no completion for rospy was shown. The message said:

Cannot find reference 'init_node' in '__init__.py'

Screenshot of the error message

TL;DR

If $( rospack find rospy )/src exists, add it to PYTHONPATH.

Cause of the Problem

After sourcing setup.bash (and friends), PYTHONPATH points to /path/to/workspace/devel/lib/python2.7/dist-packages. Doing import rospy in the Python script uses the following __init__.py:

# -*- coding: utf-8 -*-
# generated from catkin/cmake/template/__init__.py.in
# keep symbol table as clean as possible by deleting all unnecessary symbols

from os import path as os_path
from sys import path as sys_path

from pkgutil import extend_path

__extended_path = "/home/naoki/ros/workspaces/lunar/hsas/src/ros_comm/clients/rospy/src".split(";")
for p in reversed(__extended_path):
    sys_path.insert(0, p)
    del p
del sys_path

__path__ = extend_path(__path__, __name__)
del extend_path

__execfiles = []
for p in __extended_path:
    src_init_file = os_path.join(p, __name__ + '.py')
    if os_path.isfile(src_init_file):
        __execfiles.append(src_init_file)
    else:
        src_init_file = os_path.join(p, __name__, '__init__.py')
        if os_path.isfile(src_init_file):
            __execfiles.append(src_init_file)
    del src_init_file
    del p
del os_path
del __extended_path

for __execfile in __execfiles:
    with open(__execfile, 'r') as __fh:
        exec(__fh.read())
    del __fh
    del __execfile
del __execfiles

The problem is that PyCharm expects __all__ to be populated in order for the completion to function correctly. That is done in /path/to/workspace/src/ros_comm/clients/rospy/src/rospy/__init__.py (i.e. $( rospack find rospy )/src/rospy).

Solution

Add $( rospack find rospy )/src to the front of PYTHONPATH if it exists. For rospy that’s installed with APT, there’s no src subdirectory (i.e. rospack find rospy gives you /opt/ros/DISTRO/share/rospy in which there is no src subdirectory).

if [[ -d $( rospack find rospy )/src ]]; then
    export PYTHONPATH="$( rospack find rospy )/src:$PYTHONPATH"
fi

After that if you start up PyCharm it should give you completion for rospy.

boost::asio::serial_port::read_someでEnd Of File Exceptionが出る際の対処法

boost::asio::serial_portread_some を使って
シリアルポートから読んだ際に,一瞬にしてEOF Exceptionが
投げられました.デバイスファイルのパスもボーレートも権限も
正しいはずなのになんでだろう??と思って調べたのでメモ.

what():  read_some: End of file

解決法1

stackoverflow.com/questions/45896414/boost-asio-serial-port-end-of-file

$ stty -F /dev/ttyUSB0 raw

解決法2

read_some の第2引数に boost::system::error_code を与えてやる.

auto port = boost::asio::serial_port{};
port.open("/dev/ttyUSB0");
port.set_option(boost::asio::serial_port_base::baud_rate(115200));
auto dest_ptr = get_dest_ptr();
auto dest_size = get_dest_size();
auto err_code = boost::system::error_code{};
port.read_some(boost::asio::buffer(&dest_ptr, dest_size), err_code);

ros_controlでControllerがロードできないときのためのメモ

ハマってめちゃくちゃ時間を無駄にして悔しかったので,メモ.

ロボットを定義するURDFのほうで,

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
    <robotNamespace>/hogehoge</robotNamespace>
  </plugin>
</gazebo>

としたとします.

ネームスペースに関して注意しないといけないことが二つ:

YAMLをロードするときのネームスペースに注意

/hogehoge/my_hoge_controller/type: position_controllers... のように,ロボット名のネームスペースに入れないといけません.

YAMLで言うと,

hogehoge:
  my_hoge_controller:
    type: position_controllers/JointTrajectoryController
    # (省略)

としないといけません.

controller_manager を起動する際のネームスペースに注意

<node ns="hogehoge" name="my_hoge_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn my_hoge_controller" />

のように,ノードを hogehoge (ロボット名)ネームスペースで起動しないといけません.これに気付かずにハマりました…

個別に指定するよりも,

<group ns="hogehoge" >
  <rosparam command="load" file="YAMLへのパス" />
  <node name="my_hoge_controller_spawner" pkg="controller_manager" ... />
</group>

というふうに <group> に入れるのがいいかもしれませんね.

StaticTransformBroadcasterで複数のTransformをbroadcastする

by NigoroJr 0 Comments

以前にもハマったことがある記憶があるので,メモ.

TF2にはStaticTransformBroadcasterというクラスがあり,TF2で追加された /tf_static というstatic transformをブロードキャストすることができます.使い方はこんな感じ:

import tf2_ros
from geometry_msgs.msg import TransformStamped

tf_sb = tf2_ros.StaticTransformBroadcaster()
tform = TransformStamped()
tform.header.frame_id = 'hoge'
# いろいろやる
tf_sb.sendTransform(tform)

ただ,一つのノードで複数のTransformをブロードキャストすると, rostopic echo /tf_static で最後の変換しか表示されません.

tf_sb.sendTransform(transform1)
tf_sb.sendTransform(transform2)
tf_sb.sendTransform(transform3)
# transform3しか使えない

どうやらStaticTransformBroadcasterは一つのTransformしか保持することができないらしいです.複数のTransformをブロードキャストしたいときは,まとめて送りましょう.

tforms = [transform1, transform2, transform3]
tf_sb.sendTransform(tforms)

ちなみにタプルを使うと Inbound TCP/IP connection failed: 'tuple' object has no attribute 'header' というエラーが出てダメな模様.リストを使いましょう.

複数クラスでStatic Transformを作るときは,結構めんどくさいです.TransformStampedを返すようにする等しないといけないみたいですね.

Ubuntu 16.04でBluetoothをONにできない際の対処法

by NigoroJr 0 Comments

何回か起こったので,メモ.

症状

unity-control-center の BluetoothでスライダをONにし,一旦メニューに戻ってからまたBluetoothに戻るとOFFになっている.つまり,BluetoothをONにできない.

Ubuntu 16.04で起こるっぽい?二つのマシンで同じ症状が確認された.以前はこのようなことはなかったのでアップデートした際に起こるようになってしまった模様.

環境

  • Ubuntu 16.04 (4.10.0-42-generic)
  • bluez 5.37-0ubuntu5.1

エラーメッセージ

$ sudo systemctl restart bluetooth.service
Job for bluetooth.service failed because the control process exited with error code. See "systemctl status bluetooth.service" and "journalctl -xe" for details.

というわけで,提案通り systemctl status bluetooth.servicejournalctl -xe の出力を見ましょう. journalctl -xe の出力は次の通り:

Feb 05 08:41:26 kyosen systemd[1]: Starting Bluetooth service...
-- Subject: Unit bluetooth.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit bluetooth.service has begun starting up.
Feb 05 08:41:26 kyosen systemd[12050]: bluetooth.service: Failed at step EXEC spawning /usr/lib/bluetooth/bluetoothd: Permission denied
-- Subject: Process /usr/lib/bluetooth/bluetoothd could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/lib/bluetooth/bluetoothd could not be executed and failed.
--
-- The error number returned by this process is 13.
Feb 05 08:41:26 kyosen systemd[1]: bluetooth.service: Main process exited, code=exited, status=203/EXEC
Feb 05 08:41:26 kyosen systemd[1]: Failed to start Bluetooth service.
-- Subject: Unit bluetooth.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit bluetooth.service has failed.
--
-- The result is failed.

Failed at step EXEC spawning /usr/lib/bluetooth/bluetoothd: Permission denied とありますね.

$ ls -l /usr/lib/bluetooth/bluetoothd
-rw-r--r-- 1 root root 1.1M Sep 12 11:04 /usr/lib/bluetooth/bluetoothd

あっ……

$ sudo chmod 755 /usr/lib/bluetooth/bluetoothd

で無事に sudo systemctl start bluetooth.service できるようになりました.

なぜこうなったかは謎.

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を再起動。