ROS1を使ってみる その3(Open Manipulatorの操作、Node-RED)
はじめに
今回はOpen ManipulatorのROS Serviceでの制御を確認し、Node-REDのノードでも操作してみました。
ROS Serviceを扱うのははじめてです。データ形式がややこしくてまだ完全には理解していませんが、とりあえず動かすことはできました。
▼今回もWSL2のUbuntu 20.04の環境で実行しています。
▼以前の記事はこちら
WSL2環境とU2D2を接続する
WSL2でUbuntu 20.04の環境を構築したときの記事でも書いていたのですが、WSL2環境でUSBデバイスを使うには少し手順を踏む必要があります。エラーが出なくて気づきにくいことなので、Open Manipulatorを操作するための電子部品であるU2D2と接続するまでの手順を再掲しておきます。
usbipdをインストールしていない場合は、まずインストールしてください。
▼こちらからmsiファイルをダウンロードして実行すると、インストールが始まります。
https://github.com/dorssel/usbipd-win/releases/tag/v4.2.0
WindowsのPowerShellでコマンドを実行していきます。管理者権限で起動しておいてください。
▼接続中のUSBデバイスを確認するコマンドはこちら
usbipd list
▼この後のコマンドを実行した状態ですが、USB Serial ConverterがU2D2です。
今回の場合、左に書いてあるBUSIDが1-2です。コマンドでこのBUSIDに対するUSBデバイスを共有します。
▼busidは状況に合わせて変更してください。
usbipd bind --busid <busid>
▼実行してみると以下の警告が表示されていました。
usbipd: warning: USB filter 'USBPcap' is known to be incompatible with this software; 'bind --force' will be required.
▼--forceをつけて実行すると警告は表示されていませんでした。
▼以下のコマンドでWSL2に接続したディストリビューションでも接続できるようにします。
usbipd attach --wsl --busid <busid>
この状態でUbuntuのターミナルを開き、lsusbを実行すると接続されていることが確認できました。
▼接続前と接続後の画像です。ちゃんと接続できていました。
USBを抜いてもう一度接続する場合は、再度コマンドを実行する必要があります。
これでU2D2がUbuntu環境でも認識されたので、Open Manipulatorへ電源を供給してから、以下のコマンドで接続します。
roslaunch open_manipulator_controller open_manipulator_controller.launch
▼U2D2に接続できると、LEDが点灯します。
Topicを確認する
Open Manipulatorのメッセージについては、e-ManualのMessage listのページにまとめられていました。まずはTopicについて確認してみました。
▼こちらのページです。
https://emanual.robotis.com/docs/en/platform/openmanipulator_x/ros_controller_msg/#topic
以下のコマンドで起動するOpen ManipulatorのGUIコントローラの画面と照らし合わせてみました。
roslaunch open_manipulator_control_gui open_manipulator_control_gui.launch
▼Timer Startを選択すると、現在のジョイント角度などを取得できます。
以下のコマンドでrostopicを確認してみます。
rostopic list
▼/gripper/kinematics_poseや/joint_statesなどがあります。
以下のコマンドを実行すると、ジョイントの状態が表示されます。
rostopic echo /joint_states
▼joint1~4とgripperのpositionやvelocity、effortが表示されています。
rqt
での表示も確認してみました。
▼Node Graphではノードの関係が表示されました。
▼Nodes onlyをNodes/Topics(all)に変更すると、Topicも表示されました。
▼Topic Monitorでそれぞれの値を見ることができました。
Serviceで操作する
次にOpen ManipulatorのServiceのメッセージについて確認しました。
▼Serviceの欄に書かれていますが、Open ManipulatorやDynamixelを操作するためのメッセージだそうです。
https://emanual.robotis.com/docs/en/platform/openmanipulator_x/ros_controller_msg/#service
rosserviceのlistを確認してみました。
rosservice list
▼ROBOTISのe-ManualにあったService名が並んでいます。
Open ManipulatorのServiceについて書かれたページのRequestを参照しつつ、/goal_joint_space_pathについてChatGPTにどういった形式で送信すればいいのか相談してみました。
以下の形式で、init poseに移動しました。
rosservice call /goal_joint_space_path "planning_group: 'arm'
joint_position:
joint_name: ['joint1', 'joint2', 'joint3', 'joint4']
position: [0.0, 0.0, 0.0, 0.0]
max_accelerations_scaling_factor: 0.2
max_velocity_scaling_factor: 0.2
path_time: 2.0"
is_planned: True
▼positionの値を変更すると、移動しました。
▼rqtでも/goal_joint_space_pathを確認すると、同じ値を指定するようになっていました。
/goal_task_space_pathについても試してみました。以下の形式で動かすことができました。
rosservice call /goal_task_space_path "planning_group: 'arm'
end_effector_name: 'gripper'
kinematics_pose:
pose:
position:
x: 0.3
y: 0.0
z: 0.2
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
max_accelerations_scaling_factor: 0.2
max_velocity_scaling_factor: 0.2
tolerance: 0.01
path_time: 2.0"
▼四捨五入されているようですが、positionはGUIコントローラの値と符合しています。
Node-REDで操作してみる
ros callSrvノードで操作する
これまで試していたことを元に、Node-REDのrosノードで操作してみました。rosservice callを実行する、ros callSrvノードを利用して操作します。
▼rosノードはTurtlesimのカメを操作したときの記事でも利用しています。
rosノードはROS Bridgeを利用する前提なので、インストールして実行しておきます。
▼ROS Bridgeのインストールについては以前の記事をご覧ください。WSL2のUbuntuで実行しても、WindowsのNode-REDと通信できます。
インストールされていれば、以下のコマンドでROS Bridgeを実行できます。
roslaunch rosbridge_server rosbridge_websocket.launch
フローを作成して、実行してみました。
▼全体のフローはこちら
[{"id":"8f41f9de823e1ba5","type":"ros-call-service","z":"6f967b24d95ab8d8","server":"ed72b9d48a11624b","servicename":"/goal_joint_space_path","srvtype":"/open_manipulator_msgs/SetJointPosition","x":370,"y":1480,"wires":[["da279563e24a6007"]]},{"id":"479e1594762289d6","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"planning_group\":\"arm\",\"joint_position\":{\"joint_name\":[\"joint1\",\"joint2\",\"joint3\",\"joint4\",\"joint5\"],\"position\":[0,0,0,0,0.2],\"max_accelerations_scaling_factor\":0.2,\"max_velocity_scaling_factor\":0.2},\"path_time\":2}","payloadType":"json","x":170,"y":1480,"wires":[["8f41f9de823e1ba5"]]},{"id":"3a44bd2db588f3ce","type":"debug","z":"6f967b24d95ab8d8","name":"debug 134","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":1480,"wires":[]},{"id":"da279563e24a6007","type":"json","z":"6f967b24d95ab8d8","name":"","property":"payload","action":"","pretty":false,"x":570,"y":1480,"wires":[["3a44bd2db588f3ce"]]},{"id":"ed72b9d48a11624b","type":"ros-server","url":"ws://localhost:9090"}]
/goal_joint_space_pathからのResponseを一度jsonノードでパースしています。
▼injectノードの中には、JSON形式で先程送信したような値を指定しています。
Gripperがjoint5になるのかなと思って入れてみたのですが、関係ないようです。
▼ros callSrvノードには、サーバーとService名、Typeを指定しています。
この状態でinjectノードを実行すると、injectノードで指定したpositionに移動しました。
dashboardノードで操作する
dashboardノードのスライドバーで操作できるようにフローを作成してみました。
▼全体のフローはこちら
[{"id":"8f41f9de823e1ba5","type":"ros-call-service","z":"6f967b24d95ab8d8","server":"ed72b9d48a11624b","servicename":"/goal_joint_space_path","srvtype":"/open_manipulator_msgs/SetJointPosition","x":370,"y":1480,"wires":[["da279563e24a6007"]]},{"id":"479e1594762289d6","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"planning_group\":\"arm\",\"joint_position\":{\"joint_name\":[\"joint1\",\"joint2\",\"joint3\",\"joint4\",\"joint5\"],\"position\":[0,0,0,0,0.2],\"max_accelerations_scaling_factor\":0.2,\"max_velocity_scaling_factor\":0.2},\"path_time\":2}","payloadType":"json","x":170,"y":1480,"wires":[["8f41f9de823e1ba5"]]},{"id":"3a44bd2db588f3ce","type":"debug","z":"6f967b24d95ab8d8","name":"debug 134","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":1480,"wires":[]},{"id":"da279563e24a6007","type":"json","z":"6f967b24d95ab8d8","name":"","property":"payload","action":"","pretty":false,"x":570,"y":1480,"wires":[["3a44bd2db588f3ce"]]},{"id":"dcfcb55122a8a36e","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint1","tooltip":"","group":"feb35b11ee041e6f","order":2,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-5","max":"5","step":"0.01","className":"","x":370,"y":1580,"wires":[["07734bb16001a3f1"]]},{"id":"425bc72592482c9b","type":"template","z":"6f967b24d95ab8d8","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"planning_group\": \"arm\",\n \"joint_position\": {\n \"joint_name\": [\n \"joint1\",\n \"joint2\",\n \"joint3\",\n \"joint4\"\n ],\n \"position\": [\n {{flow.joint1}},\n {{flow.joint2}},\n {{flow.joint3}},\n {{flow.joint4}}\n ],\n \"max_accelerations_scaling_factor\": 0.2,\n \"max_velocity_scaling_factor\": 0.2\n },\n \"path_time\": 2\n}","output":"json","x":880,"y":1640,"wires":[["34838df78b278cea","8f41f9de823e1ba5"]]},{"id":"f9da865143844478","type":"ui_button","z":"6f967b24d95ab8d8","name":"","group":"feb35b11ee041e6f","order":1,"width":0,"height":0,"passthru":false,"label":"Reset","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"0","payloadType":"num","topic":"topic","topicType":"msg","x":170,"y":1580,"wires":[["0463344ba8fe1cf7"]]},{"id":"37041bcb171e58f8","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":170,"y":1540,"wires":[["0463344ba8fe1cf7"]]},{"id":"baa81914cb8b3ec4","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint2","tooltip":"","group":"feb35b11ee041e6f","order":4,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-5","max":"5","step":"0.01","className":"","x":370,"y":1620,"wires":[["b3bb81f43468b442"]]},{"id":"4e7e77f054167f08","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint3","tooltip":"","group":"feb35b11ee041e6f","order":6,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-5","max":"5","step":"0.01","className":"","x":370,"y":1660,"wires":[["729cceabf2bf318e"]]},{"id":"766a1a0f6dc17a61","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint4","tooltip":"","group":"feb35b11ee041e6f","order":8,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-5","max":"5","step":"0.01","className":"","x":370,"y":1700,"wires":[["191443d0ba5379ef"]]},{"id":"7b43c4d4b9b48b4a","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":3,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1580,"wires":[]},{"id":"5dd050417b082e13","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":5,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1620,"wires":[]},{"id":"891cf2e2833b2309","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":7,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1660,"wires":[]},{"id":"296b0e4bf0dbbaae","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":9,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1700,"wires":[]},{"id":"07734bb16001a3f1","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint1","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1580,"wires":[["7b43c4d4b9b48b4a","0107bb6a1505eaad"]]},{"id":"b3bb81f43468b442","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint2","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1620,"wires":[["5dd050417b082e13","0107bb6a1505eaad"]]},{"id":"729cceabf2bf318e","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint3","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1660,"wires":[["891cf2e2833b2309","0107bb6a1505eaad"]]},{"id":"191443d0ba5379ef","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint4","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1700,"wires":[["296b0e4bf0dbbaae","0107bb6a1505eaad"]]},{"id":"34838df78b278cea","type":"debug","z":"6f967b24d95ab8d8","name":"debug 135","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":890,"y":1700,"wires":[]},{"id":"0463344ba8fe1cf7","type":"junction","z":"6f967b24d95ab8d8","x":260,"y":1580,"wires":[["dcfcb55122a8a36e","baa81914cb8b3ec4","4e7e77f054167f08","766a1a0f6dc17a61"]]},{"id":"0107bb6a1505eaad","type":"junction","z":"6f967b24d95ab8d8","x":800,"y":1640,"wires":[["425bc72592482c9b"]]},{"id":"ed72b9d48a11624b","type":"ros-server","url":"ws://localhost:9090"},{"id":"feb35b11ee041e6f","type":"ui_group","name":"Open Manipulator","tab":"7f2b0e1192b72dcc","order":2,"disp":true,"width":8,"collapse":false,"className":""},{"id":"7f2b0e1192b72dcc","type":"ui_tab","name":"ROS","icon":"dashboard","disabled":false,"hidden":false}]
一番上のフローは先程と同じで、injectノードに設定していたJSON形式のデータを、templateノードで変数を代入してJSON形式で渡すようにしています。
▼changeノードでスライドバーの値を一旦flow変数に代入しています。
▼templateノードでflow変数の値をpositionの部分に代入しています。
▼ダッシュボード画面にアクセスすると、以下のような画面が表示されます。
実際に動かしてみました。
▼最大値と最小値が大きいので、調整する必要がありそうです。
Open Manipulatorをキーボードで操作したときはゆっくりだったのですが、今回はスライダーで値を変えやすかったので動きも早かったです。そんな速度で動かせるのか...という感じでした。
最大値と最小値を調整して、/goal_task_space_pathについても追加してみました。しかし、orientationが操作できなかったり、途中で操作できなくなることがありました。
/goal_task_space_pathのpositionについては動かすことができました。
▼作成してみた全体のフローはこちら
[{"id":"8f41f9de823e1ba5","type":"ros-call-service","z":"6f967b24d95ab8d8","server":"ed72b9d48a11624b","servicename":"/goal_joint_space_path","srvtype":"/open_manipulator_msgs/SetJointPosition","x":370,"y":1480,"wires":[["da279563e24a6007"]]},{"id":"479e1594762289d6","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"planning_group\":\"arm\",\"joint_position\":{\"joint_name\":[\"joint1\",\"joint2\",\"joint3\",\"joint4\"],\"position\":[0,0,0,0],\"max_accelerations_scaling_factor\":0.2,\"max_velocity_scaling_factor\":0.2},\"path_time\":2}","payloadType":"json","x":170,"y":1480,"wires":[["8f41f9de823e1ba5"]]},{"id":"3a44bd2db588f3ce","type":"debug","z":"6f967b24d95ab8d8","name":"debug 134","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":1480,"wires":[]},{"id":"da279563e24a6007","type":"json","z":"6f967b24d95ab8d8","name":"","property":"payload","action":"","pretty":false,"x":570,"y":1480,"wires":[["3a44bd2db588f3ce","ce7304fd44f0aecb"]]},{"id":"dcfcb55122a8a36e","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint1","tooltip":"","group":"feb35b11ee041e6f","order":2,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-2","max":"2","step":"0.01","className":"","x":370,"y":1580,"wires":[["07734bb16001a3f1"]]},{"id":"425bc72592482c9b","type":"template","z":"6f967b24d95ab8d8","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"planning_group\": \"arm\",\n \"joint_position\": {\n \"joint_name\": [\n \"joint1\",\n \"joint2\",\n \"joint3\",\n \"joint4\"\n ],\n \"position\": [\n {{flow.joint1}},\n {{flow.joint2}},\n {{flow.joint3}},\n {{flow.joint4}}\n ],\n \"max_accelerations_scaling_factor\": 0.2,\n \"max_velocity_scaling_factor\": 0.2\n },\n \"path_time\": 2\n}","output":"json","x":880,"y":1640,"wires":[["34838df78b278cea","8f41f9de823e1ba5"]]},{"id":"f9da865143844478","type":"ui_button","z":"6f967b24d95ab8d8","name":"","group":"feb35b11ee041e6f","order":1,"width":0,"height":0,"passthru":false,"label":"Reset","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"0","payloadType":"num","topic":"topic","topicType":"msg","x":170,"y":1580,"wires":[["0463344ba8fe1cf7"]]},{"id":"37041bcb171e58f8","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":170,"y":1540,"wires":[["0463344ba8fe1cf7"]]},{"id":"baa81914cb8b3ec4","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint2","tooltip":"","group":"feb35b11ee041e6f","order":4,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":370,"y":1620,"wires":[["b3bb81f43468b442"]]},{"id":"4e7e77f054167f08","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint3","tooltip":"","group":"feb35b11ee041e6f","order":6,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":370,"y":1660,"wires":[["729cceabf2bf318e"]]},{"id":"766a1a0f6dc17a61","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"joint4","tooltip":"","group":"feb35b11ee041e6f","order":8,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":370,"y":1700,"wires":[["191443d0ba5379ef"]]},{"id":"7b43c4d4b9b48b4a","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":3,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1580,"wires":[]},{"id":"5dd050417b082e13","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":5,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1620,"wires":[]},{"id":"891cf2e2833b2309","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":7,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1660,"wires":[]},{"id":"296b0e4bf0dbbaae","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":9,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":710,"y":1700,"wires":[]},{"id":"07734bb16001a3f1","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint1","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1580,"wires":[["7b43c4d4b9b48b4a","0107bb6a1505eaad"]]},{"id":"b3bb81f43468b442","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint2","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1620,"wires":[["5dd050417b082e13","0107bb6a1505eaad"]]},{"id":"729cceabf2bf318e","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint3","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1660,"wires":[["891cf2e2833b2309","0107bb6a1505eaad"]]},{"id":"191443d0ba5379ef","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"joint4","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1700,"wires":[["296b0e4bf0dbbaae","0107bb6a1505eaad"]]},{"id":"34838df78b278cea","type":"debug","z":"6f967b24d95ab8d8","name":"debug 135","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":1700,"wires":[]},{"id":"25ec2b2b04914fa9","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"position x","tooltip":"","group":"370141ee5ae50eac","order":2,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":540,"y":1940,"wires":[["e11a6d416c0901d0"]]},{"id":"72972c63d86ca9bf","type":"template","z":"6f967b24d95ab8d8","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n \"planning_group\": \"arm\",\n \"end_effector_name\": \"gripper\",\n \"kinematics_pose\": {\n \"pose\": {\n \"position\": {\n \"x\": {{flow.position.x}},\n \"y\": {{flow.position.y}},\n \"z\": {{flow.position.z}}\n },\n \"orientation\": {\n \"x\": {{flow.orientation.x}},\n \"y\": {{flow.orientation.y}},\n \"z\": {{flow.orientation.z}},\n \"w\": {{flow.orientation.w}}\n }\n },\n \"max_accelerations_scaling_factor\": 0.2,\n \"max_velocity_scaling_factor\": 0.2,\n \"tolerance\": 0.01\n },\n \"path_time\": 3\n}","output":"json","x":1120,"y":2000,"wires":[["8e5691b37c708c6f","de5f0ae045e1366d"]]},{"id":"776434583f9228fa","type":"ui_button","z":"6f967b24d95ab8d8","name":"","group":"370141ee5ae50eac","order":1,"width":0,"height":0,"passthru":false,"label":"Reset","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"0","payloadType":"num","topic":"topic","topicType":"msg","x":170,"y":1940,"wires":[["104a18439262bd3f"]]},{"id":"a90544951376b64a","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":170,"y":1900,"wires":[["104a18439262bd3f"]]},{"id":"506ca36e69c11970","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"position y","tooltip":"","group":"370141ee5ae50eac","order":4,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":540,"y":1980,"wires":[["dae8ea9d501f3734"]]},{"id":"ed6420ef2e2a80ce","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"position z","tooltip":"","group":"370141ee5ae50eac","order":6,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":540,"y":2020,"wires":[["95029b5476ae8493"]]},{"id":"f3c5c8c146c7923e","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"orientation x","tooltip":"","group":"370141ee5ae50eac","order":8,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":550,"y":2060,"wires":[["1ed1212ab4b20886"]]},{"id":"0ecdd56b4d4698a3","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":3,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":1940,"wires":[]},{"id":"46b8620fb686ee27","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":5,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":1980,"wires":[]},{"id":"01cd87aae344cc3d","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":7,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":2020,"wires":[]},{"id":"f73d8f82b3c4bd55","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":9,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":2060,"wires":[]},{"id":"e11a6d416c0901d0","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"position.x","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":1940,"wires":[["0ecdd56b4d4698a3","b9e3d49ece89c8a4"]]},{"id":"dae8ea9d501f3734","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"position.y","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":1980,"wires":[["46b8620fb686ee27","b9e3d49ece89c8a4"]]},{"id":"95029b5476ae8493","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"position.z","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":2020,"wires":[["01cd87aae344cc3d","b9e3d49ece89c8a4"]]},{"id":"1ed1212ab4b20886","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"orientation.x","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":2060,"wires":[["f73d8f82b3c4bd55","b9e3d49ece89c8a4"]]},{"id":"8e5691b37c708c6f","type":"debug","z":"6f967b24d95ab8d8","name":"debug 181","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1150,"y":2060,"wires":[]},{"id":"de5f0ae045e1366d","type":"ros-call-service","z":"6f967b24d95ab8d8","server":"ed72b9d48a11624b","servicename":"/goal_task_space_path","srvtype":"open_manipulator_msgs/SetKinematicsPose","x":370,"y":1840,"wires":[["0aa9332e1639fd2b"]]},{"id":"09feb964dc8de1ee","type":"inject","z":"6f967b24d95ab8d8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"planning_group\":\"arm\",\"end_effector_name\":\"gripper\",\"kinematics_pose\":{\"pose\":{\"position\":{\"x\":0.3,\"y\":0,\"z\":0.2},\"orientation\":{\"x\":0,\"y\":0,\"z\":0,\"w\":1}},\"max_accelerations_scaling_factor\":0.2,\"max_velocity_scaling_factor\":0.2,\"tolerance\":0.01},\"path_time\":2}","payloadType":"json","x":170,"y":1840,"wires":[["de5f0ae045e1366d"]]},{"id":"9e374e724b5bba48","type":"debug","z":"6f967b24d95ab8d8","name":"debug 182","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":1840,"wires":[]},{"id":"0aa9332e1639fd2b","type":"json","z":"6f967b24d95ab8d8","name":"","property":"payload","action":"","pretty":false,"x":570,"y":1840,"wires":[["9e374e724b5bba48","11fdaf3f62dafcbe"]]},{"id":"7061fcd28d3bc8ee","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"orientation y","tooltip":"","group":"370141ee5ae50eac","order":10,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":550,"y":2100,"wires":[["06a539f355e8b841"]]},{"id":"017a979fa19eb752","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":11,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":2100,"wires":[]},{"id":"06a539f355e8b841","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"orientation.y","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":2100,"wires":[["017a979fa19eb752","b9e3d49ece89c8a4"]]},{"id":"639e0ba51e3f2e02","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"orientation z","tooltip":"","group":"370141ee5ae50eac","order":12,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":550,"y":2140,"wires":[["d43c9f346943db9b"]]},{"id":"554c8f22ab0522c9","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":13,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":2140,"wires":[]},{"id":"d43c9f346943db9b","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"orientation.z","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":2140,"wires":[["554c8f22ab0522c9","b9e3d49ece89c8a4"]]},{"id":"660ab8fa70c1bcef","type":"ui_slider","z":"6f967b24d95ab8d8","name":"","label":"orientation w","tooltip":"","group":"370141ee5ae50eac","order":14,"width":6,"height":1,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":"-1","max":"1","step":"0.01","className":"","x":550,"y":2180,"wires":[["9b25e8b811538060"]]},{"id":"9e7765a85fc96e85","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":15,"width":2,"height":1,"name":"","label":"","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":930,"y":2180,"wires":[]},{"id":"9b25e8b811538060","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"orientation.w","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":2180,"wires":[["9e7765a85fc96e85","b9e3d49ece89c8a4"]]},{"id":"b67794d74686a4de","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"0.3","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":1940,"wires":[["25ec2b2b04914fa9"]]},{"id":"968ffebd2aa4faa5","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"0.2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2020,"wires":[["ed6420ef2e2a80ce"]]},{"id":"1940478d951f316b","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2180,"wires":[["660ab8fa70c1bcef"]]},{"id":"7bddbb4c63362e5e","type":"ui_text","z":"6f967b24d95ab8d8","group":"feb35b11ee041e6f","order":11,"width":4,"height":1,"name":"","label":"is_planned","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1070,"y":1520,"wires":[]},{"id":"bd2b746d4f1637d4","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.is_planned","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":1520,"wires":[["7bddbb4c63362e5e"]]},{"id":"ce7304fd44f0aecb","type":"json","z":"6f967b24d95ab8d8","name":"","property":"payload","action":"","pretty":false,"x":710,"y":1520,"wires":[["bd2b746d4f1637d4"]]},{"id":"357f7d0b44d011a5","type":"ui_text","z":"6f967b24d95ab8d8","group":"370141ee5ae50eac","order":17,"width":4,"height":1,"name":"","label":"is_planned","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1070,"y":1880,"wires":[]},{"id":"d8aff2796641af5c","type":"change","z":"6f967b24d95ab8d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.is_planned","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":1880,"wires":[["357f7d0b44d011a5"]]},{"id":"11fdaf3f62dafcbe","type":"json","z":"6f967b24d95ab8d8","name":"","property":"payload","action":"","pretty":false,"x":710,"y":1880,"wires":[["d8aff2796641af5c"]]},{"id":"0463344ba8fe1cf7","type":"junction","z":"6f967b24d95ab8d8","x":260,"y":1580,"wires":[["dcfcb55122a8a36e","baa81914cb8b3ec4","4e7e77f054167f08","766a1a0f6dc17a61"]]},{"id":"0107bb6a1505eaad","type":"junction","z":"6f967b24d95ab8d8","x":800,"y":1640,"wires":[["425bc72592482c9b"]]},{"id":"104a18439262bd3f","type":"junction","z":"6f967b24d95ab8d8","x":260,"y":1940,"wires":[["506ca36e69c11970","f3c5c8c146c7923e","7061fcd28d3bc8ee","639e0ba51e3f2e02","b67794d74686a4de","968ffebd2aa4faa5","1940478d951f316b"]]},{"id":"b9e3d49ece89c8a4","type":"junction","z":"6f967b24d95ab8d8","x":1020,"y":2000,"wires":[["72972c63d86ca9bf"]]},{"id":"ed72b9d48a11624b","type":"ros-server","url":"ws://localhost:9090"},{"id":"feb35b11ee041e6f","type":"ui_group","name":"Open Manipulator Joint","tab":"7f2b0e1192b72dcc","order":2,"disp":true,"width":"8","collapse":false,"className":""},{"id":"370141ee5ae50eac","type":"ui_group","name":"Open Manipulator Task","tab":"7f2b0e1192b72dcc","order":3,"disp":true,"width":8,"collapse":false,"className":""},{"id":"7f2b0e1192b72dcc","type":"ui_tab","name":"ROS","icon":"dashboard","disabled":false,"hidden":false}]
最後に
Gripperも制御したかったのですが、Serviceでの制御方法がすぐに見つかりませんでした。見つかったらまた試してみようと思います。
送信するデータ形式が複雑で、そこが使いにくいなと感じました。Open Manipulatorをキーボードで操作したときもそうだったのですが、操作ができなくなることが多いのも困りどころです。
ROSからNode-REDを経由してUnreal Engineに送信することはできていたので、逆にUnreal Engineの入力からロボットを操作できそうだなと考えています。リアルなデジタルツインに近づいていきそうです。