> For the complete documentation index, see [llms.txt](https://omorobot.gitbook.io/manual/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://omorobot.gitbook.io/manual/product/omo-r1/ros-1/bringup.md).

# omo\_r1\_bringup 패키지

## 개요&#x20;

omo\_r1\_bringup 패키지에는 아래의 내용이 포함되어 있습니다.

* IMU 장비와 연결하고 /imu 토픽 발행
* LiDAR 장비와 연결하고 /scan 토픽 발행
* 로봇 모터 제어와 모니터링을 담당하고 /cmd\_vel을 subscribing하고 로봇을 움직이는 기능&#x20;
* USB 카메라가 장착되어 있다면 영상 토픽을 발행
* URDF 모델을 확인
* 키보드 원격 제어를 수행하는 기능&#x20;

## 연결&#x20;

![위에서 본 로봇 모터 컨트롤 부분](/files/-MKDs6AULk_dyeVAH-wH)

![로봇 모터 제어기와 연결하는 시리얼 단자](/files/-MKDsHEvedRtE7UpSMnp)

![로봇 제어기에 시리얼 케이블을 연결한 모습](/files/-MKDsT8OQL_McPvIiPxz)

* 이미 로봇은 각종 센서류와 함께 USB-Hub를 통해 연결이 완료된 상태로 배포됩니다.
* 내부에서 로봇을 구동하는 모터드라이버의 연결단자는 위 사진의 위치입니다.
* 따로 구동하거나 단순히 기능을 테스트한다면 위 단자에서 바로 PC와 연결해도 됩니다.

## 각 기능 테스트

본  장은 omo\_r1\_bringup 패키지에 launch 폴더 launch 파일로 구성된 각 기능에 대한 설명입니다.

### omo\_r1\_motor.launch

* omo\_r1\_motor.launch는 R1의 모터 제어기보드와 직접 통신을 하는 노드를 실행합니다.

```markup
<launch>
  <arg name="set_port" default="/dev/ttyMotor"/>
  <arg name="set_odom_mode" default="wheel_only"/>
  <node pkg="omo_r1_bringup" type="omo_r1_motor_node.py" name="omo_r1_motor_node" output="screen">
      <param name="port" value="$(arg set_port)"/>
      <param name="baud" value="115200"/>
      <param name="odom_mode" value="$(arg set_odom_mode)"/>
      <param name="modelName" value="r1"/>
  </node>
</launch>
```

* default로 접속하는 port는 ttyMotor로 이는 R1의 [ROS melodic version pkg의 설치를 안내하는 페이지](https://omorobot.gitbook.io/manual/omo-r1/omo-r1/ros-pkg-install)에서 시리얼 통신 rule을 만들때 정의된 것입니다.

#### 연결 port 직접 입력&#x20;

* 만약 R1의 구동만을 ROS에서 하려고 하고 별도의 PC에 직접 연결했다면 해당 패키지만 직접 연결할 수 있습니다.

![omo\_r1\_motor.launch를 port를 지정해서 실행한 화면](/files/-MKDv1MuGL_dMB8OEZwP)

* omo\_r1\_motor.launch에 set\_port를 입력으로 연결된 USB를 확인해서 직접 연결할 수 있습니다.

![teleop\_key를 실행한 화면](/files/-MKDvOlOL8q5PvjowjGK)

* omo\_r1\_bringup 패키지의 omo\_r1\_motor.launch를 실행한후, omo\_r1\_teleop\_jey.launch를 실행하면

![](/files/-MKDveDNxeOUSfDlJs49)

* 위 그림처럼 나타난 상태에서 w 키를 눌러서 linear vel을 0.1이 맞춥니다. (이는 단순히 테스트하는 것으로 이 때 로봇은 다른 상자나 거치대 위에 올려서 두 바퀴가 모두 지면에서 떨어지도록 해둡니다.)&#x20;
* 이제 omo\_r1\_motor.launch를 실행하고 위 그림처럼 omo\_r1\_teleop\_key.launch도 같이 실행되었고, 로봇에 직진 방향으로 0.1 rad/sec의 속도 명령이 하달되었다면 양쪽 바퀴가 회전을 시작했을 겁니다.

{% embed url="<https://youtu.be/bkQONDulMrA>" %}

* 위 동영상을 보면 한 바퀴 돌때마다 시간을 타임 워치로 측정할 수 있을 겁니다. 동영상에도 나타나지만, 최초 한 바퀴는 6.3초, 그 다음은 12.6초가 소요됩니다.&#x20;

$$
2 \pi r \* turn / time
$$

* 선 속도는 위  수식처럼 바퀴수와 시간으로 계산할 수 있습니다. 이때 바퀴의 반지름은 대략 0.1016m입니다.

![](/files/-MKDxr_5nKDtUxX1sgwi)

* 위 표의 계산 결과로 선속도는 0.1에 근접합니다. (실제로 타임워치는 손으로 눌러서 외부에서 육안으로 관찰해서 오차가 존재합니다.)  -로봇 구매 후 motor관련 테스트를 하는 것으로 내부 제어기에서 이런 오차를 가지고 있는 것은 아닙니다.-

#### odom mode

* omo r1 bringup 패키지는 로봇이 자신의 위치를 계산할 때 회전각도를 예측하는 방법을 두 가지 중 하나를 선택해야 합니다.
* 기본 설정은 두 바퀴의 위치의 합과 차를 이용해서 odom을 계산합니다. 이 모드는 launch 파일을 아무 옵션 없이 실행만 하면 됩니다.

![](/files/-MOV_q6SzC5TiqOfooZg)

* 혹은 위 그림처럼 실행할때 set odom mode를 wheel\_only로 설정하면 됩니다.

```markup
roslaunch omo_r1_bringup omo_r1_motor.launch set_odom_mode:="wheel_only"
```

![](/files/-MOVaX2VogPdzAuBLYVI)

* 만약 휠의 차이를 이용한 위치 예측이 만족스럽지 못하면 위 그림과 같 imu를 사용해서 yaw 각도를 받아서 odom을 계산할 수 있습니다.
* 이렇게 사용하는 경우는 반듯이 imu 토픽을 발행하는 노드를 실행해 두어야 합니다.
* omo r1은 현재 로보티즈의 OpenCR을 사용하여 imu를 발행할 수 있는 기능을 지원하고 있습니다.
* 그러나 imu는 상황과 환경에 따라 간혹 지자기 센서의 오차로 인해 드리프트라는 이름으로 알려진 각도 흐르는 현상이 나타날 수 있습니다.

```markup
roslaunch omo_r1_bringup omo_r1_motor.launch set_odom_mode:="using_imu"
```

### omo\_r1\_model.launch

![omo\_r1\_model.launch를 실행한 화면](/files/-MKE77o2t6DnKDxRkliR)

```markup
roslaunch omo_r1_bringup omo_r1_model.launch
```

* omo\_r1\_model.launch를 실행하면 rviz에서 robot\_description이 표현됩니다.

![omo\_r1\_model.launch 실행후 rviz의 화면 ](/files/-MKE7RFG_H3hAQYbvvAe)

* 화면에 나타난 camera는 여러분의 구매 옵션에 따라 제공되지 않을 수도 있습니다.
