본문으로 바로가기

유니버셜 로봇의 UR 시리즈는 ROS용 패키지로 많은 연습을 해볼 수 있도록 하고 있습니다. 물론 UR은 자체적인 시뮬레이터도 무료로 배포하고 있어서 UR로봇만 사용한다면 큰 문제 없지만, 저는 UR로봇을 대상으로 로봇팔을 공부하는 사람들이라면 ROS 환경에서 시뮬레이션을 해보는 것도 좋다고 생각을 합니다. 물론~ 실물 로봇이 있다면 더 좋겠죠. 오늘은 UR로봇의 ROS 패키지를 melodic 환경에서 설치하고, Jupyter Notebook에서 로봇이 구동되는 것을 연습하는 과정을 이야기해보려고 합니다.

먼저 위 github에서 소스를 받아 오는 것부터 시작하죠.

ROS 워크스페이스의 src 폴더에 git으로 받아옵니다.

git clone -b calibration_devel https://github.com/fmauch/universal_robot.git

이 명령을 사용하세요.

그리고,

rosdep install --rosdistro melodic --ignore-src --from-paths src

이 명령으로 필요한 패키지도 설치하구요

그리고 빌드합니다.^^

그럼 뭐~ 그냥 실행해보죠.

음.. 네... 누워있는 로봇팔이 나타나서 좀 놀랍지만, UR로봇이 나타납니다.

이제 혹시 pip가 설치되어 있지 않으시다면 python-pip를 설치하구요.

ipython도 설치하고,

jupyter도 설치합니다.

이제 아까 실행했던 gazebo가 꺼져있다면 다시 실행하고, 다른 터미널에서 moveit_config의 moveit_planning_execution을 실행합니다. end-effector의 변화등으로 직접 moveit을 만들 필요가 없다면 ur 패키지를 설치하면 moveit_config 패키지가 설치되어 있어서, 일단 팔을 한 번 움직여 보기 좋습니다.

그리고, 이 상태에서 moveit을 실행한 터미널에서 위 그림의 빨간 화살표에 표시된 메세지가 잘 나타난다면 가제보에 있는 로봇팔을 움직여볼 준비는 끝난거죠. 이제 다른 터미널에서 jupyter notebook을 실행합니다.

그럼 이렇게 웹브라우저에서 jupyter notebook이 실행됩니다. New를 누르면 음... Python2가 보일겁니다. ROS1은 Python2를 사용해서 그런데, 여러 방법으로 Python3를 사용할 수 있지만, 곧 ROS2로 넘어가면 자연스럽게 Python3를 쓸 수 있으니 지금은 그냥 Jupyter를 사용하는 것에 촛점만 맞추면 될듯 합니다.

화면 배치는 이렇게 해두죠~^^ 이렇게 두면 Jupyter Notebook의 장점을 살려서 코드 실행마다의 움직임 혹은 현상을 관찰할 수 있습니다.

혹시 moveit_commander를 import할 때 없다는 에러가 나면

간단히 ros-melodic  붙여서 설치해줍니다.

그리고 위 코드를 한 번 실행해보죠. 위 그림처럼 결과가 나오면 이제 준비가 다 끝난 것이죠^^

현재 로봇팔의 상태를 모두 읽을 수있습니다. 각 관절의 각도, 이름, frame_id 등~

moveit으로 처음 작업을 할 때, home과 up은 자세가 지정되어 있습니다. 그래서 up으로 가라는 지령을 내릴 수 있습니다.

그러면 이렇게 움직이는 것을 실행하고 그 결과를 직접 보면서 명령을 익혀 볼 수 있습니다.

이번에는 함수를 두 개 만들어 둡니다. 각 조인트별 각도를 지정해서 움직이는 함수와 현재 조인트의 상태를 읽어오는 함수입니다.

그리고 간단히 degree 단위로 각도를 주고, 그걸 radian으로 변경해서 조인트별로 움직이라고 명령을 줍니다.

그러면 이렇게 움직이는 거죠^^

이번에는 end-effector의 위치와 자세를 얻어오는 get_current_pose를 이용해서 현재 끝단의 자세와 위치를 얻어보겠습니다.

이렇게 사용할 수 있습니다.

그런데 각도가 쿼터니언이네요ㅠㅠ. 쿼터니언은 우리가 바로 알긴 좀 어려우니 tf 패키지가 제공하는 변환 함수를 이용해서 오일러각으로 바꿀 수 있고, 그러면 아까 위에서 바꾼 자세가 끝단 입장에서 x, y, z중 중심으로 0도, 70도, 90도 정도 회전한 자세라는 것을 알 수 있습니다.

그럼 끝단을 x, y, z축 중심으로 각각 0도 30도 90도, 네, 바로 y축 중심으로 30도만 더 회전하라는 명령을 줄 수 있는거겠죠~

이렇게 움직이네요. ㅎㅎ^^ 이번에는 실제 로봇을 움직일때 Jupyter notebook을 이용하면 약간 interactive한 학습을 할 수 있다고 생각해서 만들어본 글입니다. 더불어 moveit을 이용해서 끝단의 좌표, 자세에 관한 명령을 인가하는 방법도 살짝 소개를 했네요^^


