[ROS2] ワークスペースおよびパッケージ作成

ワークスペースを新規に作成し、その中にパッケージを作り、Pythonで簡単なプログラムを作る。

ワークスペースを作る

パッケージを作る

●パッケージを作成する
 –node-nameパラメータで指定したpythonスクリプトの雛形が自動で作られる。

cd ~/my_ros2_ws/src
ros2 pkg create --build-type ament_python --node-name <ノード名>  <パッケージ名>   # 記述方法
ros2 pkg create --build-type ament_python --node-name basic_publisher_node pub_sub

プログラムを作る

●プログラムを格納するディレクトリに移動し、そこにソースコードをコピーする。

cd ~/my_ros2_ws/src/pub_sub/pub_sub
publisher_basic_node.py
"""
パブリッシャーの基本
「ROS2とPythonで作って学ぶAIロボット入門」p55
"""
import rclpy # ROS2のPythonモジュール
from rclpy.node import Node # rclpy.nodeモジュールからNodeクラスをインポート
from std_msgs.msg import String # std_msgs.msgモジュールからStringクラスをインポート
class HappyPublisher(Node): # "Happy World"とパブリッシュ並びに表示するクラス
def init(self): # コンストラクタ
super().init('happy_publisher_node')
self.pub = self.create_publisher(String, 'topic', 10) # パブリッシャの生成
self.timer = self.create_timer(1, self.timer_callback) # タイマーの生成
self.i = 10
def timer_callback(self):  # コールバック関数
    msg = String()
    if self.i > 0:
        msg.data = f'ハッピーワールド{self.i}'
    else:
        msg.data = f"終わり"
        self.destroy_timer(self.timer)
    self.pub.publish(msg)
    self.get_logger().info(f'パブリッシュ: {msg.data}')
    self.i -= 1
def main(args=None): # main関数
rclpy.init()
node = HappyPublisher()
try:
rclpy.spin(node)
except KeyboardInterrupt:
print('Ctrl+Cが押されました.')
finally:
node.destroy_node()
rclpy.shutdown()
subscriber_basic_node.py
サブスクライバーの基本
「ROS2とPythonで作って学ぶAIロボット入門」p57
"""
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
Sring型メッセージをサブスクライブして端末に表示するだけの簡単なクラス
class HappySubscriber(Node):
def init(self): # コンストラクタ
super().init('happy_subscriber_node')
# サブスクライバの生成
self.sub = self.create_subscription(String, 'topic', self.callback, 10)
def callback(self, msg):  # コールバック関数
    self.get_logger().info(f'サブスクライブ: {msg.data}')
def main(args=None): # main¢p
rclpy.init()
node = HappySubscriber()
try:
rclpy.spin(node)
except KeyboardInterrupt:
print('Ctrl+Cが押されました.')
finally:
rclpy.shutdown()

●setup.pyを修正する。
 パッケージを新規に作成後、追加したPythonスクリプトをsetup.pyにも追加する、最後の行の’,’を忘れないようにする。

●パッケージをビルドする

cd ~/my_ros2_ws
colcon build --symlink-install --packages-select pub_sub

–symlink-install を指定すると、ソース コードを変更しても再度コンパイルする必要はない (Python のみ、C++ にはない)。

●オーバーレイ設定ファイルを反映する —- (パッケージ作成後に一度だけ)
 オーバーレイ設定ファイルの反映を~/.bashrcに設定する。

echo "source ~/<ワークスペース名>/install/setup.bash" >> ~/.bashrc   # 記述方法
echo "source ~/my_ros2_ws/install/setup.bash" >> ~/.bashrc

.bashrcを反映するためにターミナルを閉じて、新規にターミナルを開く。

プログラムを実行する

●ターミナルを2つ開き、それぞれ次のコマンドを入力する。

ros2 run pub_sub basic_subscriber_node

ros2 run pub_sub basic_publisher_node

サブスクライブされない場合は、別のターミナルからコマンドを入力する

ros2 topic list

参考サイト

第1回 ROSとは?基本的概念とROS2が必要になった背景
第2回 ROSとROS2のプログラミング概念