Windows機にデュアルブートでUbuntu 18.04を入れてROSとmyCobotを動かす
WindowsにUbuntu18.04をデュアルブートする方法は以下のURLに従った。
パーティションを分割して、インストールUSBからインストールした。
ROSへのインストールは以下のURLに従った。特に躓くことはなかった。
myCobotのリポジトリをクローンしてビルドした。
以下のURLに沿って、moveitをインストールした。
ここには書いてないプロセスとして、python2のpipを入れてpymycobotをインストールした。
sudo apt install python-pip
pip install pymycobot
テストを実行したらエラーがでた。
$ 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なのかが確認可能。
再び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
を実行したらエラーなく動き出した。が、急に動き出して焦った。
jogを試してみる
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
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
実行はできたけど、エラーが出ていてなんとも分からん、、。
やっぱり公式じゃなくてこのあたりの方々のを使うのが良さそう。
上記のリポジトリをビルドしてみる。
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
MoveIt関連で検索してたら偶然見かけたのでコメントです!
jog_controlを使うにはjog_launchにyamlとlaunchを作成する必要があります。
上記は違うロボット対応用のプルリクエストですが、これ参考にmyCobot用の設定を作ったら動くかもしれません。
わー、コメントありがとうございます!
大変お世話になってます!
いただいたプルリクエスト見てみます
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
自分が勘違いしてたのが、インストールフォルダを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で試してみる。
ちゃんとチュートリアルを読んでみる。
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
上のチュートリアルに沿ってelephant roboticsの公式のリポジトリをクローンしてきたものだとエラーが出ずに動いた。
roslaunch mycobot_320_moveit demo.launch
持っているのは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()
こんな感じのエラーが出た。
[ 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
....
エラーが出つつも対話式で動いてはいる。
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
動作範囲かなと思い、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
実機で動かすにはどうするのか。
このあたりを見ると
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
なんなんだー、USBケーブルでmyCobotとPCを接続したらm5Stackの液晶が消える。なんだんだ。
moveitにpythonから命令を送るのにはこちらのnoteも参考になりそう。
1つ目の記事にあった robot_info.py
を試してみる。
myCobot用にするため、panda_arm
をarm_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のものだったので、届かない姿勢だったのかエラーが出た。
2つ目の記事がmyCobot用だったのでそちらを試してみた。
mycobot_arm
を arm_group
に変更して同様の手順で実行したところ動いた。
実機を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にしないと動かない。
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する方法でも再起動すればよかったのかも)。