create_client와 call_async

코드에서 서비스를 부르려면 무엇이 필요할까?

짝 맞추기

서버와 같은 타입, 같은 이름

create_client에는 타입과 서비스 이름 두 가지를 줍니다. 5편 서버와 타입도 이름도 같아야 이어집니다. 하나라도 다르면 요청이 서버에 닿지 않습니다.

기다리기

서버가 뜰 때까지 기다립니다

wait_for_service(timeout_sec=1.0)는 1초 동안 서버를 찾아보고, 없으면 False를 돌려줍니다. 그래서 서버가 뜰 때까지 1초마다 로그를 남기며 기다립니다. 클라이언트를 먼저 켜도 괜찮습니다.

로그 앞의 [INFO] [minimal_client_async]: 부분은 줄였습니다.

요청 만들기

Request를 채워 보냅니다

요청 객체는 AddTwoInts.Request()로 만들고 필드에 값을 넣습니다(4편). 보내는 것은 call_async입니다.

call_async

보내고 바로 돌아옵니다

call_async는 답을 기다리지 않고 곧바로 Future(퓨처)를 돌려줍니다. Future는 "나중에 답이 들어올 자리"입니다. 응답이 도착하면 그 안에 채워집니다.

Future가 언제, 누구 손으로 채워지는지는 7편에서 봅니다.

main

답이 올 때까지 돌리며 기다립니다

명령줄 인자 두 개를 정수로 바꿔 보낸 뒤, spin_until_future_complete로 Future가 채워질 때까지 노드를 돌립니다. 채워지면 future.result()가 응답입니다.

따라 하기

2 3을 주면 5가 돌아옵니다

setup.py에 진입점을 더하고 한 터미널에서 다시 빌드합니다. 서버를 띄운 채 새 터미널에서 source 하고 ros2 run py_srvcli client 2 3을 실행합니다.

진입점: 'client = py_srvcli.client_member_function:main', 로그 한 줄은 화면에 맞게 나눴습니다.

다음 편

Future는 언제 채워질까요?

7편답은 언제 받을까? 7강 목록