> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Run basic OCR with ocr_service

The `ocr_service` sample application enables a service that provides the Optical Character Recognition (OCR) function.

It captures the image topic from the ROS system and publishes the result with the `ocr_topic`.

## Pipeline flow for `ocr_service`

This figure shows the basic messages and data transfer channels, with the relevant client/server and ROS node.

<img src="https://mintcdn.com/qualcomm-prod/IP0o0G5fE3MFmCJ8/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ocr-service-pipeline.svg?fit=max&auto=format&n=IP0o0G5fE3MFmCJ8&q=85&s=d47932fbf4e0d6b65b71893568dbe628" alt="pipeline" style={{ display: 'block', margin: '0 auto', width: '75%' }} width="652" height="563" data-path="SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ocr-service-pipeline.svg" />

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  Figure : The `ocr_service` pipeline
</p>

## ROS nodes used in the `ocr_service `pipeline

|    ROS node   | Description                                                                                    |
| :-----------: | :--------------------------------------------------------------------------------------------- |
|  `OCR_CLIENT` | Sends the OCR request to `ocr_server` and gets the server result.                              |
|  `OCR_SERVER` | Gets the OCR request from `ocr_server` , and forks the `ocr_rosnode` according to the request. |
| `OCR_ROSNODE` | Subscribes to the image topic according to the request.                                        |

## ROS topics used in the `ocr_service `pipeline

<table>
  <thead>
    <tr>
      <th style={{ width: '26%' }}>ROS topic</th>
      <th style={{ width: '29%' }}>Message type</th>
      <th style={{ width: '20%' }}>Published/Subscribed by</th>
      <th style={{ width: '25%' }}>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`/image_topic_name`</td>
      <td>`<sensor_msgs.msg.Image>`</td>
      <td>Subscribe to images from other nodes</td>
      <td>The image to be processed.</td>
    </tr>

    <tr>
      <td>`/ocr_image_topic_name`</td>
      <td>`<std_msgs.msg.String>`</td>
      <td>Published by `ocr-rosnode`</td>
      <td>Publishes the OCR result.</td>
    </tr>
  </tbody>
</table>

## Prerequisites

You have **Set up the device** according to [Set up the environment for running sample applications](./set-up-env-for-sample-app).

## Run out-of-the-box `ocr_service`

1. Start three terminals, and run the following commands in each terminal to set up QIR SDK and ROS2 environment on the device.

   Value range of `ROS_DOMAIN_ID`: \[0, 232]

   ```cpp theme={null}
   ssh root@[ip-addr]
   (ssh) source /usr/share/qirp-setup.sh
   (ssh) export ROS_DOMAIN_ID=xx
   ```
2. In terminal 1, launch `ocr_server`.
   ```undefined theme={null}
   (ssh) ros2 run ocr_service ocr_server
   ```
3. In terminal 2, push an image to the device and run the `ocr_testnode`.
   ```undefined theme={null}
   scp  qirp-samples/platform/ocr_service/scripts/digital_720p.png root@[ip-addr]:/opt
   (ssh) ros2 run ocr_service ocr_testnode --topic imagetest --picture /opt/digital_720p.png
   ```
4. In terminal 3, run the `ocr_client`.

   ```undefined theme={null}
   (ssh) ros2 run ocr_service ocr_client imagetest
   ```

   You will see the following log:

   <img src="https://mintcdn.com/qualcomm-prod/IP0o0G5fE3MFmCJ8/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ocr-results.png?fit=max&auto=format&n=IP0o0G5fE3MFmCJ8&q=85&s=4ccbfef9195258241aea7b6ed8151399" alt="result" style={{ display: 'block', margin: '0 auto' }} width="1087" height="129" data-path="SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ocr-results.png" />

## Build and run `ocr_service`

1. Build `ocr_msg` and `ocr_service` provided by the QIR SDK on the host.
   ```powershell theme={null}
   cd <qirp_decompressed_workspace>
   source setup.sh
   cd qirp-samples/platform/ocr_service
   colcon build --merge-install --cmake-args ${CMAKE_ARGS}
   ```
2. Push `ocr_msg` and `ocr_service` to the device.
   ```powershell theme={null}
   cd qirp-samples/platform/ocr_service/install
   tar -zcvf ocr_service.tar.gz lib/ share/
   ssh root@[ip-addr]
   scp ocr_service.tar.gz root@[ip-addr]:/opt
   ssh ssh root@[ip-addr]
   (ssh) tar --no-overwrite-dir --no-same-owner -zxf /opt/ocr_service.tar.gz -C /usr/ros/jazzy/
   scp qirp-samples/platform/ocr_service/scripts/digital_720p.png root@[ip-addr]:/opt
   ```
3. Run `ocr_service` on the device with the steps in [Run out-of-the-box ocr\_service](#run-out-of-the-box-ocr_service).
