Ubuntu22.04上にHubmleがインストールされていることを前提とします。
下記コマンドでMoveit!2をインストールします。
sudo apt install ros-humble-moveit
これだけでOK。
ROS 2対応のUR5のリポジトリをダウンロードして動作確認をする。
下記コマンドでUR5のリポジトリをダウンロード。
cd ~/ros2_ws/src
git clone -b humble https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver.git
下記で依存パッケージダウンロード
rosdep update
rosdep install --ignore-src --from-paths . -y
下記コマンドでbuildする。
cd ~/ros2_ws/src
catkin build
buildが終わったら下記のコマンドでUR5のURDFを表示。
ros2 launch ur_moveit_config ur_moveit.launch.py ur_type:=ur5 use_sim_time:=True
下記写真のような画面が立ち上がる。
画面からROS1の時と同じように、手先の丸い球をドラッグして目的の姿勢を決めてから「Plan」のボタンを押すと現在位置からの軌道計画をしてくれます。「Execute」を押すと現在の位置から移動してくれると思いましたが。。。2024/5/13に試した時はロボットの位置は動きませんでした。エラー内容は下記。
[rviz2-2] [ERROR] [1715599558.317274458] [move_group_interface]: MoveGroupInterface::execute() failed or timeout reached
おそらく,時間をシミュレーション時間にしなくてはいけないので下記コマンドを実行。
export ROS_USE_SIM_TIME=true
あと、ntpが入っているとは思いますが、一応入れておく
sudo apt-get install ntp
sudo service ntp start
でも動かなかったので。。。おそらく実機か同じパッケージ内にあるros2_controlのfake_componentsの設定をすれば行けるかもしれないのと,もしくは,Dockerで立ち上げるGazeboのシミュレータを使わないとRobotStateが送信されなそうなので,とりあえず別の方法で試すことにする.(大学のネットワークのIP設定面倒なので...ルータの下で普通にPC使っている人であればDockerのシミュレータ立ち上げればすぐ動くかも.家で試したときに追記します.)
公式の最新のURのリポジトリだとよくわからないので,古いUR5のURDFファイルを取ってきてMoveit2に与えて逆運動学が解けるようにします.
ロボットのモデルを管理するパッケージを作る.今回は「ur5_description」という名前にします.
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake ur5_description
cd ur5_description
mkdir urdf
cd urdf
wget https://raw.githubusercontent.com/uwgraphics/RelaxedIK/master/urdfs/ur5.urdf
cd ..
mkdir rviz
cd rviz
gedit ur5.rviz #ファイルを編集
mkdir launch
cd launch
gedit view_robot.launch.py #ファイルを編集
wgetでリンク先のur5のurdfファイルをダウンロードしている.
ur5.rvizとview_robot.launch.pyは下記の内容を記述.
ur5.rviz
Panels:
- Class: rviz_common/Displays
Name: Displays
- Class: rviz_common/Views
Name: Views
Visualization Manager:
Displays:
- Class: rviz_default_plugins/Grid
Name: Grid
Value: true
- Alpha: 0.8
Class: rviz_default_plugins/RobotModel
Description Topic:
Value: /robot_description
Name: RobotModel
Value: true
- Class: rviz_default_plugins/TF
Name: TF
Value: true
Global Options:
Fixed Frame: base_link
Tools:
- Class: rviz_default_plugins/MoveCamera
Value: true
Views:
Current:
Class: rviz_default_plugins/Orbit
Distance: 1.7
Name: Current View
Pitch: 0.33
Value: Orbit (rviz)
Yaw: 5.5
Window Geometry:
Height: 800
Width: 1200
view_robot.launch.py
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
urdf_file_name = 'ur5.urdf'
urdf = os.path.join(
get_package_share_directory('ur5_description'),
'urdf',
urdf_file_name)
return LaunchDescription([
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='robot_state_publisher',
output='screen',
parameters=[{'robot_description': open(urdf).read()}]
)
])
ROS1のときはURDFファイルがworkspace配下の/srcの中にあるパッケージのプログラム中にlaunchファイルとかurdfがあればOKだったのですが,ROS 2では,workspace配下にあるinstallディレクトリにコピーしなくてはいけないので,CMakeLists.txtを編集します.
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(ur5_description)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
#追加
find_package(robot_state_publisher REQUIRED)
find_package(xacro REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
#追加
install(DIRECTORY
urdf
launch
rviz
DESTINATION share/${PROJECT_NAME}/
)
ament_package()
package.xmlも修正しておく
package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ur5_description</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="test@test.com">test</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
#追記
<build_depend>robot_state_publisher</build_depend>
<build_depend>xacro</build_depend>
<exec_depend>robot_state_publisher</exec_depend>
<exec_depend>xacro</exec_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
修正が終わったらビルドをする.
cd ~/ros2_ws
colcon build
source ~/.bashrc
ビルドが成功したら下記のようにlaunchファイルを立ち上げる
ros2 launch ur5_description view_robot.launch.py
下記のようにrviz上にUR5のモデルが表示される.
関節角の指定ができていないので正確に表示ができていない...
Moveit!に使いたいだけなので,とりあえずモデルがロードできることを確認できたので次に進む.(別のページで自作URDFファイルの表示のところで説明予定)
自分で作るのは面倒ということがわかったので,urdf_launchというパッケージがあるのでインストール
sudo apt install ros-humble-urdf-launch
インストールが終わったら,先ほど自分で用意したパッケージとurdfのある場所を下記のように入力するとrviz2で表示してくれる.joint_state_publisher_guiも使って関節を動かすことができる.
ros2 launch urdf_launch display.launch.py urdf_package:=ur5_description urdf_package_path:=urdf/ur5.urdf
「urdf_package:=」の後に自分のパッケージ名.(今回はur5_description)
「urdf_package_path:=」の後にurdfファイルまでのパッケージ内からの相対パスを書く.(今回はurdf/ur5.urdf)
上記コマンドを実行すると下記画面のようにrviz2上にur5の状態が表示され,別ウィンドウでjoint state publisherによる関節角の指示が可能になる.
コマンドラインではすぐ利用できるが,他のlaunchファイルからurdf_launchを利用することで,表示することも可能.
先程のur5_description/launchの中に新たに下記のようにlaunchファイルを生成して試してみる.
cd ~/ros2_ws/src/ur5_description/launch
gedit urdf_view_robot.launch.py
ファイルは下記のように記載して保存.
urdf_view_robot.launch.py
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.substitutions import PathJoinSubstitution
from launch_ros.substitutions import FindPackageShare
def generate_launch_description():
ld = LaunchDescription()
ld.add_action(IncludeLaunchDescription(
PathJoinSubstitution([FindPackageShare('urdf_launch'), 'launch', 'display.launch.py']),
launch_arguments={
'urdf_package': 'ur5_description', #ここでパッケージを記載
'urdf_package_path': PathJoinSubstitution(['urdf', 'ur5.urdf'])}.items() #ここでディレクトリとファイル名を指定
))
return ld
記載したら、ビルドしてから、記載したlaunchファイルを実行してみる。
cd ~ros2_ws && colcon build
source ./install/setup.bash
ros2 launch ur5_description urdf_view_robot.launch.py
実行すると、先ほどと同じようにrviz2とjoint state publisherが立ち上がった画面になるはず。
ここまでやってみてur_driverをインストールした時に依存関係で入っていると思われるur_descriptionを使えばできるのではないかと考えられるのでやってみる。
一応、ur_descriptionを入れておくときは下記。
sudo apt install ros-humble-ur-description
Universal_Robots_ROS2_Descriptionのソースはここ。
このソースが依存で入っているか、自分のワークディレクトリにコピーしてbuildしておけば、urdfディレクトリの下にあるur.macro.xacroを指定すればよい。
具体的には下記のようにlaunchファイルを記載すればOK.
ur5_view_robot.launch.py
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.substitutions import PathJoinSubstitution
from launch_ros.substitutions import FindPackageShare
def generate_launch_description():
ld = LaunchDescription()
ld.add_action(IncludeLaunchDescription(
PathJoinSubstitution([FindPackageShare('urdf_launch'), 'launch', 'display.launch.py']),
launch_arguments={
'urdf_package': 'ur_description', #ここでurdf_descriptionを記載
'urdf_package_path': PathJoinSubstitution(['urdf', 'ur_macro.xacro'])}.items() #ここでurdfディレクトリとファイル名ur_macro.xacroを指定
))
return ld
ur_macro.xacroでは、ur_typeを指定するとロボットの型をしていできるが、デフォルトではur5xになっている。
上記のlaunchではなぜかUR5が表示されない。
下記コマンドでmoveit2のSetup Assistantをインストール
sudo apt install ros-humble-moveit-setup-assistant
インストールが終わったら下記コマンドで立ち上げ
ros2 launch moveit_setup_assistant setup_assistant.launch.py
立ち上げると下記の画面が現れる。
自作したur5_descriptionパッケージのurdf/ur5.urdfを利用するために、「Create New Moveit Configuration Package」をクリック。
下記画面の「Browse」ボタンを押して、ur5.urdfファイルを指定した後に、右下の「Load Files」をクリック。
urdfファイルをロード後に、左メニューの2番目の「Self-Collisions」をクリック。
出てきた画面の「Generate Collision Matrix」をクリックすると下記のように画面に衝突判定のペアが自動的に生成される。
次に、左メニューの「Planning Groups」をクリックして下の画面が表示される。(Virtual Jointsはスキップ)
画面下の「Add Group」をクリックしてグループを追加するために下記の画面に移動する。
「Group Name」に好きなグループ名を記載。画面の例では"Single"と記載。
「Kinematic Solver」は「kdl_kinematics_plugin/KDLKinematicsPlugin」を選択。
「Kin.Search Resolution」は、デフォルトのまま0.005。もっと細かく調べるとか荒く調べるのであれば好みで修正。
「Kin.Search Timeout(sec)」も、デフォルトのまま0.005。タイムアウト時間を調整したければ修正。単位は秒。
「Group Default Planner」は、「RRT」を選択。もっといいのがあるかもしれないのでお好みで選択してください。
次に画面中の、Next, Add Components To Group:の下にあるRecommendedの2つを設定する。
まず、「Add Kin.Chain」をクリックして下の画面に移動。
基準となるリンク"base_link"を選択してから、下にある「Base Link」の右にある"Choose Selected"ボタンを押す。
次に動かす先端のリンク"wrist_3_link"を選択してから、下にあるTop Linkの右にある"Choose Selected"ボタンを押す。
最後に下にある「Save」ボタンを押して下の画面に移動。
次に、「Joints」を選択してから、下にある「Edit Selected」をクリックして下記の画面に移動。
ctlを押しながら6つの関節角(sholder_pan_joint, sholder_lift_joint, elbow_joint, wrist_1_joint, wrist_2_joint, wrist_3_joint)を選択していって、真ん中にある「>」のアイコンをクリックして、右の「Selected Joints」に追加する。終わったら下にある「Save」ボタンを押して下記の画面に移動。
次に、「Links」を選択してから下にある「Edit Selected」をクリックして次の画面に移動。
base_linkから連なる7つのリンクを選択してから中央にある「>」ボタンを押して右側の「Selected Links」に追加。
終わったら下にある「Save」ボタンを押して次の画面に移動。
「Planning Groups」での編集は終わったので、左メニューの「Robot Poses」をクリックして次の画面に移動。
右下にある「Add Pose」をクリックして下の画面に移動
Pose Nameに好きな名前を記載.上記画面の例では「init」という名前の初期姿勢を用意.角度はすべてゼロにしてある.
Planning Groupは事前に作成してあるGroupがトグルで選択できるようになっている.
今回は「single」しか作ってないのでsingleを選択.
登録するときは右下にある「Save」を押して保存すると下の画面に移動する.
他の姿勢も追加したいときは更に「Add Pose」を押して追加する.
Robot Posesの下にあるEnd EffectorsとPassive Jointsは今回用意しないのでスキップ.
下記画面のように右メニューの「ros2_control URDF Modifications」をクリックする.
この画面では,Command InterfacesとState Interfacesで利用するパラメータにチェックを入れて真ん中にある「Add interfaces」を押せば中央下のウィンドウにURDFに書き込まれるros2_control用のインタフェースが追記される.
デフォルトではCommand Interfacesはposition,State Inerfacesはpositionとvelocityにチェックマークが入っている.
次に,左メニューから「ROS 2 Contorollers」を選択して下記画面へ移動.
上記画面内の「Auto Add Joint Trajectory Controller Controllers For Each Planning Group」をクリックすると下記の様に自動的に「single_controller」がjoint_trajecotory_controller型で追加される.
次に,左メニューから「MoveIt Controllers」をクリックして下記画面に移動.
ROS 2 Controllersと同じように「Auto Add FollowJointsTrajectory Controllers For Each Planning Group」をクリックすると下記画面のようにsigle_controllerがFollowJointTrajectory型で追加される.
次に,右メニューの「Perception」は3次元センサを取り付けるときにセットアップするので,今回はスキップ.
「Lunch Files」はデフォルトで全てチェックが入った状態で生成すればよいのでスキップ.
「Author Information」を押して,下記の画面に移動.
上記画面で,名前とメールアドレスを記載しておく.
最後に,左メニューの「Configuration Files」をクリックして下の画面へ移動.
Configuration Packages Save Pathに自分のソース・ファイルを保存してあるディレクトリとその下に保存するパッケージ名を記載する.
今回の例では,「home/takubo(ユーザ名)/ros2_ws/src/ur5_moveit_config」としている.
生成するファイルは全て生成すればよいのでデフォルトのまま全てチェックマークが入った状態で,右下にある「Generate Package」をクリック.
一つ前の画面で,メールアドレスが記載されていないと下記のエラーが出る.「No end effectors have been added」はハンドを追加していないので無視.No virtual joints have been added」もバーチャルジョイントをつけていないので無視.
もし,一回セットアップしたものを修正して上書きするときは下記の画面が出るので「OK」を押して上書きする.
下記画面のように「Generate Package」の左側が100%の表示になったら生成完了.
その下の「Exit Setup Assistant」をクリックして,セットアップアシスタントを終了.
生成したMoveitのノードの動作確認をする.
demo.launch.pyを下記のように使う.
ros2 launch ur5_moveit_config demo.launch.py
コマンドを打つと,下記の画面が立ち上がる.
画面右にあるマニピュレータ先端の丸い玉をドラッグすることで,手先の位置を任意の場所に移動させることができる.
下記画面が,移動させた後の状態.
上記の状態で,左画面中央の左側にある,「Plan & Execute」をクリックするとドラッグした腕の姿勢まで移動する計画と移動の実行が行われる.別々に実行したいときは「Plan」を押してから「Execute」を押す.
以上で動作確認終了.