Introduction

Supported Platforms

OSCoreGUIROSROS2
Linux (Ubuntu)
MacOS
Windows

LinuxとしてUbuntuがサポートされています。MacOSやWindowsであってもおおよその機能は利用できます。

LinuxやMacOSを使用している場合でも、ROSをインストールせずに使用することができます。

Installation for Rust

もしRustを利用したことがなければ、こちらからRustのインストールをしてください。

Installation for latest OpenRR

GitHubからOpenRRをクローンします。

git clone https://github.com/openrr/openrr

Installation for dependency

依存関係のソフトウェアをインストールします。

sudo apt install cmake build-essential libudev-dev xorg-dev libglu1-mesa-dev libasound2-dev libxkbcommon-dev

[Optional] Installation for ROS

arci-ros

arci-ros2

Using OpenRR Apps

  1. Installation
  2. Operating robot from GUI
  3. Operating robot from CLI
  4. Robot teleoperation
  5. Operating mobile robot with ROS2 and openrr-teleop
  6. Operating robot arm with ROS/ROS2 and openrr-teleop

Installation

openrr-appsによってロボットの操作ができます。Rustによって実装されたOpenRRを用いたアプリケーションの一例です。

urdf-viz

urdf-viz is a URDF visualization application.

実際にはurdf-vizはOpenRRの機能ではありませんが、この章ではよく用いるため合わせてインストールします。

cargo install urdf-viz

openrr-apps

openrr-appsは、GUIやコントローラなどから操作するためのアプリケーションです。コマンドやROSのトピックを介した操作、実機やurdf-viz上、gazebo上に関わらず同じように操作できます。

git clone https://github.com/openrr/openrr
cd openrr

LinuxやMacOSユーザーの方はこちら。

cargo install --path openrr-apps

Windowsユーザーの方はこちら。

cargo install --path openrr-apps --no-default-features --features gui,assimp

Operating robot from GUI

Move the robot arm

もしOpenRRをクローンしていなければ以下を実行してください。

git clone https://github.com:openrr/openrr
cd openrr

サンプルのロボットアームを表示させます。

urdf-viz ./openrr-planner/sample.urdf &

sample_robot_arm

openrr_apps_joint_position_sender

openrr_apps_joint_position_sender \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml

スライドバーを動かすことで、関節角を変更することができます。

joint_pose_sender

Move the mobile robot

urdf-viz ./openrr-planner/sample.urdf &

openrr_apps_velocity_sender

openrr_apps_velocity_sender \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml

スライドバーを動かすことで、ロボットの速度と角速度を変更することができます。

velocity_sender

Operating robot from CLI

Move the robot arm

From the command text file

もしOpenRRをクローンしていなければ以下を実行してください。

git clone https://github.com:openrr/openrr
cd openrr

サンプルのロボットアームを表示してみましょう。

urdf-viz ./openrr-planner/sample.urdf &

sample_robot_arm

load_commandsをtxtファイルに記したコマンドを実行するのに用いることができます。以下のコマンドを実行してみましょう。

openrr_apps_robot_command \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
    load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

最後に以下のように出力されれば成功です。

PrintSpeaker: "This is sample robot"

From your command line

load_commandsを用いずに直接コマンドを書くことでも実行できます。試しにロボットアームの状態を取得してみましょう。

openrr_apps_robot_command \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
    get_state l_arm

以下のように出力されるでしょう。

Joint names : ["l_shoulder_yaw", "l_shoulder_pitch", "l_shoulder_roll", "l_elbow_pitch", "l_wrist_yaw", "l_wrist_pitch"]
Joint positions : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

関節角を送信してみます。

openrr_apps_robot_command \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
    send_joints l_arm -j 0=1.2 -j 1=-1.2 -j 2=0.0 -j 3=1.2 -j 4=0.0 -j 5=0.0

ロボットアームが動きましたね。

Robot client config file

これは単一ロボットアーム用のconfig fileの例です。シミュレータであっても実機であってもこのように記しておくことでOpenRRから操作ができます。

ただし、urdf-vizの項目である、[urdf_viz_clients_configs]だけROSやそれに類するもののために変更する必要があります。

[[urdf_viz_clients_configs]]
name = "arm"
joint_names = [
    "shoulder_yaw",
    "shoulder_pitch",
    "shoulder_roll",
    "elbow_pitch",
    "wrist_yaw",
    "wrist_pitch",
]
wrap_with_joint_position_limiter = true
# If joint_position_limits is not specified, limits will be got from URDF.
# The following values are the same as if getting limits from URDF.
joint_position_limits = [
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 1.5 },
    { lower = -1.5, upper = 2.0 },
    { lower = -2.0, upper = 1.5 },
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 2.0 },
]

[openrr_clients_config]
urdf_path = "{path_to_urdf}/sample.urdf"
self_collision_check_pairs = ["shoulder_yaw:gripper_linear1"]

# Client config for left arm
[[openrr_clients_config.collision_check_clients_configs]]
name = "arm_collision_checked"
client_name = "arm"

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

