ROS2를 활용한 6축 로봇 제작 가이드 2

2 minute read

2달만에 2편입니다..
포스팅을 미루다가 2달이나 지났습니다.

1편 에서 로봇 프레임 조립이 끝났습니다.
사실, 1편에서 모터의 위치를 잡아주기 위해 이미 완성된 패키지 소스코드를 받았습니다.
패키지 소스코드를 설명하면서 진행하겠습니다.

준비물

준비물은 다음과 같습니다.

- Odroid C4       ... (x1)
- MG996R          ... (x6)
- PCA9685         ... (x1)
- Robot arm       ... (x1)

ROS2

드디어, 조립한 로봇 팔과 ros2 사용해 봅시다.

ros2 패키지 구성

PCA9685 패키지가 파이썬으로 제공되어있기 때문에 ros 패키지도 파이썬으로 만들었습니다.
소스코드의 디테일은 포스팅이 추가되면서 관련 주제가 나올때마다 자세하게 설명하겠습니다.

1편에서 다운로드 받은 코드를 확인합니다.

$ cd ros2_axis6
$ tree -L 2
.
├── LICENSE-APACHE
├── LICENSE-MIT
├── README.md
├── axis6
│   ├── __init__.py
│   ├── commander.py
│   ├── operator.py
│   └── state_publisher.py
├── gif
│   └── axis6-test.gif
├── how2flow_interfaces
├── images
│   ├── axis6_circuit.png
│   └── rviz.png
├── launch
│   └── display.prototype.py
├── libgpiod.py
├── meshes
│   ├── axis1.dae
│   ├── axis2.dae
│   ├── axis3.dae
│   ├── axis4.dae
│   ├── axis5.dae
│   ├── base_link.dae
│   ├── box1.dae
│   ├── box2.dae
│   ├── box3.dae
│   ├── box4.dae
│   ├── cylinder1.dae
│   ├── end_effector.dae
│   ├── frame1-1.dae
│   └── frame2-1.dae
├── package.xml
├── preinstall.sh
├── requirements.txt
├── resource
│   └── axis6
├── rviz
│   ├── ros2_axis6-test.rviz
│   └── ros2_axis6.rviz
├── setup.cfg
├── setup.py
├── test
│   ├── test_copyright.py
│   ├── test_flake8.py
│   └── test_pep257.py
├── udev
│   └── rules.d
└── urdf
    └── prototype.urdf

ros2 패키지에서 기본적인 사양을 적는 package.xml 파일이 있습니다.
package.xml 파일을 확인합니다.

$ vi package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>axis6</name>
  <version>0.0.0</version>
  <description>Control 6-axis robot with pca9685 (motor: MG996R)</description>
  <maintainer email="steve@how2flow.net">how2flow</maintainer>
  <license>Apache 2.0, The MIT</license>

  <depend>rclpy</depend>
  <depend>sensor_msgs</depend>
  <depend>how2flow_interfaces</depend>

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>

빌드는 rclpy 방식이고 데이터 인터페이스는 sensor_msgs, how2flow_interfaces 2가지 사용했습니다.

sensor_msgs는 ros2에서 기본적으로 제공하는 인터페이스 입니다.
ros2를 설치하면 기본적으로 함께 빌드되고 사용할 수 있습니다.

how2flow_interfaces는 제가 직접 만든 인터페이스 입니다.
레포지토리를 따로 받아서 ros 빌드할 때 함께 빌드해야 합니다.

setup.py를 확인합니다.

$ vi setup.py
  1 from setuptools import setup
  2 from glob import glob
  3
  4 package_name = 'axis6'
  5
  6 setup(
  7     name=package_name,
  8     version='0.0.0',
  9     packages=[package_name],
 10     data_files=[
 11         ('share/ament_index/resource_index/packages',
 12             ['resource/' + package_name]),
 13         ('share/' + package_name, ['package.xml']),
 14         ('share/' + package_name + '/launch/', glob('launch/*.py')),
 15         ('share/' + package_name + '/meshes/', glob('meshes/*.dae')),
 16         ('share/' + package_name + '/rviz/', glob('rviz/*.rviz')),
 17         ('share/' + package_name + '/urdf/', glob('urdf/*.urdf')),
 18     ],
 19     install_requires=['setuptools'],
 20     zip_safe=True,
 21     maintainer='how2flow',
 22     maintainer_email='steve@how2flow.net',
 23     description='Control 6-axis robot with pca9685 (motor: MG996R)',
 24     license='Apache 2.0, The MIT',
 25     tests_require=['pytest'],
 26     entry_points={
 27         'console_scripts': [
 28             'commander = axis6.commander:main',
 29             'operator = axis6.operator:main',
 30             'state_publisher = axis6.state_publisher:main',
 31         ],
 32     },
 33 )


10번 라인에 있는 data_files 리스트가 실제 install의 타겟이 되는 파일들입니다.
보통 리눅스에서 install 이라고 하면, 완성된 결과물을 적절한 경로에
copy & paste 라고 생각하면 됩니다.

27번 라인 console_scripts 의 내용이 ros2의 노드를 정의하는 부분입니다.
실제 빌드시에 포함해야 되는 노드의 정보를 작성합니다.

소스코드 리뷰는 3편에서…

Leave a comment