CLPE-G-Series ROS1 User Guide


Revision History for Document

Rev

Date

Description

Rev

Date

Description

1.0

2022-04-28

Initial Draft

1.1

2024-04-04

8์ฑ„๋„ ์ง€์› ๋‚ด์šฉ ์ถ”๊ฐ€

1.2

2024-09-12

JPEG ์ง€์›, RQT ๋‚ด์šฉ ์ถ”๊ฐ€

ย 

Overview

์ด ๋ฌธ์„œ๋Š” ROS-noetic์˜ ์„ค์น˜ ๋ฐฉ๋ฒ•๊ณผ CLPE-G-Series๋ฅผ ROS์—์„œ ๊ตฌ๋™ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ๋ฒ•๊ณผ ์นด๋ฉ”๋ผ ์˜์ƒ์„ ๋ณด๊ธฐ ์œ„ํ•œ RVIZ ๋ฐ RQT ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

ROS ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ

Requirements:

ยทย ย ย ย ย  CANLAB CLPE-G-Series with supplied PC running Ubuntu 20.04

ยทย ย ย ย ย  ROS 1 Noetic

PC์— Ubuntu 20.04๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ROS ์„ค์น˜

noetic/Installation/Ubuntu - ROS Wiki ROS ๊ณต์‹ ์„ค์น˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ROSโ€“noetic(Recommended)๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

์„ค์น˜๋ฅผ ๋ฌด์‚ฌํžˆ ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„ ์ฐฝ์— source /opt/ros/noetic/setup.bash ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ROS-noetic๋ฅผ ํ™œ์„ฑํ™”์‹œํ‚ค๊ณ  rosversion -d ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณธ๋‹ค.

๊ทธ๋ฆผ 1

๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด noetic๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ 2

๊ทธ๋ฆผ 2์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค๋ฉด ์„ค์น˜ ๊ณผ์ •์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•ด ๋ณด๊ฑฐ๋‚˜, source /opt/ros/noetic/setup.bash ๋ช…๋ น์–ด๋ฅผ ์ ์šฉ์‹œ์ผฐ๋Š”์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•ด ์ค€๋‹ค.

ROS ์„ค์ •

System dependencies

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด ์ค€๋‹ค.

sudo apt update && sudo apt install git cmake wget gcc g++ libgstreamer-plugins-base1.0-dev python3-colcon* python3-rosdep python3-vcstool -y

Install CLPE SDK and ROS Driver

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

mkdir -p ~/ws_clpe/src cd ~/ws_clpe/ wget https://raw.githubusercontent.com/canlab-co/clpe_ros/noetic/clpe.repos vcs import src < clpe.repos

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ทธ๋ฆผ 3๊ณผ ๊ฐ™์€ ํด๋” ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

Install dependencies

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ROS ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด ์ค€๋‹ค.

cd ~/ws_clpe sudo rosdep init rosdep update rosdep install --from-paths src --ignore-src --rosdistro noetic -y

์ฃผ์˜ ์‚ฌํ•ญ

rosdep init ๊ณผ์ •์—์„œ ๊ทธ๋ฆผ 4์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, sudo rm /etc/ros/rosdep/sources.list.d/20-default.list ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค ๋‹ค์‹œ sudo rosdep init์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

sudo rm /etc/ros/rosdep/sources.list.d/20-default.list ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค ๋‹ค์‹œ sudo rosdep init์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

install ๊ณผ์ •์—์„œ ๊ทธ๋ฆผ 5์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฌด์‹œํ•˜๊ณ  ์ง„ํ–‰ํ•˜์—ฌ๋„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์ง€์žฅ์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์‹œ sudo apt-get install <ํ•ด๋‹น package> ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด์ค€๋‹ค.

Build the driver

driver๋ฅผ ๋นŒ๋“œํ•ด ์ค€๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋ฐฉ๋ฒ•

Lanuch

sudo_password๊ฐ€ ์ˆซ์ž(์˜ˆ์‹œ:1)์ด๋ฉด password:=\'1\'๋กœ ์ˆ˜์ •ํ•ด์„œ ๋ช…๋ น์–ด๋ฅผ ์ ์–ด ์ค€๋‹ค. ๊ทธ๋ฆผ 6๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