댓글을 달아 주세요

  1. BlogIcon 가족바라기 2020.02.24 20:10 신고

    신기합니다
    진짜 로봇이면 정말 멋지겠네요^^

  2. BlogIcon 휴식같은 친구 2020.02.24 23:25 신고

    헉~코딩 너무어려워 보입니다.ㅎㅎ
    앞으로 자기개발하는데 4차산업의핵심인 코딩이 중요할것 같습니다.

  3. BlogIcon 핑구야 날자 2020.02.25 00:02 신고

    코로나를 잡을 수 있는 로봇을 만들어 달라고 하고 싶은 마음입니다. ㅋㅋ

  4. BlogIcon kangdante 2020.02.25 08:33 신고

    내용을 보니 머리가 아프네요
    그래도 신나는 작업 같아요.. ^^

  5. 2020.02.26 07:24

    비밀댓글입니다

  6. ur새내기 2020.04.06 18:30

    안녕하세요 써주신 글 정말 잘 보았습니다.
    한가지 궁금한점이, set_pose_target 자체가 오일러각 기준인가요...?
    UR로봇이 0,0,0을 베이스로 tcp 좌표를 갖는데, 이 좌표를 가지고 제어할 수는 없을까요?
    제가 목표로 하는 것은 각 waypoint에서 얻은 x, y, z, rx, ry, rx(ur로봇에서 추출한 값)으로 gazebo 시뮬레이션을 제어하고 싶습니다.
    rx, ry, rz(tcp의 자세)까지는 아니어도 x,y,z(tcp의 위치)까지는 제어하고 싶은데, 조금 어렵네요...
    바쁘시겠지만 도움주시면 감사드리겠습니다.
    실제 ur robot에서 추출한 waypoint값은 다음과 같습니다.
    [-0.25995,0.49125,0.57079, -1.19935,1.17299,1.31445]
    [-0.13836,0.49125,0.57079, -1.19924,1.17304,1.31457]
    [-0.00602,0.49124,0.57079, -1.19935,1.17304,1.31461]
    [ 0.09436,0.49119,0.57082, -1.19937,1.17285,1.31455]
    [ 0.19841,0.49124,0.57075, -1.19938,1.17303,1.31455]
    [ 0.19069,0.4913, 0.47312, -1.19965,1.17282,1.31472]
    [ 0.04123,0.49128,0.47313, -1.19944,1.17317,1.31468]
    [-0.07358,0.49119,0.47326, -1.1993, 1.17273,1.31462]
    [-0.19559,0.49127,0.47315, -1.19953,1.17297,1.31461]
    [-0.2995, 0.49127,0.47319, -1.19928,1.17299,1.31449]
    [-0.29954,0.49128,0.36046, -1.19946,1.17294,1.31446]
    [-0.16074,0.49126,0.36049, -1.19924,1.17308,1.31465]
    [-0.03711,0.49126,0.36047, -1.19928,1.17305,1.31449]
    [ 0.09439,0.49122,0.36052, -1.19933,1.17282,1.31454]
    [ 0.22692,0.49122,0.36044, -1.19914,1.17323,1.31454]

  7. BlogIcon 킴킴1029 2020.05.15 01:37 신고

    안녕하세요. UR5에 대한 프로그램을 하고 있는 학생입니다. 올려 주신 글이 막연하던 중에 큰 도움이 됩니다. ^^ 감사합니다. 좋은 하루 보내세요.

  8. BlogIcon 하연 2020.05.20 17:41

    안녕하세요 ^^ 써 주시 글이 제가 지금 하고 있는 연구에도 꼭 필요한 내용이어서 따라하고 있습니다. 그런데 주피터를 사용하던 중에 에러가 발생하여 혹시나 하여 문의 드립니다. import rospy에서 저는 에러가 납니다. 혹시 관련해서 에러를 겪으신 적이 있는지 궁금하여 문의 드립니다.

    • BlogIcon PinkWink 2020.05.24 00:11 신고

      jupyter에서
      !pip list
      로 rospy가 보이는지 한 번 확인해보세요.

    • BlogIcon 킴킴1029 2020.07.02 21:59 신고

      감사합니다~ 알려주신 대로 하니 잘 됩니다. 시뮬레이션을 interactive하게 움직일 수 있어 편리합니다~~ 정말 감사합니다 ^^!!

    • BlogIcon 킴킴1029 2020.07.02 22:07 신고

      UR5 관련해서 한가지 더 여쭈어도 될지요? 바쁘실텐데 시간 내어 주셔서 감사합니다~ ^^

      올려주신 파이썬 코드 이용해서 요리조리 움직여보고 있습니다. 포지션 뿐만 아니라 조인트별로 velocity를 움직여보고 싶은데, 잘 안되네요 ㅠㅠ

      robot.get_current_state() 를 확인하면,
      여기에 velocity[] 가 나오는데, 이 값에 어떻게 변화를 줄 수 있을지.. 고민하다 여쭈어봅니다 ^^

    • BlogIcon PinkWink 2020.07.13 00:40 신고

      한 번 찾아봐야겠네요. 직접 인가할 방법이 없는 것으로 아는데요. 분명 방법은 있을텐데.... 제가 잘 모르겠습니다.ㅠㅠ.