🤖

【OpenRR】RustでRobot!#04 「Ufactory Lite6」

2022/11/04に公開約8,400字

https://github.com/openrr/openrr


4-1. はじめに

こんにちは、Smile Roboticsの内山です。UfactoryのLite6というロボットを動かしてみます。

4-1-1. Lite6とは

Lite6は、中国の深センにあるUfactory社のロボットアームです。

GitHubの公式のリポジトリ

4-1-2. ロボットのセットアップ

Quick start guideにしたがって、根本の筐体に記してあるIPアドレスについて、ブラウザからアクセスします。

http://192.168.1.xxx:18333/

lite6 browser

手元にあるロボットアームは正常そうということが確認できました。

4-1-3. ROSまわりのセットアップ

今回はROSを使います。

公式のリポジトリにしたがってセットアップします。

ROSを有効にしたあとに、

mkdir -p ~/xarm_ws/src
cd ~/xarm_ws/src
git clone https://github.com/xArm-Developer/xarm_ros
cd xarm-ros
git pull
git submodule sync
git submodule update --init --remote
rosdep update
rosdep install --from-paths . --ignore-src --rosdistro noetic -y
cd ~xarm_ws
catkin_make

を実行します。これでセットアップは完了です。

Lite6用のREADMEにしたがえば、一応これでROSからロボットアームを動かすことができます。

今回はさらにOpenRRを用いて動かしたいので、もう少し準備が必要です。

4-1-4. OpenRRのセットアップ

OpenRRをGitHubからクローンし、ビルド、インストールをします。ROSを使うのでビルドする際にfeatureでROSを指定します。

git clone https://github.com/openrr/openrr
cd openrr
cargo build --release --feature ros
cargo install --path openrr-apps

4-2. openrr_apps_robot_teleopで動かす

4-2-1. urdf-vizでシミュレートする

urdf-viz $(rospack find xarm_description)/urdf/lite6_robot.urdf.xacro &
openrr_apps_joint_position_sender

これを実行すると、いくつかのスライドバーがあるウィンドウが現れます。

urdf-vizに表示し、openrr_apps_joint_position_senderで動かすにはurdfファイルのみで十分です。コントローラーなどを用いて動かしたい場合やコマンドを割り当てたい場合にはtomlファイルを用意する必要があります。

特定の姿勢に名前をつけておき、実行することも可能です。今回は、Lite6の公式のソフトウェアにもある初期姿勢をinitial_poseとして登録します。

[[urdf_viz_clients_configs]]
name = "lite6"
joint_names = ["joint1", "joint2", "joint3", "joint4", "joint5", "joint6"]
wrap_with_joint_position_limiter = true

[openrr_clients_config]
urdf_path = "$(rospack find xarm_description)/urdf/lite6_robot.urdf.xacro"
self_collision_check_pairs = ["joint1:joint4"]

[[openrr_clients_config.ik_clients_configs]]
name = "arm_ik"
client_name = "arm_collision_checked"
solver_name = "arm_ik_solver"

[openrr_clients_config.ik_solvers_configs.arm_ik_solver]
ik_target = "joint_eef"

[[openrr_clients_config.collision_check_clients_configs]]
name = "arm_collision_checked"
client_name = "lite6"

[[openrr_clients_config.joints_poses]]
pose_name = "zero"
client_name = "arm_collision_checked"
positions = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

[[openrr_clients_config.joints_poses]]
pose_name = "initial_pose"
client_name = "arm_collision_checked"
positions = [0.0, 0.35, 1.11, 0.0, 0.76, 0.0]

以下は、openrr_apps_robot_teleopの設定です。

robot_config_path = "robot_client_config_for_urdf_viz.toml"

[control_nodes_config]

[control_nodes_config.joints_pose_sender_config]

[[control_nodes_config.ik_node_teleop_configs]]
solver_name = "arm_ik_solver"
joint_trajectory_client_name = "lite6"

[control_nodes_config.ik_node_teleop_configs.config]
mode = "i k"

[[control_nodes_config.joy_joint_teleop_configs]]
client_name = "arm_collision_checked"

[control_nodes_config.joy_joint_teleop_configs.config]
mode = "lite6"

コントローラをパソコンにつないだ上で以下を実行します。

urdf-viz $(rospack find xarm_description)/urdf/lite6_robot.urdf.xacro &
openrr_apps_robot_teleop --config-path config/teleop_config_for_urdf_viz.toml

これでコントローラーで画面上のロボットアームを操作することができます。

操作方法については、openrr-teleopjoint_pose_senderモードの箇所にある通りですが、コントローラーによっては割り当てが違う場合があります。

4-2-2. ROSで実機を動かす

ROSを用いてトピックを配信、購読する場合もurdf-vizのときとおおよそ同様ですが、controller_namestate_topic_nameにトピック名を指定する必要があります。

