Open26

Windows機にデュアルブートでUbuntu 18.04を入れてROSとmyCobotを動かす

yuji_miyanoyuji_miyano

myCobotのリポジトリをクローンしてビルドした。
以下のURLに沿って、moveitをインストールした。
ここには書いてないプロセスとして、python2のpipを入れてpymycobotをインストールした。

sudo apt install python-pip
pip install pymycobot

https://note.com/npaka/n/ncd8cb4efcfc0

yuji_miyanoyuji_miyano

テストを実行したらエラーがでた。

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 20, in <module>
    mycobot = MyCobot(port)
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/pymycobot/mycobot.py", line 59, in __init__
    self._serial_port = serial.Serial(port, baudrate, timeout=timeout)
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/serial/serialutil.py", line 244, in __init__
    self.open()
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/serial/serialposix.py", line 325, in open
    raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB*: [Errno 2] No such file or directory: '/dev/ttyUSB*'

前回もあったが、新しいmyCobotだとUSBの

/dev/ttyUSB

ではなく

/dev/ttyACM

となるのでtest.pyの該当部分を変更した。
確認するためにはmyCobotを接続して

ls /dev/ttyACM

と入れるとACM0なのかACM1なのかが確認可能。

yuji_miyanoyuji_miyano

再びtest.pyを実行すると今度は権限のエラーが出た。

s$ python test.py 
Traceback (most recent call last):
  File "test.py", line 20, in <module>
    mycobot = MyCobot(port)
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/pymycobot/mycobot.py", line 59, in __init__
    self._serial_port = serial.Serial(port, baudrate, timeout=timeout)
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/serial/serialutil.py", line 244, in __init__
    self.open()
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/serial/serialposix.py", line 325, in open
    raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'

以下のURLを参考に

sudo chmod 666 /dev/ttyACM0

を実行したらエラーなく動き出した。が、急に動き出して焦った。
https://qiita.com/OTL/items/258ff311cbd8d9ba3b6e

yuji_miyanoyuji_miyano

githubに従ってみる。

$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ws/src
$ cd ws
$ wstool init src
$ wstool set -t src jog_control --git http://github.com/tork-a/jog_control
$ wstool update -t src
$ rosdep install -r --from-path src --ignore-src
$ catkin build
$ source devel/setup.bash

https://github.com/tork-a/jog_control

yuji_miyanoyuji_miyano

https://github.com/elephantrobotics/mycobot_ros

myCobot公式のrosリポジトリの場合、moveitを起動させる場合はどうすればいいのか、、。

roslaunch mycobot_320 mycobot_320_slider.launch

を実行しても

RLException: [mycobot_320_slider.launch] is neither a launch file in package [mycobot_320] nor is [mycobot_320] a launch file name
The traceback for the exception was written to the log file

となってしまう。

以下を起動したら実行できた。良かった。

$ source ~/catkin_ws/devel/setup.bash
$ sudo echo 'source ~/catkin_ws/devel/setup.bash' >> ~/.bashrc
yuji_miyanoyuji_miyano

https://github.com/Tiryoh/mycobot_ros

上記のリポジトリをビルドしてみる。

cd ~/catkin_ws/src
git clone https://github.com/Tiryoh/mycobot_ros.git
rosdep install -r -y -i --from-paths .
catkin build
source ~/catkin_ws/devel/setup.bash

以下のコマンドでmoveitは起動したけどjogの起動させ方が分からない。

roslaunch mycobot_move_it_config demo.launch
tiryohtiryoh

MoveIt関連で検索してたら偶然見かけたのでコメントです!
jog_controlを使うにはjog_launchにyamlとlaunchを作成する必要があります。
https://github.com/tork-a/jog_control/pull/43/files
上記は違うロボット対応用のプルリクエストですが、これ参考にmyCobot用の設定を作ったら動くかもしれません。

yuji_miyanoyuji_miyano

わー、コメントありがとうございます!
大変お世話になってます!
いただいたプルリクエスト見てみます

yuji_miyanoyuji_miyano

https://github.com/nisshan-x/mycobot_moveit

Tiryohさんのリポジトリはすでにクローンしているので、nisshan-xさんのリポジトリもクローンしてビルドしてみる。

cd catkin_ws/src
git clone https://github.com/nisshan-x/mycobot_moveit
rosdep update
rosdep install -i --from-paths mycobot_moveit
catkin build
source ~/catkin_ws/devel/setup.bash

実行

roslaunch mycobot_moveit mycobot_moveit_control.launch
yuji_miyanoyuji_miyano

https://github.com/tork-a/jog_control/issues/32

