AIロボット入門:第6章マニピュレーション simple_arm

拙著(以下,教科書と表記)「ROS2とPythonで作って学ぶAIロボット入門」(講談社)を授業で使用したときの補足資料です.

6章マニピュレーションの補足サンプル.教科書では,P192のsimple_armをGUIで動かしていましたが,それをプログラムで動かすサンプルです.

参考サイト

コード

import rclpy
from rclpy.node import Node
from rclpy.duration import Duration
from sensor_msgs.msg import JointState
import time
import threading


# Simple arm用のクラス
class Commander(Node):
    def __init__(self):
        super().__init__('commander')
        # パブリッシャの生成
        self.publisher_joint = self.create_publisher(JointState, 'joint_states', 10)
        
    def publish_joint(self, joint_name, q):
        msg = JointState()
        msg.header.stamp = self.get_clock().now().to_msg()
        msg.name = [joint_name]  # nameはリストでないとだめなので[]を付けている
        msg.position = [q]       # positionもリスト
        self.publisher_joint.publish(msg)
        self.get_logger().info('Publishing: "%s"' % msg)
    


def main(args=None):
    rclpy.init(args=args) # 初期化
    commander = Commander() #  ノードの作成

    # 別のスレッドでrclpy.spin()を呼び出す
    thread = threading.Thread(
        target=rclpy.spin, args=(commander, ), daemon=True)
    thread.start()

    time.sleep(1.0) # 1秒待つ

    # 目標角度の設定
    target_joint1 = 0.0
    target_joint2 = 0.0

    commander.publish_joint('joint1',target_joint1)
    commander.publish_joint('joint2',target_joint2)

    print('Move: Input 1, 2, 3, 4 key')
    print('Space: Initial position')
    print('Esc: Quit')

    try:
        while rclpy.ok():
            c = input()

            # 押されたキーによって場合分けして処理
            if c == '1':
                target_joint1 -= 0.1
            elif c == '2':
                target_joint1 += 0.1
            elif c == '3':
                target_joint2 -= 0.1
            elif c == '4':
                target_joint2 += 0.1
            elif c == ' ':  # Space key
                target_joint1 = 0.0
                target_joint2 = 0.0
            elif ord(c) == 27:  # Escape key
                break

            commander.publish_joint('joint1',target_joint1)
            commander.publish_joint('joint2',target_joint2)
         
            print("joint1",target_joint1,"joint2",target_joint2)
            time.sleep(0.01)
            
    except KeyboardInterrupt: # Ctrol-cでエラーにならないように
        pass

    rclpy.shutdown()
    thread.join() # スレッドが終了するまで待つ
    print('End')

 

ハンズオン

  • AIロボット入門のDockerイメージを使うことが前提
  • パッケージの作成
    • パッケージの作り方を思い出して(教科書第2章),simple_armパッケージとsimple_armノードを作成する.
  • コードの作成
    • 上のソースコードをコピペして以下のファイルを作成する.
      • ~/happy_ws/src/simple_arm/simple_arm/simple_arm.py
  • ビルド
    • $ cd ~/happy_ws
    • $ colcon build
  •  実行
    • RVizの起動
      • 次のコマンドを実行するとRViz(上図右)とJoint State Publisher(上図左)が起動する.
        • $ ros2 launch simple_arm_description display.launch.py
    • simple_armノードの起動
      • $ source ~/happy_ws/install/setup.bash
      • $ ros2 run simple_arm simple_arm
  • 遊び方
      • Joint State Publisherウインドウ右上の×印を押して,Joint State Publisherを終了させる.これをしないとsimple_armノードが動かない.
      • simple_armノードを起動した端末で次のキーを入力してEnterキーを押すとロボットが動く.
        • 1:関節角1を0.2[rad]を減少させる
        • 2:関節角1を0.2[rad]を増加させる
        • 3:関節角2を0.2[rad]を減少させる
        • 4:関節角2を0.2[rad]を増加させる
        • Spaceキー:初期姿勢に戻る

ホームワーク

  • このサンプルコードは,キーを入力してからEnterキーを押さないとロボットアームが動ない.これをキーを入力すると直ちにロボットアームが動くように改良しよう!ヒントは以下のプログラム.
  • 運動学,逆運動学を計算するメソッドをそれぞれ作り,それが正しいことを示すプログラムを作ろう!

 

終わり

 

コメント

タイトルとURLをコピーしました