# 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는 여러분의 구매 옵션에 따라 제공되지 않을 수도 있습니다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://omorobot.gitbook.io/manual/product/omo-r1/ros-1/bringup.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