自分が勘違いしてたのが、インストールフォルダをcatkin_ws/scとして作ってるならそこにクローンしないといけないのに、別にws/srcを作っていしまっていたからっぽい。

$ cd catkin_ws
$ wstool init src
$ wstool set -t src jog_control --git http://github.com/tork-a/jog_control
$ wstool update -t src
$ rosdep install -r --from-path src --ignore-src
$ catkin build
$ source devel/setup.bash

実行するにはこうなのか?と思ってやってみたけどダメだった。

$ roslaunch jog_launch mycobot_moveit_control.launch
RLException: [mycobot_moveit_control.launch] is neither a launch file in package [jog_launch] nor is [jog_launch] a launch file name
The traceback for the exception was written to the log file

myCobotの前にUR3で試してみる。

yuji_miyanoyuji_miyano

ちゃんとチュートリアルを読んでみる。

https://github.com/tork-a/tork_moveit_tutorial/releases/download/0.1.1/tork_moveit_tutorial-melodic-0.1.1.pdf

TR1をインストールしている途中の、

sudo apt-get install ros-melodic-minas

でパッケージがないと言われたので、その下に載っていた推奨されない方法2.3 ソースインストールというものを試してみた。

NEXTAGEはMoveitで起動した。

roslaunch nextage_moveit_config nextage_demo.launch

TR1もMoveitで起動した。
1つ目のターミナルで以下のコマンド。

roslaunch tra1_bringup tra1_bringup.launch simulation:=true

2つ目のターミナルで以下のコマンド。

roslaunch tra1_bringup tra1_moveit.launch
yuji_miyanoyuji_miyano

上のチュートリアルに沿ってelephant roboticsの公式のリポジトリをクローンしてきたものだとエラーが出ずに動いた。

 roslaunch mycobot_320_moveit demo.launch

yuji_miyanoyuji_miyano

持っているのは280で以下を実行してみる。

 roslaunch  mycobot_280_moveit demo.launch

320のときのサンプルプログラムを実行してみた。

#!/usr/bin/env python

from tork_moveit_tutorial import *

if __name__ == '__main__':
    init_node()

    group = MoveGroupCommander("arm_group")
    # Pose Target 1
    rospy.loginfo( "Start Pose Target 1")
    pose_target_1 = Pose()

    pose_target_1.position.x = 0.3
    pose_target_1.position.y = 0.0
    pose_target_1.position.z = 0.3
    pose_target_1.orientation.x = 0.0
    pose_target_1.orientation.y = 0.0
    pose_target_1.orientation.z = -0.7071
    pose_target_1.orientation.w =  0.7071

    rospy.loginfo( "Set Target to Pose:\n{}".format( pose_target_1 ) )
    group.set_pose_target( pose_target_1 )
    group.go()

    # Pose Target 2
    rospy.loginfo( "Start Pose Target 2")
    pose_target_2 = Pose()

    pose_target_2.position.x = 0.0
    pose_target_2.position.y =-0.3
    pose_target_2.position.z = 0.3
    pose_target_2.orientation.z = -0.7071
    pose_target_2.orientation.w =  0.7071

    rospy.loginfo( "Set Target to Pose:\n{}".format( pose_target_2 ) )
    group.set_pose_target( pose_target_2 )
    group.go()

https://github.com/tork-a/tork_moveit_tutorial/blob/indigo-devel/doc/moveit-tutorial_ja_robot-python_basic.md

こんな感じのエラーが出た。

[ INFO] [1647236237.972390422]: Loading robot model 'firefighter'...
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647236238.005035711]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint1.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647236238.025555161]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint1.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647236238.047605697]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint2.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
....
yuji_miyanoyuji_miyano

エラーが出つつも対話式で動いてはいる。