[[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.ik_solvers_configs.l_arm_ik_solver]
ik_target = "tool_fixed"

Note

See also reference of openrr_apps_robot_command

Robot teleoperation

openrr-teleopを用いる場合はconfig fileを新たに作る必要があります。

Move the robot arm and mobile robot

urdf-viz ./openrr-planner/sample.urdf &
openrr_apps_robot_teleop --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml

baseモードではロボットが移動します。ロボットアームは動きません。

このsample fileでは、move_base_modeが記されています。これは移動ロボットとしての挙動を設定するものです。

Teleop config

Client config file

このファイルは"Operating robot from CLI"のものと同じです。

[[urdf_viz_clients_configs]]
name = "arm"
joint_names = [
    "shoulder_yaw",
    "shoulder_pitch",
    "shoulder_roll",
    "elbow_pitch",
    "wrist_yaw",
    "wrist_pitch",
]
wrap_with_joint_position_limiter = true
# If joint_position_limits is not specified, limits will be got from URDF.
# The following values are the same as if getting limits from URDF.
joint_position_limits = [
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 1.5 },
    { lower = -1.5, upper = 2.0 },
    { lower = -2.0, upper = 1.5 },
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 2.0 },
]

[openrr_clients_config]
urdf_path = "{path_to_urdf}/sample.urdf"
self_collision_check_pairs = ["shoulder_yaw:gripper_linear1"]

# Client config for left arm
[[openrr_clients_config.collision_check_clients_configs]]
name = "arm_collision_checked"
client_name = "arm"

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

