Introduction
Supported Platforms
OS | Core | GUI | ROS | ROS2 |
---|---|---|---|---|
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
- ROS Noetic
arci-ros2
Using OpenRR Apps
- Installation
- Operating robot from GUI
- Operating robot from CLI
- Robot teleoperation
- Operating mobile robot with ROS2 and openrr-teleop
- 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 &
openrr_apps_joint_position_sender
openrr_apps_joint_position_sender \
--config-path ./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml
スライドバーを動かすことで、関節角を変更することができます。
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
スライドバーを動かすことで、ロボットの速度と角速度を変更することができます。
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 &
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
もし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
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
- openrr_apps_robot_command
- openrr_apps_robot_teleop
- openrr_apps_joint_position_sender
- openrr_apps_velocity_sender
openrr_apps_robot_command
openrr_apps_robot_command
ではロボットにいくつかの司令を送ることができます。
openrr_apps_robot_command [OPTIONS] [SUBCOMMAND]
Options | Description |
---|---|
-c, --config-path <CONFIG_PATH> | 設定ファイルへのパス |
--config <CONFIG> | デフォルトまたは設定ファイルで指定した設定の上書き |
-h, --help | ヘルプの出力 |
-i, --interactive | 対話モードの使用 |
--log-directory <LOG_DIRECTORY> | FileAppenderでログを出力するパスの指定 |
--show-default-config | デフォルトの設定ファイルの出力 |
Subcommands | Description |
---|---|
cancel_navigation_goal | ナビゲーションゴールのキャンセル |
execute_command | 外部コマンドの実行 |
get_navigation_current_pose | 現在位置の出力 |
get_state | ジョイントの姿勢と該当する手先位置の取得 |
help | ヘルプの出力 |
list | 使用可能なクライアントの一覧を出力 |
load_commands | ファイルからコマンドを読み込み実行 |
move_ik | IKをもとに動く 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 &
そのあとコマンドを読み込みます。
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_commands
をlist
に変更しています。
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_ik
をuser_defined_ik
に変える必要があります。
move_ikの使い方
openrr_apps_robot_command move_ik [OPTIONS] <NAME>
Name
IKクライアント名
Option
Options | Description |
---|---|
-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
角速度
Options | Description |
---|---|
-d, --duration_secs <DURATION_SECS> | 継続する時間 |
-h, --help | ヘルプの出力 |
send_jointsの使い方
openrr_apps_robot_command send_joints [OPTIONS] <NAME>
Name
クライアント名
Option
Options | Description |
---|---|
-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
Options | Description |
---|---|
-d, --duration | 到達までかける時間 |
-h, --help | ヘルプの出力 |
send_navigation_goalの使い方
openrr_apps_robot_command send_navigation_goal [OPTIONS] <X> <Y> <YAW>
Option
Options | Description |
---|---|
-f, --frame_id <FRAME_ID> | |
-h, --help | ヘルプの出力 |
-t, --timeout_secs <TIMEOUT_SECS> | タイムアウトまでの秒数 |
shell_completionの使い方
openrr_apps_robot_command shell_completion <SUBCOMMAND>
Subcommand
Subcommand | Description |
---|---|
bash | |
fish | |
help | ヘルプの出力 |
power_shell | |
zsh |
openrr_apps_robot_teleop
openrr_apps_robot_teleop
では今まではGUIアプリケーション上で操作していたものをジョイスティックなどで遠隔で操作できるようになっています。
openrr_apps_robot_teleop
使い方
openrr_apps_robot_teleop [OPTIONS]
Options | Description |
---|---|
-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
使い方
openrr_apps_joint_position_sender [OPTIONS]
Options | Description |
---|---|
-c, --config-path <CONFIG_PATH> | 設定ファイルへのパス |
--config <CONFIG> | デフォルトまたは設定ファイルで指定した設定の上書き |
-h, --help | ヘルプの出力 |
openrr_apps_velocity_sender
openrr_apps_velocity_sender
では移動ロボットを動かすための速度を指定することができます。
openrr_apps_velocity_sender
使い方
openrr_apps_velocity_sender [OPTIONS]
Options | Description |
---|---|
-c, --config-path <CONFIG_PATH> | 設定ファイルへのパス |
--config <CONFIG> | デフォルトまたは設定ファイルで指定した設定の上書き |
-h, --help | ヘルプの出力 |
OpenRR Apps Configuration
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に書く項目の一覧になります。リポジトリにあるサンプルもぜひご参考に。サンプルはこちらから。
Properties | Description | Type |
---|---|---|
joint_trajectory_clients | 使用するJoint trajectory clients | array string |
localization | 使用するLocalizationの指定。 ros 、urdf-viz 、false 、もしくはプラグインの名前。 | string or boolean |
move_base | 使用するMoveBaseの指定。 ros 、urdf-viz 、false 、もしくはプラグインの名前。 | string or boolean |
navigation | 使用するNavigationの指定。 ros 、urdf-viz 、false 、もしくはプラグインの名前。 | string or boolean |
openrr_clients_config | OpenRR clientの設定。 | |
ros_action_clients_configs | ROS Action Clientの設定。 | array RosControlActionClientConfig |
plugins | プラグインの設定。 | |
ros_clients_configs | ros_clients_configs | |
ros_cmd_vel_move_base_client_config | ROS MoveBase の設定。.topic を付加して送りたいトピックを指定。 | |
ros_localization_client_config | ROS Localization の設定。要素の有効無効の指定。 | |
ros_navigation_client_config | ROS Navigation の設定。要素の有効無効の指定。 | |
speak_configs | speakの設定。 | SpeakConfig |
speakers | 使用するSpeakersの指定。 | string |
urdf_viz_clients_configs | urdf_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 Config | Type |
---|---|
collision_check_clients_configs | CollisionCheckClientConfig |
ik_clients_configs | IkClientConfig |
ik_solvers_configs | IkSolverConfig |
joint_trajectory_clients_container_configs | JointTrajectoryClientsContainerConfig |
joint_poses | JointsPose |
self_collision_check_pairs | array string |
urdf_full_path | string |
urdf_path | string |
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 Config | Type |
---|---|
client_name | string (required) |
name | string (required) |
self_collision_checker_config | SelfCollisionCheckerConfig |
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 Config | Type |
---|---|
prediction | double (default 0.001) |
time_interpolate_rate | double (default 0.5) |
IK Client Config
IK Client Config | Type |
---|---|
client_name | string (required) |
name | string (required) |
solver_name | string (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 Config | Type |
---|---|
allowable_angle_error_rad | double (default 0.005) |
allowable_position_error_m | double (default 0.005) |
constraints | Constraints |
ik_target | string (required) |
jacobian_multiplier | double (default 0.1) |
num_max_try | uint (default 300) |
root_node_name | string |
use_random_ik | boolean (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
Constraints | Type |
---|---|
ignored_joint_names | array string (default []) |
position_x | boolean (default true) |
position_y | boolean (default true) |
position_z | boolean (default true) |
rotation_x | boolean (default true) |
rotation_y | boolean (default true) |
rotation_z | boolean (default true) |
Joint Trajectory Client Container Config
Joint Trajectory Client Container Config | Type |
---|---|
clients_name | array string (required) |
name | string |
Joints Pose
Joints Pose | Type |
---|---|
client_name | string (required) |
pose_name | string (required) |
positions | array 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 Config | Type |
---|---|
complete_allowable_errors | array double (required) |
complete_timeout_sec | double (default 10.0) |
controller_name | string (required) |
joint_names | array string (required) |
joint_position_difference_limits | array double |
joint_position_limiter_strategy | JointPositionLimiterStrategy |
joint_position_limits | JointPositionLimit |
joint_velocity_limits | array double |
name | string (required) |
send_partial_joints_goal | boolean (default false) |
state_topic_name | string (required) |
wrap_with_joint_position_difference_limiter | boolean (default false) |
wrap_with_joint_position_limiter | boolean (default false) |
wrap_with_joint_velocity_limiter | boolean (default false) |
Joint Position Limiter Strategy
Joint Position Limiter Strategy | Element |
---|---|
string (enum) | "Clamp", "ClampWithWarn", "Error" |
Joint Position Limit
Joint Position Limit | Type |
---|---|
lower | double |
upper | double |
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 config | Type |
---|---|
instances | PluginInstance |
path |
Plugin Instance | Type | Description |
---|---|---|
args | string | Arguments passed when creating this instance. |
args_from_path | string | Pass the contents of the specified file as an argument. |
path | string (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 ) |
type | PluginInstanceKind |
Plugin Instance Kind
Joint Position Limiter Strategy | Element |
---|---|
string (enum) | "JointTrajectoryClient", Localization", MoveBase", Navigation", "Speaker" |
ros_clients_configs
ROS Control Client Config
ROS Control Client Config | Type |
---|---|
complete_allowable_errors | array double |
complete_timeout_sec | double |
controller_name | string |
joint_names | array string |
joint_position_limits | array JointPositionLimit |
joint_velocity_limits | array double |
name | string |
send_partial_joints_goal | boolean |
state_topic_name | string |
wrap_with_joint_position_limiter | boolean (false) |
wrap_with_joint_velocity_limiter | boolean (false) |
Joint Position Limit
Joint Position Limit | Type |
---|---|
lower | double |
upper | double |
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 Config | Type |
---|---|
topic | string |
ros_localization_client_config
ROS Localization Client Config
ROS Localization Client Config | Type |
---|---|
request_final_nomotion_update_hack | boolean |
ros_navigation_client_config
ROS Navigation Client Config
ROS Navigation Client Config | Type |
---|---|
clear_costmap_before_start | boolean |
request_final_nomotion_update_hack | boolean |
speak_configs
Speak Config
Speak Config | Element |
---|---|
string(enum) | "Print" , "Audio" , "Command" or "RosEspeak" |
"RosEspeak" | Type |
---|---|
config | RosEspeakClientConfig |
"Audio" | Type |
---|---|
args | map (required) |
map | Type |
---|---|
{name} | string |
ROS Espeak Client Config
ROS Espeak Client Config | Type |
---|---|
topic | string |
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 Config | Type |
---|---|
joint_names | array string |
joint_position_limits | array JointPositionLimit |
joint_velocity_limits | array double |
name | string |
wrap_with_joint_position_limiter | boolean (default false) |
wrap_with_joint_velocity_limiter | boolean (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
Properties | type |
---|---|
control_nodes_config | ControlNodesConfig (required) |
gamepad | GamepadKind(string) (default "gilrs") |
gil_gamepad_config | GilGamepadConfig |
initial_mode | string |
plugins | TeleopPluginConfig |
robot_config_full_path | string |
robot_config_path | string |
control_nodes_config
Control Nodes Config
Control Nodes Config | |
---|---|
ik_node_teleop_configs | array IkNodeTeleopConfig (required) |
joints_pose_sender_config | JointsPoseSenderConfig (required) |
joy_joint_teleop_configs | array JoyJointTeleopConfig |
move_base_mode | string |
command_configs | RobotCommandConfig |
IK Node Teleop Config
IK Node Teleop Config | |
---|---|
config | IkNodeConfig (required) |
joint_trajectory_client_name | string (required) |
solver_name | string (required) |
Joint Pose Sender Config
Joint Pose Sender Config | |
---|---|
duration_secs | double (default 2.0) |
mode | string (default "pose") |
Joy Joint Teleop Config
Joy Joint Teleop Config | |
---|---|
client_name | string |
config | JoyJointTeleopNodeConfig |
IK Node Config
IK Node Config | |
---|---|
mode | string (required) |
move_step_angular | array double (default [0.05, 0.05, 0.17]) |
move_step_linear | array double (default [0.01, 0.01, 0.01]) |
step_duration_secs | double (default 0.1) |
Joy Joint Teleop Node Config
Joy Joint Teleop Node Config | |
---|---|
joint_step | double (default 0.02) |
mode | string (required) |
step_duration_secs | double (default 0.1) |
Robot Command Config
Robot Command Config | |
---|---|
file_path | string (required) |
name | string (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_id | uint (default 0) |
map | Map |
Map
Map | |
---|---|
axis_map | array GilrsAxis Axis |
axis_value_map | array Axis double |
button_map | array GilrsButton Button |
Gilrs
との比較表はこのようになります。使用するJoystickにより異なりますので参考までに。特別にこのボタンやスティックを割り当てたいという場合はteleop_configのファイルに例に習って対応付けることでキーを変更できます。
ボタンやスティックのレイアウトはgilrs layoutに従っています。
Comparison table between GilrsAxis
and Axis
GilrsAxis | Axis | |
---|---|---|
"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
GilrsButton | Button | |
---|---|---|
"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 Config | Description | |
---|---|---|
args | string | Arguments passed when creating this instance. |
args_from_path | string | Pass the contents of the specified file as an argument. |
path | string (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_teleop
をarci-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
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にその問題を投稿してくださると助かります。