パラメータ

ROSではパラメータというものを設定することが出来ます。 これはプログラムを実行する前に値を任意に変更することが出来て、ソースコードを変えることなく値を自由に変えられます。

今回の目標

今回は以下のようなノードをもつhello_paramパッケージを作ってみましょう

  • multiply_node.py

    • std_msgs/Uint64型の/numberトピックからサブスクライブした数をm_numberパラメータの値を掛けて/multiplied_numberトピックにパブリッシュする

    • m_numberパラメータはデフォルトでint型の2

パッケージの作成

ros2 pkg create --build-type ament_python hello_param

multiply_node.pyのコード

hello_param/multiply_node.pyを以下の内容で書き込む。

import rclpy
from rclpy.node import Node
from std_msgs.msg import UInt64

class Multiply(Node):
    def __init__(self):
        super().__init__("multiply_node")
        self.number_sub = self.create_subscription(UInt64, "number", self.number_callback, 10)
        self.double_number_pub = self.create_publisher(UInt64, "multiplied_number", 10)
        self.declare_parameter("m_number", 2)
        self.m = self.get_parameter("m_number").get_parameter_value().integer_value

    def number_callback(self, sub_msg):
        self.get_logger().info("Subscribed {}".format(sub_msg.data))

        pub_msg = UInt64()
        pub_msg.data = sub_msg.data * self.m
        self.double_number_pub.publish(pub_msg)
        self.get_logger().info("Publishing {}".format(pub_msg.data))

def main(args=None):
    rclpy.init(args=args)

    node = Multiply()
    rclpy.spin(node)

    node.destroy_node()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

setup.pyの編集

from setuptools import find_packages, setup

package_name = 'hello_param'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['test']),
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='ri-one',
    maintainer_email='ri-one@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            # この1行を追加
            'multiply_node = hello_param.multiply_node:main',
        ],
    },
)

ビルドと実行

cd ~/my_ws
colcon build --symlink-install
source install/setup.bash
ros2 run hello_topic iteration_node
ros2 run hello_param multiply_node

次に作ったm_numberパラメータを3に変更してノードを実行してみましょう。

ros2 run hello_topic iteration_node
ros2 run hello_param multiply_node --ros-args -p m_number:=3

multiply_node/numberトピックの3倍した数をmultiplied_numberトピックにパブリッシュしていれば成功!

../_images/parameter-terminal-output.png

端末での実行画面

参照