[[ros_clients_configs]]
name = "lite6"
joint_names = ["joint1", "joint2", "joint3", "joint4", "joint5", "joint6"]
complete_allowable_errors = [0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
controller_name = "/ufactory/lite6_traj_controller"
state_topic_name = "/ufactory/lite6_traj_controller/state"

[openrr_clients_config]
urdf_path = "$(rospack find xarm_description)/urdf/lite6_robot.urdf.xacro"
self_collision_check_pairs = ["joint1:joint4"]

[[openrr_clients_config.ik_clients_configs]]
name = "arm_ik"
client_name = "arm_collision_checked"
solver_name = "arm_ik_solver"

[openrr_clients_config.ik_solvers_configs.arm_ik_solver]
ik_target = "joint_eef"

[[openrr_clients_config.collision_check_clients_configs]]
name = "arm_collision_checked"
client_name = "lite6"

[[openrr_clients_config.joints_poses]]
pose_name = "zero"
client_name = "arm_collision_checked"
positions = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

[[openrr_clients_config.joints_poses]]
pose_name = "initial_pose"
client_name = "arm_collision_checked"
positions = [0.0, 0.17, 0.56, 0.0, 0.38, 0.0]
teleop_config_for_ros.toml
robot_config_path = "robot_client_config_for_ros.toml"

[control_nodes_config]

[control_nodes_config.joints_pose_sender_config]

[[control_nodes_config.ik_node_teleop_configs]]
solver_name = "arm_ik_solver"
joint_trajectory_client_name = "lite6"

[control_nodes_config.ik_node_teleop_configs.config]
mode = "i k"

[[control_nodes_config.joy_joint_teleop_configs]]
client_name = "arm_collision_checked"

[control_nodes_config.joy_joint_teleop_configs.config]
mode = "lite6"

この2つのファイルを用意したら、ROSを有効にした上で以下の2つを実行します。

roslaunch lite6_moveit_config realMove_exec.launch robot_ip:=192.168.1.xxx
openrr_apps_robot_teleop --config-path ./config/teleop_config_for_ros.toml

今度はurdf-vizではなく実機のロボットアームが動きます。

ちなみにgazebo上で動かすこともできます。以下のように実機がない場合でもOpenRRを用いて動かすことができます。

roslaunch xarm_gazebo lite6_beside_table.launch
openrr_apps_robot_teleop --config-path ./config/teleop_config_for_ros.toml

gazebo

4-2-3. openrr-teleopの機能を使う

このままでもいいのですが、現状だと緊急停止ボタンを押し、解除したあとに再びコントローラーで操作できません。復帰するためのコマンドを割り当てたいと思います。

ExampleのREADMEをみると、初期化のコマンドは

rosservice call /xarm/motion_ctrl 8 1
rosservice call /xarm/set_mode 1
rosservice call /xarm/set_state 0

のようなので、openrr-teleopからもこのコマンドを実行できるようにします。Lite6のトピックは/xarm/fooではなく、/ufactory/fooですから、置換した上で以下のようなテキストファイルを作成します。ファイル名はenable_servo.txtにしました。

openrr_apps_robot_commands execute_command -- rosservice call /ufactory/motion_ctrl 8 1

openrr_apps_robot_commands execute_command -- rosservice call /ufactory/set_mode 1

openrr_apps_robot_commands execute_command -- rosservice call /ufactory/set_state 0

openrr_apps_robot_command speak Default "Initialization completed!"

また、起動させるためのコマンドを用意したので、停止させるものも追加します。

openrr_apps_robot_commands execute_command -- rosservice call /ufactory/motion_ctrl 8 0

これをstop_servo.txtとして保存します。

さきほどのteleop_config_for_ros.tomlに項目を足して以下のようにします。

robot_config_path = "robot_client_config_for_ros.toml"

[control_nodes_config]

[control_nodes_config.joints_pose_sender_config]

[[control_nodes_config.joy_joint_teleop_configs]]
client_name = "arm_collision_checked"

[control_nodes_config.joy_joint_teleop_configs.config]
mode = "lite6 "

[[control_nodes_config.command_configs]]
name = "stop servo"
file_path = "../command/stop_servo.txt"

[[control_nodes_config.command_configs]]
name = "enable servo"
file_path = "../command/enable_servo.txt"
PrintSpeaker: lite6 0
PrintSpeaker: pose arm_collision_checked zero
PrintSpeaker: commandstop servo
PrintSpeaker: command enable servo
PrintSpeaker: lite6 0
PrintSpeaker: lite6 1
PrintSpeaker: lite6 2
PrintSpeaker: lite6 3
PrintSpeaker: lite6 4
PrintSpeaker: lite6 5
PrintSpeaker: lite6 0
PrintSpeaker: pose arm_collision_checked zero
PrintSpeaker: pose arm_collision_checked initial_pose
PrintSpeaker: pose arm_collision_checked zero
PrintSpeaker: commandstop servo
PrintSpeaker: command enable servo
PrintSpeaker: command stop servo

これで緊急停止ボタンを押して、安全が確認された後でもコントローラーから初期化をして復帰させることができるようになりました。

moveit

4−3. 結び

OpenRRを用いてロボットアームを動かすことができました。

今回作成したものは、GitHubのリポジトリにあります。

更新歴

2022-11-01 完成

Discussion

ログインするとコメントできます