slave CLPE-G-Series๋ฅผ ์žฅ์ฐฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, slave ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ slave:=n ์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„๋Š” camera X๋‹น 1๊ฐœ์˜ topic์„ publishํ•œ๋‹ค.

  • /clpe_ros/cam_X/image_raw: UYVY ํ˜•์‹์˜ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” topic์ด๋‹ค.

  • /clpe_ros/cam_X/compressed : JPEG ํ˜•์‹์˜ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” topic์ด๋‹ค.

๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ์€ yuv422 ์ด๋‹ค. ์ง€์›ํ•˜๋Š” ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์€ ์•„๋ž˜ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜๋ฉด ๋œ๋‹ค.

topic์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ„ฐ๋ฏธ๋„์„ ๋” ์‹คํ–‰ํ•œ ๋’ค ros2 topic list ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด publish ์ค‘์ธ topic๋“ค์˜ ๋ชฉ๋ก์„ ํ™•์ธํ•œ๋‹ค.

ros ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” source /opt/ros/noetic/setup.bash ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™” ์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์›ํ•˜๋Š” topic์˜ ์ •๋ณด๋ฅผ ํ™•์ธ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด rostopic echo ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ย ์˜ˆ์‹œ: rostopic echo /clpe_ros/cam_0/compressed

์ฃผ์˜ ์‚ฌํ•ญ

Launch ๊ณผ์ •์—์„œ ๊ทธ๋ฆผ 7๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด source /opt/ros/noetic/setup.bash ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ROS noetic๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ์ฃผ์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ „ ํ•ญ์ƒ ํ™œ์„ฑํ™”์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋ฆผ 8๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ source install/setup.bash ๋ช…๋ น์–ด๋ฅผ ์ ์šฉ์‹œ์ผฐ๋Š”์ง€ ํ™•์ธํ•ด ์ค€๋‹ค.

*TIP

๋งค๋ฒˆ ์ด๋ ‡๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ์ ์šฉ ์‹œํ‚ค๊ธฐ๋Š” ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ~/.bashrc์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์–ด ์ค€๋‹ค.

alias noetic="source /opt/ros/noetic/setup.bash; source ~/ws_clpe/install/setup.bash"

๊ทธ๋ฆฌ๊ณ  source ~/.bashrc ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ ์šฉ ์‹œ์ผœ์ค€๋‹ค. ๋‹ค์Œ noetic๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ™œ์„ฑํ™”๋œ๋‹ค.

Configuration

๋“œ๋ผ์ด๋ฒ„๋Š” ๋™์ž‘์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ROS ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•œ๋‹ค. password, slave, encoding๊ณผ timestamp๋Š” launch ๊ณผ์ •์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” config file์„ ํ†ตํ•ด ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

Key

Description

Default

password

sudo password

*Required*

slave

Slave CLPE-G-Series์˜ ์กด์žฌ ์—ฌ๋ถ€, ์ง€์›ํ•˜๋Š” ์ธ์ž : y(Slave CLPE-G-Series ์กด์žฌ), n(Slave CLPE-G-Series ๋ถ€์žฌ)

n

encoding

Image encoding, ์ง€์›ํ•˜๋Š” ํฌ๋งท : bgr8, bgra8, rgb8, rgba8, mono16, yuv422, jpeg. Defaults to yuv422.

*yuv422, jpeg ์ด์™ธ์˜ ์ธ์ฝ”๋”ฉ์€ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

yuv422

timestamp

Image timestamp, ์ง€์›ํ•˜๋Š” ํฌ๋งท : xavier, local

xavier

  • encoding ์ด jpeg ์ผ ๊ฒฝ์šฐ, local ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ

cam_{n}_enable

Enable camera

true

cam_{n}_pose

Pose relative to the base, 6 values corresponding to [x, y, z, roll, pitch, yaw]

[0,0,0,0,0,0]

cam_{n}_frame_id

Defines the frame_id all static transformations refers to

base_link

cam_{n}_image_latch

Controls latching for camera image messages

false

cam_{n}_image_queue_size

Controls queue size for camera image messages

10

cam_{n}_info_latch

Controls latching for camera info messages

false

cam_{n}_info_queue_size

