2018年7月3日 星期二

ROS 2 create node - python subscriber

因為在ROS 2 python 程式的建立方式跟以往很不同,所以紀錄ROS 2 ardent 版本下
如何建立python 程式
python 程式可以加速POC,例如用python 的繪圖


ROS 2 的python package 無法跟c++的放同一個
建立package
cd ~/ros2_ws/src
mkdir karl_demo_py
cd karl_demo_py
建立subscriber 程式
import rclpy
import matplotlib.pyplot as plt
from karl_demo.msg import Custom
g_node = None
def callback(msg):
    plt.clf()
    plt.plot(msg.data)
    plt.draw()
    plt.pause(0.001)
def main(args=None)
    global g_node
     
    rclpy.init(args=args)
    g_node = rclpy.create_node('listener')
     
    sub = g_node.create_subscription(Custom, 'test', callback)
    sub # prevent unused variable warning
    while rclpy.ok():
        rclpy.spin_once(g_node)
    g_node.destroy_node()
    rclpy.shutdown()
if __name__ == '__main__':
    plt.ion()
    plt.show()
    main()

編輯package.xml 、setup.py 及setup.cfg
沒有這些檔案的話,python 檔案無法link 到ROS 2
setup.cfg 則是幫助把檔案放到worspace/lib/karl_demo_py 內,這樣ROS 2 指令才會找到這個檔案才能執行
cd ~/ros2_ws/src/karl_demo_py
vim package.xml
vim setup.py
vim setup.cfg

package.xml
<?xml version="1.0"?>
<package format="2">
  <name>examples_rclpy_minimal_subscriber</name>
  <version>0.4.0</version>
  <description>Examples of minimal subscribers using rclpy.</description>
  <maintainer email="mikael@osrfoundation.org">Mikael Arguedas</maintainer>
  <license>Apache License 2.0</license>
  <exec_depend>rclpy</exec_depend>
  <exec_depend>karl_demo</exec_depend>
  <export>
    <build_type>ament_python</build_type>
  </export>
</package>

以下註解的地方,是可以省略的部分
Setup.py
from setuptools import setup
package_name = 'karl_demo_py'
setup(
    name=package_name,
    packages=[],
    py_modules=['listener',],
    install_requires=['setuptools'],
    #author='Mikael Arguedas',
    #author_email='mikael@osrfoundation.org',
    #maintainer='Mikael Arguedas',
    #maintainer_email='mikael@osrfoundation.org',
    #keywords=['ROS'],
    #classifiers=[
    #    'Intended Audience :: Developers',
    #    'License :: OSI Approved :: Apache Software License',
    #    'Programming Language :: Python',
    #    'Topic :: Software Development',
    #],
    #description='Examples of minimal subscribers using rclpy.',
    #license='Apache License, Version 2.0',
    #tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'subscriber_old_school = subscriber_old_school:main',
            'subscriber_lambda = subscriber_lambda:main',
            'subscriber_member_function = subscriber_member_function:main',
        ],
    },
)

Setup.cfg
[develop]
script-dir=$base/lib/karl_demo_py
[install]
script-dir=$base/lib/karl_demo_py
最後執行前,記得安裝python 套件 
在ROS ,matplotlib 有裝在ROS 的目錄內,所以可以直接用
但在ROS 2 沒有
sudo apt-get install python3-matplotlib
cd ~/ros2_ws
source install/setup.bash
ros2 run karl_demo_py listener.py

沒有留言:

張貼留言

NoSQL Redis intro

Redis是一個使用ANSI C編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫。 支援rdb 及aof 兩種儲存方式 From  https://zh.wikipedia.org/wiki/Redis Redis 目前擁有兩種資料...