[[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.ik_solvers_configs.arm_ik_solver]
ik_target = "tool_fixed"

Teleop config file

以下のようにしてteleop fileを作成します。1行目のようにしてclient config fileを対応させる必要があります。

robot_config_path = "sample_robot_client_config_for_urdf_viz.toml"

[control_nodes_config]
move_base_mode = "base"

[control_nodes_config.joints_pose_sender_config]

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

[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 = "arm"

Note

See also reference of openrr_apps_robot__teleop

Operating mobile robot with ROS2 and openrr-teleop

Turtlebot3

move_base = "arci_ros2"
navigation = "arci_ros2"

[openrr_clients_config]

[plugins.arci_ros2]
path = "../../target/debug/libarci_ros2"

[[plugins.arci_ros2.instances]]
name = "arci_ros2"
type = "MoveBase"
args = """
topic = "/cmd_vel"
"""

[[plugins.arci_ros2.instances]]
name = "arci_ros2"
type = "Navigation"
args = """
action_name = "/navigate_to_pose"
"""

iRobot Create3

Turtlebot3と同様です。

move_base = "arci_ros2"

[openrr_clients_config]

[plugins.arci_ros2]
path = "../../target/release/libarci_ros2"

[[plugins.arci_ros2.instances]]
name = "arci_ros2"
type = "MoveBase"
args = """
topic = "/cmd_vel"
"""

robot_config_path = "irobot_create_robot_client_config_ros2.toml"
initial_mode = "base"

[control_nodes_config]
move_base_mode = "base"

[[control_nodes_config.command_configs]]
name = "dock command"
file_path = "irobot_create_dock_command.txt"

[[control_nodes_config.command_configs]]
name = "undock command"
file_path = "irobot_create_undock_command.txt"

According to APIs page of Create Docs, the following commands allow you to command specific actions.

Create DocsのAPIページによると、以下のコマンドで特定の動作(ドックに戻る、ドックから抜ける)ができるそうなので、割り当ててみます。

ros2 action send_goal /undock irobot_create_msgs/action/Undock "{}"
ros2 action send_goal /dock irobot_create_msgs/action/DockServo "{}"
openrr_apps_robot_commands execute_command -- <command>
  • irobot_create_dock_command.txt
openrr_apps_robot_commands execute_command -- ros2 action send_goal /undock irobot_create_msgs/action/Undock "{}"
  • irobot_create_undock_command.txt
openrr_apps_robot_commands execute_command -- ros2 action send_goal /dock irobot_create_msgs/action/DockServo "{}"

Operating robot arm with ROS/ROS2 and openrr-teleop

Ufactory Lite6 (ROS)

Setup

xarm_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

ROSにfeatureしてOpenRRをビルドします。

cd openrr
cargo build --release --feature ros
cargo install --path ./openrr-apps

Config file for client

ROSで用いられるジョイント名やトピックはros_clients_configsに明記していきます。

また特定の姿勢に名前をつけて実行することも可能です。今回は、初期姿勢を決定し、initial_poseという名前で登録しました。(robot_client_for_ros.toml)

[[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]

Config file for teleop

  • teleop_client_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"

実行したいコマンドを割り当てます。

  • Command to be enable servo (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!"
  • Command for stop servo (stop_servo.txt)
openrr_apps_robot_commands execute_command -- rosservice call /ufactory/motion_ctrl 8 0

作成したTeleop fileに以下を追加します。(teleop_client_for_ros.toml)

...

[[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"

ROSを有効化した後に以下の2つのコマンドを実行します。

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

gazebo

もしLite6をお持ちでしたら、以下の通りに実機を動かすことができます。

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

moveit

Ufactory Lite6 (ROS2)

Setup

xarm_ros2に従って、ROS2用にロボットアームのセットアップをします。

mkdir -p ~/xarm_ws/src
cd ~/xarm_ws/src
git clone https://github.com/xArm-Developer/xarm_ros2
cd xarm-ros2
git pull
git submodule sync
git submodule update --init --remote
rosdep update
rosdep install --from-paths . --ignore-src --rosdistro $ROS_DISTRO -y
cd ~/xarm_ws
colcon build

ROS2にfeatureしてOpenRRをビルドします。

cd openrr
cargo build --release --feature ros2
cargo install --path ./openrr-apps

Config file for client

ROS2ではプラグインとして明記していきます。

[plugins.arci_ros2]
# Path to OpenRR
path = "../../openrr/target/release/libarci_ros2"

[[plugins.arci_ros2.instances]]
name = "lite6"
type = "JointTrajectoryClient"
args = """
action_name = "/lite6_traj_controller"
"""

[openrr_clients_config]
urdf_path = "../lite6_robot.urdf"
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]

Config file for teleop

Teleop fileはROSののものと同様にできます。

robot_config_path = "robot_client_config_for_ros2.toml"

[control_nodes_config]
joints_pose_sender_config.mode = "pose"

[[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"

Note

See also xarm_ros and xarm_ros2, openrr-apps-ufactory-lite6

OpenRR Apps Usage

  1. openrr_apps_robot_command
  2. openrr_apps_robot_teleop
  3. openrr_apps_joint_position_sender
  4. openrr_apps_velocity_sender

openrr_apps_robot_command

openrr_apps_robot_commandではロボットにいくつかの司令を送ることができます。

openrr_apps_robot_command [OPTIONS] [SUBCOMMAND]
OptionsDescription
-c, --config-path <CONFIG_PATH>設定ファイルへのパス
--config <CONFIG>デフォルトまたは設定ファイルで指定した設定の上書き
-h, --helpヘルプの出力
-i, --interactive対話モードの使用
--log-directory <LOG_DIRECTORY>FileAppenderでログを出力するパスの指定
--show-default-configデフォルトの設定ファイルの出力
SubcommandsDescription
cancel_navigation_goalナビゲーションゴールのキャンセル
execute_command外部コマンドの実行
get_navigation_current_pose現在位置の出力
get_stateジョイントの姿勢と該当する手先位置の取得
helpヘルプの出力
list使用可能なクライアントの一覧を出力
load_commandsファイルからコマンドを読み込み実行
move_ikIKをもとに動く move_Ik
send_base_velocityベースの速度を送信 send_base_velocity
send_jointsジョイントの姿勢を送信 send_joints
send_joints_poseあらかじめ設定された姿勢の送信 send_joints_pose
send_navigation_goalナビゲーションゴールの送信 send_navigation_goal
shell_completionシェル補完ファイルの出力 shell_completion
speakテキストの発話

シミュレータ上でロボットを起動します。

urdf-viz ./openrr-planner/sample.urdf &

urdf_viz

そのあとコマンドを読み込みます。

openrr_apps_robot_command \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
    load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

例 (--config)

1つ前の例に--config引数を追加してみます。urdf-viz上で実行するのを見てもいいのですが、簡単のためにload_commandslistに変更しています。

urdf-viz ./openrr-planner/sample.urdf &
openrr_apps_robot_command \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
    list

まず何もせずに実行すれば、先程の前半部分のような出力が得られます。

Raw joint trajectory clients
    r_arm
    l_arm
Joint trajectory clients
    r_arm
    r_arm_ik
    l_arm_collision_checked
    l_arm_ik
    r_arm_collision_checked
    l_arm
Collision check clients
    l_arm_collision_checked
    r_arm_collision_checked
Ik clients
    r_arm_ik
    l_arm_ik

--config引数では、--config-pathの内容を上書きすることができます。したがって、

urdf-viz ./openrr-planner/sample.urdf &
openrr_apps_robot_command \
    --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
    --config openrr_clients_config.ik_clients_configs[0].name=\"user_defined_ik\" \
    list

とすると、

Raw joint trajectory clients
    l_arm
    r_arm
Joint trajectory clients
    l_arm
    r_arm_collision_checked
    l_arm_collision_checked
    r_arm
    r_arm_ik
    user_defined_ik
Collision check clients
    r_arm_collision_checked
    l_arm_collision_checked
Ik clients
    r_arm_ik
    user_defined_ik

というようにして左アーム用のIKクライアント名がuser_defined_ikに変更されました。もちろんこれは直接tomlファイルを書き換えることでも実現できます。

load_commandsのまま実行する場合は、openrr-apps/command/sample_cmd_urdf_viz.txt内のl_arm_ikuser_defined_ikに変える必要があります。

move_ikの使い方

openrr_apps_robot_command move_ik [OPTIONS] <NAME>

Name

IKクライアント名

Option

OptionsDescription
-d, --duration 到達までかける時間
-h, --helpヘルプの出力
-i, --interpolateデカルト座標系 補間 IKクライアント名を指定
-l, --local
--max_resolution_for_interpolation <MAX_RESOLUTION_FOR_INTERPOLATION>最大の補間分解能 (default 0.5)
--min_number_of_points_for_interpolation <MIN_NUMBER_OF_POINTS_FOR_INTERPOLATION>最小の補間点数 (default 10)
-r, --roll 目標のロール角
-p, --pitch 目標のピッチ角
--yaw 目標のヨー角
-x, --x 目標のx座標
-y, --y 目標のy座標
-z, --z 目標のz座標

send_base_velocityの使い方

openrr_apps_robot_command send_base_velocity [OPTIONS] <X> <Y> <THETA>

X

x方向の速度

Y

y方向の速度

Theta

角速度

OptionsDescription
-d, --duration_secs <DURATION_SECS>継続する時間
-h, --helpヘルプの出力

send_jointsの使い方

openrr_apps_robot_command send_joints [OPTIONS] <NAME>

Name

クライアント名

Option

OptionsDescription
-d, --duration 到達までかける時間
-h, --helpヘルプの出力
-i, --interpolate目標を直交座標系での補間する
-j, --joint ジョイント番号
--max_resolution_for_interpolation <MAX_RESOLUTION_FOR_INTERPOLATION>最大の補間分解能 (default 0.05)
--min_number_of_points_for_interpolation <MIN_NUMBER_OF_POINTS_FOR_INTERPOLATION>最小の補間点数 (default 10)

send_joints_poseの使い方

openrr_apps_robot_command send_joints_pose [OPTIONS] <NAME> <POSE_NAME>

Name

クライアント名

Pose name

ポーズ名

Option

OptionsDescription
-d, --duration 到達までかける時間
-h, --helpヘルプの出力

send_navigation_goalの使い方

openrr_apps_robot_command send_navigation_goal [OPTIONS] <X> <Y> <YAW>

Option

OptionsDescription
-f, --frame_id <FRAME_ID>
-h, --helpヘルプの出力
-t, --timeout_secs <TIMEOUT_SECS>タイムアウトまでの秒数

shell_completionの使い方

openrr_apps_robot_command shell_completion <SUBCOMMAND>

Subcommand

SubcommandDescription
bash
fish
helpヘルプの出力
power_shell
zsh

openrr_apps_robot_teleop

openrr_apps_robot_teleopでは今まではGUIアプリケーション上で操作していたものをジョイスティックなどで遠隔で操作できるようになっています。

openrr_apps_robot_teleop

使い方

openrr_apps_robot_teleop [OPTIONS]
OptionsDescription
-c, --config-path <CONFIG_PATH>設定ファイルへのパス
-h, --helpヘルプの出力
--log-directory <LOG_DIRECTORY>FileAppenderでログを出力するパスの指定
--robot-config <ROBOT_CONFIG>デフォルトまたは設定ファイルで指定した設定の上書き (robot config file)
--show-default-configデフォルトの設定ファイルの出力
--teleop-config <TELEOP_CONFIG>デフォルトまたは設定ファイルで指定した設定の上書き (teleop config file)

ボタンの名前は、gilrs layoutに従っています。

urdf-vizを起動します。その後、ゲームパッドをPCに接続し、Teleop用の設定ファイルを読み込み実行します。

urdf-viz ./openrr-planner/sample.urdf &
openrr_apps_robot_teleop \
    --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml

割り当てたモード選択ボタン(デフォルトではNorth)を押すとモードが切り替わり、サブモード選択ボタン(デフォルトではEast)ではサブモードが切り替わります。

PrintSpeaker: l_arm0
PrintSpeaker: r_arm0
PrintSpeaker: base
PrintSpeaker: left i k
PrintSpeaker: right i k
PrintSpeaker: pose l_arm_collision_checked zero
PrintSpeaker: l_arm0
PrintSpeaker: r_arm0
PrintSpeaker: r_arm1
PrintSpeaker: r_arm2

例(--teleop-config)

openrr_apps_robot_teleop \
    --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml \
    --teleop-config gamepad=\"keyboard\"

これは、openrr_apps_robot_command Example (--config)の例(--config)と同じようにして、既存の設定を上書きするというものです。

この例ではデフォルトであったゲームパッドでの操作をキーボードからの操作に切り替えています。

openrr_apps_joint_position_sender

openrr_apps_joint_position_senderではマニピュレータなど関節ロボットについての各関節の値を指定することができます。

openrr_apps_joint_position_sender

joint_pose_sender

使い方

openrr_apps_joint_position_sender [OPTIONS]
OptionsDescription
-c, --config-path <CONFIG_PATH>設定ファイルへのパス
--config <CONFIG>デフォルトまたは設定ファイルで指定した設定の上書き
-h, --helpヘルプの出力

openrr_apps_velocity_sender

openrr_apps_velocity_senderでは移動ロボットを動かすための速度を指定することができます。

openrr_apps_velocity_sender

velocity_sender

使い方

openrr_apps_velocity_sender [OPTIONS]
OptionsDescription
-c, --config-path <CONFIG_PATH>設定ファイルへのパス
--config <CONFIG>デフォルトまたは設定ファイルで指定した設定の上書き
-h, --helpヘルプの出力

OpenRR Apps Configuration

  1. Client config
  2. Teleop config
  3. Environmental Variables
  4. Overwrite configuration at startup

Client config

configを書く

configを自分で書くことで、サンプルにないロボットや独自に作成したロボットがOpenRRで動くようになります。configには以下の要素を書くことができます。

また、VSCodeを使用している方はこちらから拡張機能のEvenBetterTOMLを導入することを推奨します。

Default config

デフォルトは以下のようになっています。読み込んだconfigに応じて設定が追加または上書きされます。

openrr_apps_robot_command --show-default-config
[speak_configs]

[openrr_clients_config]
self_collision_check_pairs = []

[openrr_clients_config.ik_solvers_configs]

[plugins]

robot_config

Client configに書く項目の一覧になります。リポジトリにあるサンプルもぜひご参考に。サンプルはこちらから。

PropertiesDescriptionType
joint_trajectory_clients使用するJoint trajectory clientsarray string
localization使用するLocalizationの指定。 rosurdf-vizfalse、もしくはプラグインの名前。string or boolean
move_base使用するMoveBaseの指定。 rosurdf-vizfalse、もしくはプラグインの名前。string or boolean
navigation使用するNavigationの指定。 rosurdf-vizfalse、もしくはプラグインの名前。string or boolean
openrr_clients_configOpenRR clientの設定。
ros_action_clients_configsROS Action Clientの設定。array RosControlActionClientConfig
pluginsプラグインの設定。
ros_clients_configsros_clients_configs
ros_cmd_vel_move_base_client_configROS MoveBaseの設定。.topicを付加して送りたいトピックを指定。
ros_localization_client_configROS Localizationの設定。要素の有効無効の指定。
ros_navigation_client_configROS Navigationの設定。要素の有効無効の指定。
speak_configsspeakの設定。SpeakConfig
speakers使用するSpeakersの指定。string
urdf_viz_clients_configsurdf_vizの設定。

joint_trajectory_clients

Type: array string

localization, move_base, navigation

Type: string or boolean

Example

move_base = false
navigation = "arci_ros2"

openrr_clients_config

OpenRR Clients Config

OpenRR Clients ConfigType
collision_check_clients_configsCollisionCheckClientConfig
ik_clients_configsIkClientConfig
ik_solvers_configsIkSolverConfig
joint_trajectory_clients_container_configsJointTrajectoryClientsContainerConfig
joint_posesJointsPose
self_collision_check_pairsarray string
urdf_full_pathstring
urdf_pathstring

Example

[openrr_clients_config]
urdf_path = "./twin_arms_robot.urdf"
self_collision_check_pairs = [
    "left_shoulder:left_gripper",
    "right_shoulder:right_gripper"
]

Collision Check Client Config

Collision Check Client ConfigType
client_namestring (required)
namestring (required)
self_collision_checker_configSelfCollisionCheckerConfig

Example

[[openrr_clients_config.collision_check_clients_configs]]
client_name = "arm_with_torso"
name = "arm_with_torso_collision_checked"

Self Collision Checker Config

Self Collision Checker ConfigType
predictiondouble (default 0.001)
time_interpolate_ratedouble (default 0.5)

IK Client Config

IK Client ConfigType
client_namestring (required)
namestring (required)
solver_namestring (required)

Example

[[openrr_clients_config.ik_clients_configs]]
name = "arm_with_torso_ik"
client_name = "arm_with_torso_collision_checked"
solver_name = "arm_with_torso_ik_solver"

IK Solver Config

IK Solver ConfigType
allowable_angle_error_raddouble (default 0.005)
allowable_position_error_mdouble (default 0.005)
constraintsConstraints
ik_targetstring (required)
jacobian_multiplierdouble (default 0.1)
num_max_tryuint (default 300)
root_node_namestring
use_random_ikboolean (default false)

Example

[openrr_clients_config.ik_solvers_configs.arm_with_torso_ik_solver]
ik_target = "gripper_palm_joint"
allowable_position_error_m = 0.01

Constraints

ConstraintsType
ignored_joint_namesarray string (default [])
position_xboolean (default true)
position_yboolean (default true)
position_zboolean (default true)
rotation_xboolean (default true)
rotation_yboolean (default true)
rotation_zboolean (default true)

Joint Trajectory Client Container Config

Joint Trajectory Client Container ConfigType
clients_namearray string (required)
namestring

Joints Pose

Joints PoseType
client_namestring (required)
pose_namestring (required)
positionsarray double (required)

Example

[[openrr_clients_config.joints_poses]]
pose_name = "stand by"
client_name = "arm"
positions = [0.0, 1.2, 0.0, -0.7, 0.0, -0.2, 0.0]

ros_action_clients_configs

ROS Control Action Client Config

ROS Control Action Client ConfigType
complete_allowable_errorsarray double (required)
complete_timeout_secdouble (default 10.0)
controller_namestring (required)
joint_namesarray string (required)
joint_position_difference_limitsarray double
joint_position_limiter_strategyJointPositionLimiterStrategy
joint_position_limitsJointPositionLimit
joint_velocity_limitsarray double
namestring (required)
send_partial_joints_goalboolean (default false)
state_topic_namestring (required)
wrap_with_joint_position_difference_limiterboolean (default false)
wrap_with_joint_position_limiterboolean (default false)
wrap_with_joint_velocity_limiterboolean (default false)

Joint Position Limiter Strategy

Joint Position Limiter StrategyElement
string (enum)"Clamp", "ClampWithWarn", "Error"

Joint Position Limit

Joint Position LimitType
lowerdouble
upperdouble

Example

[[urdf_viz_clients_configs]]
name = "foo"
joint_names = ["bar1", "bar2"]
joint_position_limits = [
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 1.5 },
]

plugins

plugin configType
instancesPluginInstance
path
Plugin InstanceTypeDescription
argsstringArguments passed when creating this instance.
args_from_pathstringPass the contents of the specified file as an argument.
pathstring (required)Path to the plugin. If no extension is specified, the default extension for cdylib on the current OS will be selected. (linux: .so, macos: .dylib, windows: .dll)
typePluginInstanceKind

Plugin Instance Kind

Joint Position Limiter StrategyElement
string (enum)"JointTrajectoryClient", Localization", MoveBase", Navigation", "Speaker"

ros_clients_configs

ROS Control Client Config

ROS Control Client ConfigType
complete_allowable_errorsarray double
complete_timeout_secdouble
controller_namestring
joint_namesarray string
joint_position_limitsarray JointPositionLimit
joint_velocity_limitsarray double
namestring
send_partial_joints_goalboolean
state_topic_namestring
wrap_with_joint_position_limiterboolean (false)
wrap_with_joint_velocity_limiterboolean (false)

Joint Position Limit

Joint Position LimitType
lowerdouble
upperdouble

Example

[[ros_clients_configs]]
name = "arm"
joint_names = [
    "shoulder_joint",
    "shoulder_joint",
    "upper_arm_roll_joint",
    "elbow_flex_joint",
    "forearm_roll_joint",
    "wrist_flex_joint",
    "wrist_roll_joint",
]
complete_allowable_errors = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
controller_name = "arm_controller"
state_topic_name = "arm_controller/openrr/state"

ros_cmd_vel_move_base_client_config

ROS cmd_vel MoveBase Client Config

ROS cmd_vel MoveBase ConfigType
topicstring

ros_localization_client_config

ROS Localization Client Config

ROS Localization Client ConfigType
request_final_nomotion_update_hackboolean

ros_navigation_client_config

ROS Navigation Client Config

ROS Navigation Client ConfigType
clear_costmap_before_startboolean
request_final_nomotion_update_hackboolean

speak_configs

Speak Config

Speak ConfigElement
string(enum)"Print", "Audio", "Command" or "RosEspeak"
"RosEspeak"Type
configRosEspeakClientConfig
"Audio"Type
argsmap (required)
mapType
{name}string

ROS Espeak Client Config

ROS Espeak Client ConfigType
topicstring

Example (Audio)

[speak_configs."foo"]
type = "Audio"

[speak_configs."foo".args.map]
bar = "./bar.mp3" # Path to audio file
openrr_apps_robot_command --config-path {path to toml} speak foo bar

Example (ROSEspeak)

[speak_configs.espeak]
type = "RosEspeak"

[speak_configs.espeak.args.config]
topic = "/sample/message"
openrr_apps_robot_command --config-path {path to toml} -i
>  speak espeak Hello!
data: "Hello!"
---

speakers

Type: string

urdf_viz_clients_configs

URDF-Viz Web Client ConfigType
joint_namesarray string
joint_position_limitsarray JointPositionLimit
joint_velocity_limitsarray double
namestring
wrap_with_joint_position_limiterboolean (default false)
wrap_with_joint_velocity_limiterboolean (default false)

Example

[[urdf_viz_clients_configs]]
# `urdf-viz` client name
name = "arm"
# List of joints
joint_names = [
    "shoulder_yaw",
    "shoulder_pitch",
    "shoulder_roll",
    "elbow_pitch",
    "wrist_yaw",
    "wrist_pitch",
]
wrap_with_joint_position_limiter = true

# Range of joints
joint_position_limits = [
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 1.5 },
    { lower = -1.5, upper = 2.0 },
    { lower = -2.0, upper = 1.5 },
    { lower = -3.0, upper = 3.0 },
    { lower = -2.0, upper = 2.0 },
]

[openrr_clients_config]
# Path to URDF file
urdf_path = "./sample.urdf"
self_collision_check_pairs = [
    "shoulder_yaw:gripper_linear1",
]

[[openrr_clients_config.collision_check_clients_configs]]
# Collision check client name
name = "arm_collision_checked"
# `urdf-viz` client name
client_name = "arm"

[[openrr_clients_config.ik_clients_configs]]
# IK client name
name = "arm_ik"
# Collision check client name
client_name = "arm_collision_checked"
# IK solver name
solver_name = "arm_ik_solver"

[[openrr_clients_config.joints_poses]]
# Position name
pose_name = "zero"
# Collision check client name
client_name = "arm_collision_checked"
# Position that you want to set
positions = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

[openrr_clients_config.ik_solvers_configs.arm_ik_solver] # IK solver name (arm_ik_solver)
ik_target = "tool_fixed"

Teleop config

configを書く

1つ前ではClientのConfigについて取り上げました。このページはTeleop用の追加Configについて載せてあります。

requiredと書いてあるものは必須事項です。

Default config

デフォルトは以下のようになっています。読み込んだconfigに応じて設定が追加または上書きされます。HashMapで実装されているため、既に設定されたものは上書きされ、新規の設定の場合は追加されます。

initial_mode = ""
gamepad = "gilrs"

[control_nodes_config]

[gil_gamepad_config]
device_id = 0

[gil_gamepad_config.map]
button_map = [
    ["DPadLeft",      "DPadLeft"     ],
    ["Select",        "Select"       ],
    ["East",          "East"         ],
    ["DPadUp",        "DPadUp"       ],
    ["LeftTrigger",   "LeftTrigger"  ],
    ["DPadDown",      "DPadDown"     ],
    ["RightTrigger",  "RightTrigger" ],
    ["RightTrigger2", "RightTrigger2"],
    ["Start",         "Start"        ],
    ["LeftTrigger2",  "LeftTrigger2" ],
    ["Mode",          "Mode"         ],
    ["DPadRight",     "DPadRight"    ],
    ["South",         "South"        ],
    ["North",         "North"        ],
    ["RightThumb",    "RightThumb"   ],
    ["LeftThumb",     "LeftThumb"    ],
    ["West",          "West"         ]
]
axis_map = [
    ["LeftStickY",  "LeftStickY" ],
    ["LeftStickX",  "LeftStickX" ],
    ["RightStickX", "RightStickX"],
    ["DPadY",       "DPadY"      ],
    ["DPadX",       "DPadX"      ],
    ["RightStickY", "RightStickY"]
]
axis_value_map = [["LeftStickX", -1.0], ["RightStickX", -1.0]]

[plugins]

robot_teleop_config

Propertiestype
control_nodes_configControlNodesConfig (required)
gamepadGamepadKind(string) (default "gilrs")
gil_gamepad_configGilGamepadConfig
initial_modestring
pluginsTeleopPluginConfig
robot_config_full_pathstring
robot_config_pathstring

control_nodes_config

Control Nodes Config

Control Nodes Config
ik_node_teleop_configsarray IkNodeTeleopConfig (required)
joints_pose_sender_configJointsPoseSenderConfig (required)
joy_joint_teleop_configsarray JoyJointTeleopConfig
move_base_modestring
command_configsRobotCommandConfig

IK Node Teleop Config

IK Node Teleop Config
configIkNodeConfig (required)
joint_trajectory_client_namestring (required)
solver_namestring (required)

Joint Pose Sender Config

Joint Pose Sender Config
duration_secsdouble (default 2.0)
modestring (default "pose")

Joy Joint Teleop Config

Joy Joint Teleop Config
client_namestring
configJoyJointTeleopNodeConfig

IK Node Config

IK Node Config
modestring (required)
move_step_angulararray double (default [0.05, 0.05, 0.17])
move_step_lineararray double (default [0.01, 0.01, 0.01])
step_duration_secsdouble (default 0.1)

Joy Joint Teleop Node Config

Joy Joint Teleop Node Config
joint_stepdouble (default 0.02)
modestring (required)
step_duration_secsdouble (default 0.1)

Robot Command Config

Robot Command Config
file_pathstring (required)
namestring (required)

Example

[[control_nodes_config.command_configs]]
name = "audio bar"
file_path = "sample_audio_command.txt"

[[control_nodes_config.command_configs]]
name = "ros speak"
file_path = "sample_speak_command.txt"
openrr_apps_robot_command speak foo bar
openrr_apps_robot_command speak espeak "This is topic message"
PrintSpeaker: command audio sine
PrintSpeaker: command ros speak

gamepad

string or BuiltinGamepad ("gilrs" or "keyboard"). Default is "gilrs".

gil_gamepad_config

Gil Gamepad Config

Gil Gamepad Config
device_iduint (default 0)
mapMap

Map

Map
axis_maparray GilrsAxis Axis
axis_value_maparray Axis double
button_maparray GilrsButton Button

Gilrsとの比較表はこのようになります。使用するJoystickにより異なりますので参考までに。特別にこのボタンやスティックを割り当てたいという場合はteleop_configのファイルに例に習って対応付けることでキーを変更できます。

ボタンやスティックのレイアウトはgilrs layoutに従っています。

Comparison table between GilrsAxis and Axis

GilrsAxisAxis
"LeftStickX""LeftStickX"(default)
"LeftStickY""LeftStickY"(default)
"LeftZ""LeftTrigger"
"RightStickX""RightStickX"(default)
"RightStickY""RightStickY"(default)
"RightZ""RightTrigger"
"DPadX""DPadX"(default)
"DPadY""DPadY"(default)
"Unknown""Unknown"

Comparison table between GilrsButton and Button

GilrsButtonButton
"South""South"(default)
"East""East"(default)
"North""North"(default)
"West""West"(default)
"C"
"Z"
"LeftTrigger""LeftTrigger"(default)
"LeftTrigger2""LeftTrigger2"(default)
"RightTrigger""RightTrigger"(default)
"RightTrigger2""RightTrigger2"(default)
"Select""Select"(default)
"Start""Start"(default)
"Mode""Mode"(default)
"LeftThumb""LeftThumb"(default)
"RightThumb""RightThumb"(default)
"DPadUp""DPadUp"(default)
"DPadDown""DPadDown"(default)
"DPadLeft""DPadLeft"(default)
"DPadRight""DPadRight"(default)
"Unknown""Unknown"

Example

[gil_gamepad_config.map]
axis_map = [
    # GilrsAxis      Axis (user axis)
    ['LeftStickX',  'LeftStickX'   ],
    ['LeftStickY',  'LeftStickY'   ],
    ['LeftZ',       'LeftTrigger'  ],
    ['RightStickX', 'RightStickX'  ],
    ['RightStickY', 'RightStickY'  ],
    ['RightZ',      'RightTrigger' ],
    ['DPadX',       'DPadX'        ],
    ['DPadY',       'DPadY'        ],
]
axis_value_map = [
    # Axis (user axis)  value
    ['LeftStickX',      -1.0 ],
    ['RightStickX',     -1.0 ],
    ['LeftStickY',      -1.0 ],
    ['RightStickY',     -1.0 ],
]
button_map = [
    # GilrsButton     Button(user button)
    ['East',          'South'         ],
    ['C',             'East'          ],
    ['North',         'North'         ],
    ['South',         'West'          ],
    ['West',          'LeftTrigger'   ],
    ['LeftTrigger',   'LeftTrigger2'  ],
    ['Z',             'RightTrigger'  ],
    ['RightTrigger',  'RightTrigger2' ],
    ['LeftTrigger2',  'Select'        ],
    ['RightTrigger2', 'Start'         ],
    ['Mode',          'Mode'          ],
    ['Select',        'LeftThumb'     ],
    ['Start',         'RightThumb'    ],
    ['DPadUp',        'DPadUp'        ],
    ['DPadDown',      'DPadDown'      ],
    ['DPadLeft',      'DPadLeft'      ],
    ['DPadRight',     'DPadRight'     ],
]

initial_mode

initial_mode では初期のモードを指定できます。

Example

initial_mode = "base"

plugins

Teleop Plugin Config

Teleop Plugin ConfigDescription
argsstringArguments passed when creating this instance.
args_from_pathstringPass the contents of the specified file as an argument.
pathstring (required)Path to the plugin. If no extension is specified, the default extension for cdylib on the current OS will be selected. (linux: .so, macos: .dylib, windows: .dll)

robot_config_path

robot_config_path では、configファイルへの相対パスを指定します。

Example

robot_config_path = "sample_robot_client_config_for_urdf_viz.toml"

Environmental Variables

環境変数をexport OPENRR_APPS_ROBOT_CONFIG_PATH=some_path_to_config.tomlと設定すると、--config-pathの後のファイルの パスの指定をスキップすることができます。明示的に--config-pathを指定すれば環境変数は無視されます。

openrr_apps_robot_command

  • Run sample commands with env var
export OPENRR_APPS_ROBOT_CONFIG_PATH=$(pwd)/openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml

openrr_apps_robot_command load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

openrr_apps_joint_position_sender

  • Run for sample urdf with env var
export OPENRR_APPS_ROBOT_CONFIG_PATH=$(pwd)/openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml

openrr_apps_joint_position_sender

Note

他の設定にしたい場合にOPENRR_APPS_ROBOT_CONFIG_PATHを設定し直すことを忘れないでください。

Overwrite configuration at startup

--configのオプションを追加することで、起動時にconfigファイルの上書きをすることができます。

例えば、以下のようにしてurdfへのパスを更新します。

openrr_apps_robot_command \
  --config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
  --config 'openrr_clients_config.urdf_path="path/to/urdf"' \
  load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

openrr_apps_robot_teleopでは2つのオプションがあります。--robot-configでは、client config fileを上書きします。--teleop-configではteleop configを上書きします。

例として、openrr_apps_robot_teleoparci-gamepad-keyboardを追加して実行します。

openrr_apps_robot_teleop \
  --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml \
  --teleop-config 'gamepad="Keyboard"'

joint_position_limiterを無効にしてみます。

openrr_apps_robot_teleop \
  --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml \
  --robot-config 'urdf_viz_clients_configs[0].wrap_with_joint_position_limiter=false'

複数の設定を上書きしたい場合は、以下のようにセミコロンか改行によって分離する必要があります。

# semicolon-separated
openrr_apps_robot_teleop \
  --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml \
  --robot-config 'urdf_viz_clients_configs[0].wrap_with_joint_position_limiter=false;openrr_clients_config.urdf_path="path/to/urdf"'
# newline-separated
{
  echo 'urdf_viz_clients_configs[0].wrap_with_joint_position_limiter=false'
  echo 'openrr_clients_config.urdf_path="path/to/urdf"'
} > overwrite.txt
openrr_apps_robot_teleop \
  --config-path ./openrr-apps/config/sample_teleop_config_urdf_viz.toml \
  --robot-config "$(cat ./overwrite.txt)"

Develop OpenRR

  1. For Developer

For Developer

coming soon...

  • OpenRRを用いたアプリケーションをどのように開発するか。
  • マイコンや他ソフトウェアとのインターフェースをどのように実装するか。

Troubleshooting

基本的にはエラーログなどに従ってほしいですが、よくある例を以下にあげておきます。

Featuring ROS2

cargo build --release --features ros2
cargo install --path ./openrr-apps

ROS2featureしてビルドしたか確認してみてください。

GUI Troubleshooting

GUIまわりの場合は、GitHub上のREADMEを参考にしてください。

それでもだめな場合

もしかするとOpenRRのバグかもしれないので、GitHubにあるリポジトリのIssuesにその問題を投稿してくださると助かります。