In [1]: group = MoveGroupCommander("arm_group")
[ INFO] [1647237228.223919781]: Loading robot model 'firefighter'...
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.242774742]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint1.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.263756863]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint1.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.287701717]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint2.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.307569040]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint2.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.328938710]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint3.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.349853764]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint3.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.371958165]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint4.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.392872138]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint4.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.414844941]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint5.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.434413108]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint5.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.455360083]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint6.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.482155052]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint6.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.506900108]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint7.dae]: Package [mycobot_description] does not exist
[rospack] Error: package 'mycobot_description' not found
[librospack]: error while executing command
[ERROR] [1647237228.529450084]: Error retrieving file [package://mycobot_description/urdf/mycobot/joint7.dae]: Package [mycobot_description] does not exist
[ WARN] [1647237228.529567616]: No geometry is associated to any robot links
[ INFO] [1647237229.502301455]: Ready to take commands for planning group arm_group.

In [2]: group.get_joints()
Out[2]: 
['joint2_to_joint1',
 'joint3_to_joint2',
 'joint4_to_joint3',
 'joint5_to_joint4',
 'joint6_to_joint5',
 'joint6output_to_joint6']

In [3]: group.set_joint_value_target('joint2_to_joint1', -2.0)

In [4]: group.go()
Out[4]: True

yuji_miyanoyuji_miyano

動作範囲かなと思い、0.3とあったものを0.1にした別ファイルを実行しようとしたらエラーが出た。

$ source /opt/ros/melodic/setup.bash
$ rosrun tork_moveit_tutorial mycobot280_moveit_tutorial_poses.py 
[rosrun] Couldn't find executable named mycobot280_moveit_tutorial_poses.py below /opt/ros/melodic/share/tork_moveit_tutorial

なるほど、自分で適当に保存したフォルダではなくて /opt/ros/melodic/share/tork_moveit_tutorial を参照していたのか。名前を変えていないファイルが動いたのもここに同じ名前のサンプルが保存されていたからだったっぽい。

上記のフォルダにsudoでコピーしたファイルを編集したら動いた。

sudo cp mycobot_moveit_tutorial_poses.py mycobot280_moveit_tutorial_poses.py 
$ sudo vim mycobot280_moveit_tutorial_poses.py 
yuji_miyanoyuji_miyano

実機で動かすにはどうするのか。
https://github.com/elephantrobotics/mycobot_ros/issues/53

このあたりを見ると

rosrun mycobot_280 slider_control.py _port:=/dev/ttyACM0 _baud:=115200

で動きそうに思ったがダメだった。

$ rosrun mycobot_280 slider_control.py _port:=/dev/ttyACM0 _baud:=115200
('/dev/ttyACM0', 115200)
Traceback (most recent call last):
  File "/home/miyano-yuji/catkin_ws/src/mycobot_ros/mycobot_280/scripts/slider_control.py", line 48, in <module>
    listener()
  File "/home/miyano-yuji/catkin_ws/src/mycobot_ros/mycobot_280/scripts/slider_control.py", line 40, in listener
    mc = MyCobot(port, baud)
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/pymycobot/mycobot.py", line 59, in __init__
    self._serial_port = serial.Serial(port, baudrate, timeout=timeout)
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/serial/serialutil.py", line 244, in __init__
    self.open()
  File "/home/miyano-yuji/.local/lib/python2.7/site-packages/serial/serialposix.py", line 325, in open
    raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'

ls /dev/tty でタブを押してもACMが出てこない。lsusb だと出てくる。
Bus 001 Device 016: ID 1a86:55d4 QinHeng Electronics これが多分そう。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 8087:0a2b Intel Corp. 
Bus 001 Device 003: ID 0408:5050 Quanta Computer, Inc. 
Bus 001 Device 002: ID 17ef:6047 Lenovo 
Bus 001 Device 016: ID 1a86:55d4 QinHeng Electronics 
Bus 001 Device 005: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

よく見ると権限がないと言われているので以下を実行。

 sudo chmod a+rw /dev/ttyACM0

これだと毎回上記の権限付与を行わないといけないらしく、以下の記事を参考にした。

sudo gpasswd -a ユーザ名 dialout

https://qiita.com/Le_yon/items/78c7a2edc7b29afbf30d

yuji_miyanoyuji_miyano

なんなんだー、USBケーブルでmyCobotとPCを接続したらm5Stackの液晶が消える。なんだんだ。

yuji_miyanoyuji_miyano

1つ目の記事にあった robot_info.py を試してみる。
https://note.com/npaka/n/n4443439ac777

myCobot用にするため、panda_armarm_groupに変更。

権限を与える。

chmod u+x robot_info.py 

1つ目のタブで以下を起動

roslaunch  mycobot_280_moveit demo.launch

もし以下のエラーが出る場合は、

RLException: [mycobot_280_moveit] is neither a launch file in package [roslaunch] nor is [roslaunch] a launch file name
The traceback for the exception was written to the log file

以下を実行。

source devel/setup.bash

2つ目のタブでPythonを実行。

python robot_info.py 

実行結果(最初の方にエラーが色々出てたけどそれは以前のもの(https://zenn.dev/link/comments/6e4b2721fa854c)と同じなので省略)

==Robot Info==
[ group_names ] ['arm_group']
[ current_state ]  joint_state: 
  header: 
    seq: 0
    stamp: 
      secs: 0
      nsecs:         0
    frame_id: "joint1"
  name: [joint2_to_joint1, joint3_to_joint2, joint4_to_joint3, joint5_to_joint4, joint6_to_joint5,
  joint6output_to_joint6]
  position: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  velocity: []
  effort: []
multi_dof_joint_state: 
  header: 
    seq: 0
    stamp: 
      secs: 0
      nsecs:         0
    frame_id: "joint1"
  joint_names: []
  transforms: []
  twist: []
  wrench: []
attached_collision_objects: []
is_diff: False

[ INFO] [1647348870.798366111]: Ready to take commands for planning group arm_group.
==Group Info==
[ name ]  arm_group
[ planning_frame ]  joint1
[ interface_description ]  name: "OMPL"
planner_ids: [arm_group, 'arm_group[BFMT]', 'arm_group[BKPIECE]', 'arm_group[BiEST]', 'arm_group[BiTRRT]',
  'arm_group[EST]', 'arm_group[FMT]', 'arm_group[KPIECE]', 'arm_group[LBKPIECE]',
  'arm_group[LBTRRT]', 'arm_group[LazyPRM]', 'arm_group[LazyPRMstar]', 'arm_group[PDST]',
  'arm_group[PRM]', 'arm_group[PRMstar]', 'arm_group[ProjEST]', 'arm_group[RRTConnect]',
  'arm_group[RRT]', 'arm_group[RRTstar]', 'arm_group[SBL]', 'arm_group[SPARS]', 'arm_group[SPARStwo]',
  'arm_group[STRIDE]', 'arm_group[TRRT]']

==Joint Info==
[ active_joints ]  ['joint2_to_joint1', 'joint3_to_joint2', 'joint4_to_joint3', 'joint5_to_joint4', 'joint6_to_joint5', 'joint6output_to_joint6']
[ joints ]  ['joint2_to_joint1', 'joint3_to_joint2', 'joint4_to_joint3', 'joint5_to_joint4', 'joint6_to_joint5', 'joint6output_to_joint6']
[ current_joint_values ]  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

==EndEffector Info==
[ has_end_effector_link ]  True
[ end_effector_link ]  joint6_flange
[ current_pose ]  header: 
  seq: 0
 stamp: 
    secs: 1647348870
    nsecs: 921691894
  frame_id: "joint1"
pose: 
  position: 
    x: 0.0456000314389
    y: -0.0646210269548
    z: 0.411139762636
  orientation: 
    x: -0.499999999993
    y: 0.500001836599
    z: -0.499998163394
    w: 0.500000000007
[ current_rpy ]  [-1.5707999999865079, 3.6732185957982113e-06, -1.5707963267948972]

次に pose_planner.py を試す。
やり方はほぼ同じ。
実行結果

[ INFO] [1647349440.424520508]: Ready to take commands for planning group arm_group.
Traceback (most recent call last):
  File "pose_planner.py", line 39, in <module>
    main()
  File "pose_planner.py", line 28, in main
    move_group.set_joint_value_target(pose_goal)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/moveit_commander/move_group.py", line 275, in set_joint_value_target
    "Error setting joint target. Is the IK solver functional?"
moveit_commander.exception.MoveItCommanderException: Error setting joint target. Is the IK solver functional?

panda_armのものだったので、届かない姿勢だったのかエラーが出た。

yuji_miyanoyuji_miyano

実機をPCに接続したときにM5 Stackの電源が落ちる問題は、落ちたあとに電源ボタンを押すことで復帰することが可能だった。USBからの給電モードに切り替わるけど、PCからの電流が足りないのかもしれない。

ターミナルでは以下のコマンドをそれぞれのタブで実行した。

roslaunch  mycobot_280_moveit demo.launch
rosrun mycobot_280_moveit sync_plan.py _port:=/dev/ttyACM0 _baud:=115200

これに加えて、PS4のコントローラーのキーを受け取ってMoveitにコマンドを送るPythonプログラムを実行することでPS4コントローラーで実機を動かせた。

ちなみにsync_plan.py のデフォルトのボーレートが100000になっているのでbaudを115200にしないと動かない。

yuji_miyanoyuji_miyano

PCを変えたら再び/dev/ttyACM0のパーミッションがなかったので、以下のサイトを参考に設定。

sudo adduser ユーザー名 dialout

だとだめだった。

sudo vi /etc/udev/rules.d/50-udev-default.rules

KERNEL=="ttyACM[0-9]*", GROUP="dialout", MODE="0666"

を記入して再起動した(もしかしたらadduserする方法でも再起動すればよかったのかも)。

https://netwiz.jp/linux-usb-serial/