Controls queue size for camera info messages

10

RQT

RQT๋Š” ROS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ข…ํ•ฉ GUI ํˆด์ด๋‹ค. ROS๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋ณดํ†ต ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค.

์‹คํ–‰ ๋ฐฉ๋ฒ•

ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ด์–ด source /opt/ros/noetic/setup.bash ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด noetic๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ์ค€๋‹ค. ๊ทธ ๋‹ค์Œ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— rqt ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ์‹คํ–‰๋œ๋‹ค.

์‹คํ–‰๋จ๊ณผ ๋™์‹œ์— RQT ์ฐฝ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฐฝ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜๋ฉด ์ •์ƒ์ ์œผ๋กœ RQT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

RQT ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๊ทธ๋ฆผ 10๊ณผ ๊ฐ™์ด ์ฐฝ ํ™”๋ฉด์—์„œ ๋“œ๋กญ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ˜„์žฌ publish๋˜๋Š” topic์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์›ํ•˜๋Š” topic์„ ๋“œ๋กญ๋ฐ•์Šค์—์„œ ์„ ํƒํ•˜๋ฉด ์˜์ƒ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

RVIZ

RVIZ๋Š” ROS์—์„œ ์‚ฌ์šฉ๋˜๋Š” 3์ฐจ์› ์‹œ๊ฐํ™” ๋„๊ตฌ์ด๋‹ค. ROS๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋ณดํ†ต ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค.

์‹คํ–‰ ๋ฐฉ๋ฒ•

ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ด์–ด source /opt/ros/noetic/setup.bash ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด noetic๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ์ค€๋‹ค. ๊ทธ ๋‹ค์Œ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ๊ทธ๋ฆผ 11๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ์‹คํ–‰๋œ๋‹ค.

์‹คํ–‰๋จ๊ณผ ๋™์‹œ์— RVIZ ์ฐฝ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฐฝ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜๋ฉด ์ •์ƒ์ ์œผ๋กœ RVIZ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

RVIZ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

ย ๊ทธ๋ฆผ 12์™€ ๊ฐ™์ด ์ฐฝ ํ™”๋ฉด์—์„œ ADD โ†’ By topic์„ ํด๋ฆญํ•˜๋ฉด ํ˜„์žฌ publish๋˜๋Š” topic์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” /image_raw topic์ด ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆผ 13๊ณผ ๊ฐ™์ด ์›ํ•˜๋Š” cam_x์˜ /image_raw๋ฅผ ๋”๋ธ” ํด๋ฆญํ•œ ๋’ค ๋‚˜์˜ค๋Š” Image ํ•ญ๋ชฉ์„ ๋”๋ธ” ํด๋ฆญํ•ด ์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ฆผ 14์™€ ๊ฐ™์ด ํ™œ์„ฑํ™”๋˜๋Š”๋ฐ ํ•˜๋‹จ์— ์žˆ๋Š” image ํ•ญ๋ชฉ์„ ํ†ตํ•ด ์นด๋ฉ”๋ผ ์˜์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Image ํ•ญ๋ชฉ์€ ๋งˆ์šฐ์Šค ํด๋ฆญ์„ ํ†ตํ•˜์—ฌ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

unsupported image encoding [yuv422] ์ด๋ผ๋Š” Status:Error๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ , ์นด๋ฉ”๋ผ ํ™”๋ฉด์ด ์•ˆ ๋‚˜์™€ No Image ํ™”๋ฉด์ด ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ ์˜์ƒ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•œ๋‹ค.

์ฐธ๊ณ  ์‚ฌํ•ญ

๊ธฐ๋ณธ์ ์œผ๋กœ, ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋“ค์€ yuv ์ธ์ฝ”๋”ฉ์œผ๋กœ publish๋œ๋‹ค. RVIZ๋Š” yuv ์ธ์ฝ”๋”ฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

yuv422 ์ด์™ธ์˜ ์ธ์ฝ”๋”ฉ์€ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ๋ช…๋ น์–ด๋กœ launch ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ๊ทธ๋ฆผ 15์™€ ๊ฐ™์ด RVIZ์—์„œ๋„ ์ •์ƒ์ ์œผ๋กœ ์˜์ƒ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ย