Gemini의 최신 세대 모델인 2.5 Pro 및 Flash가 로봇 공학의 새로운 지평을 열고 있습니다. 발전된 코딩, 추론 및 현재 공간 이해 능력과 결합된 멀티모달 기능은 차세대 인터랙티브 및 지능형 로봇의 기반을 제공합니다.
본 게시물에서는 개발자가 Gemini 2.5를 활용하여 정교한 로봇 공학 애플리케이션을 빌드할 수 있는 방법을 살펴봅니다. 이에 Gemini 2.5 및 Live API를 사용하는 방법을 보여드리기 위해 프롬프트와 함께 실용적인 예시를 제공해 드리겠습니다.
지난 3월, 로보틱스 애플리케이션만의 요구 사항에 최적화된 체화 고급 추론 모델인 Gemini 로보틱스-ER(Gemini Robotics-ER)을 비롯해 Gemini 로보틱스(Gemini Robotics) 모델을 출시했습니다. Gemini 로보틱스의 신뢰할 수 있는 테스터들이 이미 로봇 공학 애플리케이션 분야에서 Gemini의 위력을 입증하고 있으며 애자일 로봇(Agile Robots), 어질리티 로보틱스(Agility Robotics), 보스톤 다이내믹스(Boston Dynamics), 인챈티드 툴스(Enchanted Tools)가 시행한 사례도 포함되어 있습니다. Gemini 로보틱스-ER의 신뢰할 수 있는 테스터 프로그램 대기자 명단에 등록하세요.
물리 세계에 대한 추론은 일반적이면서도 견고한 제어의 핵심입니다. Gemini 2.5는 멀티모달 형식으로 향상된 추론 능력을 통해 한 단계 더 발전했습니다. 아래에서 Gemini의 포인팅 및 객체 감지 능력을 활용한 두 가지 예시를 공유합니다.
모델은 포인팅을 통해 개체 또는 개체의 일부를 정확하게 참조하고 공간에서 해당 개체를 찾을 수 있습니다. Gemini 2.5 Pro는 포인팅하는 개체에 대해 추론할 수 있으며 이미지와 상호작용하는 새로운 방식을 제시합니다. 예를 들어 Gemini 2.5 Pro는 슈퍼마켓 진열대라는 맥락에서 빈 공간에 대해 추론할 수 있으며, 재입고가 필요할 때 이를 인식합니다. 아래 예시에서 Gemini는 미니 가지의 재입고가 필요하다는 점을 파악합니다. 또한 계량기 예시에서 볼 수 있듯이 Gemini 2.5 Pro는 해당 위치에서 정보를 찾고 읽을 수 있는 초기 기능도 보여줍니다.
예시 1: Gemini 2.5는 세분화된 언어 설명을 기반으로 장면에서 객체를 찾을 수 있습니다. 예를 들어 재입고가 필요한 선반을 찾을 수 있습니다.
프롬프트: 재입고가 필요한 선반의 상자 하나를 포인팅해줘. 답변은 [{"point": <point>, "label": <label1>}, ...] JSON 형식을 따라야 해. 포인트는 [y, x] 형식이며, 0~1000 값으로 정규화되어 있어야 해.
응답 오버레이가 포함된 입력 이미지:
예시 2: Gemini 2.5는 장면에서 작은 객체를 찾고 해당 객체의 상태를 추정할 수 있습니다. 예를 들어 계기판을 읽을 수 있습니다.
프롬프트: 모든 원형 계기판을 포인팅해줘. 답변은 [{"point": <point>, "label": <label1>}, ...] JSON 형식을 따라야 해. 포인트는 [y, x] 형식이며, 0~1000 값으로 정규화되어 있어야 해.
응답 오버레이가 포함된 입력 이미지:
프롬프트: 중간 계기판의 측정값은 얼마야?
응답: 클로즈업 뷰를 살펴보면, 이미지의 중앙 왼쪽에 있는 원형 계기판은 0을 가리키고 있는 것으로 보입니다. 바늘이 다이얼의 '0' 표시를 직접 가리키고 있습니다.
Gemini 2.5는 시간의 흐름에 따라 여러 객체를 정확하게 추적하고 '쏟아짐(spill)'과 같은 명확히 정의되지 않은 개념을 감지할 수 있습니다. 일련의 포인트 형태로 궤적을 예측하도록 Gemini 2.5에 프롬프트를 제공할 수 있습니다.
예시 1:Gemini 2.5는 동영상의 각 프레임에 대한 경계 상자를 생성하고 아래와 같이 시각화할 수 있습니다.
프롬프트: 녹색 그릇, 게, 지갑, 분홍색 그릇, 휴대폰을 감지하고 box_2d 및 label 키가 포함된 JSON 배열을 만들어줘(프레임마다 실행).
응답 오버레이가 포함된 입력 이미지:
예시 2:Gemini 2.5는 로봇 공학과 관련된 명확히 정의되지 않은 개념을 감지할 수 있으며, 이를 수행하려면 상식 수준의 지식과 맥락별 추론이 필요합니다. 예를 들어 유용한 로봇은 '쏟아짐'이라는 개념을 이해해야 합니다.
프롬프트:
1) '쏟아짐'에 해당하는 경계 상자를 보여줘. box_2d 및 label 키가 포함된 JSON 배열을 만들어줘.
2) '쏟아짐'에 대한 세그멘테이션 마스크를 제공해줘. 각 개체에 키 'box_2d'의 2D 경계 상자, 키 'mask'의 세그멘테이션 마스크 및 키 'label'의 텍스트 라벨이 포함된 JSON 세그멘테이션 마스크 리스트를 출력해줘.
응답 오버레이가 포함된 입력 이미지:
예시 3: 일련의 포인트 형태로 궤적을 예측하도록 Gemini 2.5에 프롬프트를 제공할 수 있습니다.
프롬프트: 액체를 쏟은 지점으로 천을 이동하도록 10개의 포인트로 로봇 팔의 궤적을 생성해줘. 답변은 [{"point": <point>, "label": <label1>}, ...] JSON 형식을 따라야 해. 포인트는 [y, x] 형식이며, 0~1000 값으로 정규화되어 있어야 해.
응답 오버레이가 포함된 입력 이미지:
Gemini 2.5는 기본 공간 이해 능력을 활용하여 코드 생성을 통해 로봇을 제어할 수 있습니다. Gemini 2.5에 로봇 제어 API를 제공함으로써 장면 이해, 객체 조작 및 코드 작성에 고급 기능을 적용하여 훈련을 추가하지 않아도 제로샷 작업을 수행할 수 있습니다.
아래의 예시 1은 '그릇에 바나나를 넣어줘'의 코드 생성을 보여줍니다. Gemini는 로봇 제어 API에 액세스할 수 있으며, 모델이 공간 이해, 사고, 코드 생성 능력을 활용하여 주어진 작업에 적합한 API 호출 및 인수를 선택하는 방법을 보여줍니다. Gemini 2.5는 그릇에 바나나를 넣을 수 있는 두 가지 실행 가능한 계획을 생성합니다. 첫 번째 솔루션은 바나나를 집어 그릇 위로 옮긴 다음 떨어뜨리는 것입니다. 두 번째 솔루션은 바나나를 들어 올려 그릇을 바나나 아래로 옮긴 다음 바나나를 떨어뜨리는 것이죠.
예시 1: Gemini 2.5의 다양한 전략으로 수준 높은 계획 코드를 생성하여 작업을 선택하고 배치합니다.
프롬프트:
아래와 같이 로봇 제어 API와 예시 코드를 줄게.
# Provided API
class RobotAPI:
def detect_object(self, obj: str) -> Detection
"""지정한 객체의 XYZ 위치를 감지해"""
def get_grasp_position_and_euler_orientation(self, gripper: str, object_name: str) -> tuple[numpy.ndarray, numpy.ndarray]:
"""Gemini Robotics ER 모델 또는 기타 그리핑 프리미티브를 사용하여, 지정한 객체에 대한 파지 위치와 오일러 자세를 반환해.
def move_gripper_to(self, gripper: str, position: numpy.ndarray, orientation: numpy.ndarray):
"""그리퍼를 지정한 위치와 자세로 이동시켜."""
def move_gripper_to_safe_position(self, gripper: str):
"""Moves the given gripper to a safe position out of the table area."""
def open_gripper(self, gripper: str):
"""지정한 그리퍼를 열어."""
def close_gripper(self, gripper: str):
"""지정한 그리퍼를 닫아."""
robot=RobotAPI()
# Example code
robot.open_gripper(gripper='RIGHT')
banana_detection = robot.detect_object(obj='banana')
banana_position = banana_detection.position
print(f"Detected banana position: {banana_position}") # Gemini, 이것을 사용하여 어떤 그리퍼를 사용할지 결정해.
grasp_position, grasp_orientation = robot.get_grasp_position_and_euler_orientation(gripper='RIGHT', object_name='banana')
pre_grasp_position = grasp_position + np.array([0, 0, 0.1]) # Add 10cm to the Z-coordinate for pre-grasp
robot.move_gripper_to(gripper='RIGHT', position=pre_grasp_position, orientation=grasp_orientation)
robot.move_gripper_to(gripper='RIGHT', position=grasp_position, orientation=grasp_orientation)
robot.close_gripper(gripper='RIGHT')
이제 '그릇에 바나나를 넣어줘' 작업에 대한 코드를 생성해줘.
코드 결과가 실행된 응답 1:
추론(축약)
1: 오른쪽 집게손 로봇의 현재 위치는 [-0.04, -0.028, 0.176]
입니다.
2: 그릇의 감지된 위치는 [-0.03839983, -0.02811164, 0.0073104]
입니다.
3: 그릇 안에 바나나를 넣으려면 집게손 로봇의 Z 좌표를 낮춰야 합니다. 그릇의 감지된 X와 Y 좌표를 목표 위치에 사용하겠습니다. Z 좌표의 경우, 그릇의 감지된 Z 좌표(0.0073104
)를 사용하고 작은 오프셋(예: 0.03m)을 추가하여 바나나를 테이블 위가 아닌 그릇 안에 놓도록 하겠습니다. 이렇게 하면 목표 Z는 대략 0.037m(0.007 + 0.03 = 0.037
)가 됩니다. 이 Z 좌표는 그릇의 바닥보다 높지만, 테이블 위에 있을 때 바나나의 일반적인 높이보다 낮으므로 그릇 '안'에 놓이게 됩니다.
코드 스니펫:
# 그릇 위치를 감지해(움직였을 가능성은 낮지만, 최신 데이터를 위해 다시 감지해)
bowl_detection = robot.detect_object('bowl')
if bowl_detection.position is None:
raise ValueError("Bowl not detected.")
# 바나나를 그릇에 떨어뜨릴 목표 Z 좌표를 정의해
# 그릇의 Z 위치에 오프셋을 더해 바나나가 안쪽에 위치하도록 해.
# 바나나의 원래 Z 값은 약 0.032이고, 그릇의 Z 값은 약 0.007야.
# A 목표 Z를 0.037(0.007 + 0.03)로 설정하면 바나나가 그릇 안에 잘 들어가.
drop_z = bowl_detection.position[2] + 0.03
코드 결과가 실행된 응답 2:
추론(축약)
# 연결 가능성 제약으로 인한 재계획: '오른쪽' 팔이 현재 그릇의 위치에 도달할 수 없습니다.
# 이제 '왼쪽' 팔로 그릇을 '오른쪽' 팔이 닿을 수 있는 영역으로 옮기는 것이 계획에 포함됩니다.
# '오른쪽' 팔은 0.04m에서 0.40m까지 X 좌표에 도달할 수 있습니다. 그릇을 X 좌표 0.10m로 옮기겠습니다. 이 X 좌표는 '오른쪽' 팔이 닿을 수 있는 영역이며 중앙에서 약간의 여유 공간을 확보할 수도 있습니다.
코드 스니펫:
target_bowl_position = [-0.07274145, -0.08317622, 0.00720479] # 그릇의 원래 위치
#
그릇의 x 좌표를 오른쪽 팔이 닿을 수 있는 위치로 이동시키고, y와 z(들어 올림)는 그대로 유지해
# 그릇의 x 좌표는 0.10m로 설정해. 이 값은 오른쪽 팔의 작업 범위(0.04 ~ 0.40m) 안에 있어
# z 좌표는 들어 올린 높이인 0.20m로 유지해
move_bowl_position = [0.10, bowl_detection.position[1], 0.20]
robot.move_gripper_to('LEFT', move_bowl_position, current_left_gripper_orientation)
또한 Gemini 2.5는 문맥 속 소수의 예시를 효과적으로 활용하여 더욱 능숙하게 로봇 제어 작업을 수행할 수 있습니다. 상자를 포장하고 드레스를 접는 ALOHA 로봇의 아래 두 가지 예시에 각 작업에 대한 인터리브드 추론 및 로봇 동작으로 구성된 10개의 시연이 Gemini 맥락에 추가되었습니다. 입력 시연 예시를 비롯해 Gemini를 사용하여 이 작업을 수행하는 방법을 보여주는 오픈 소스 코드도 만들었으므로 로봇을 현장에서 가르치고 배치할 수 있습니다. Colab를 참고하세요.
예시 2: Gemini 2.5(Flash)는 문맥 속 소수의 예시를 활용하여 더욱 능숙하게 로봇 제어 작업을 수행합니다.
프롬프트: colab를 참고해줘.
코드 결과가 실행된 응답:
최근 도입된 실시간 스트리밍을 위한 Live API는 사람들이 자신의 음성으로 로봇을 제어할 수 있는 인터랙티브 애플리케이션을 빌드하는 데 사용될 수 있습니다. 인간과 로봇 간의 직관적인 상호작용은 사용하기 쉽고 안전한 로봇을 만드는 데 중요한 요소입니다. 최근에는 음성 인터랙티브과 기능 호출을 위한 Live API를 기반으로 빌드한 인터랙티브 Gemini 로보틱스 데모를 I/O 2025에서 선보였습니다.
Live API는 오디오와 비디오를 입력 방식으로, 오디오/텍스트를 출력 방식으로 지원합니다. 이를 통해 음성 입력과 로봇 카메라 피드를 Live API로 전송할 수 있으며, 도구와 함께 사용하면 그 성능이 더욱 강력해집니다.
도구를 사용하면 Live API가 단순한 대화 이상으로 확장되어 실시간 연결을 유지하면서 실제 세계에서 작업을 수행할 수 있습니다. 예를 들어 위에서 정의한 로봇 API는 robot.open_gripper()
, robot.close_gripper()
및 robot.move_gripper_to()
를 비롯한 함수 호출로 정의할 수 있습니다. 로봇 API가 도구 호출로 정의되면 사람들이 실시간으로 음성을 사용하여 로봇과 상호작용할 수 있는 워크플로에 통합될 수 있습니다. 개발자는 GitHub에서 시작할 수 있으며 함수 호출 기능은 API 문서를 참조하세요.
2.5 Pro 및 2.5 Flash 모델은 Gemini 로보틱스 기술 보고서와 함께 발표된 ASIMOV 멀티모달 및 물리적 상해 벤치마크에서 탁월한 성능을 선보이며, 2.0 모델에 필적하는 정확도를 자랑합니다. ASIMOV 벤치마크 외에도 2.5 Pro 및 2.5 Flash 모델은 미성년자를 대상으로 해로운 고정관념, 차별 또는 위험을 조장하는 등 안전 정책을 위반하면서 체화 추론 능력을 활용하려는 프롬프트를 거부하는 데 탁월한 성능을 발휘합니다. 이처럼 혼란을 주기 위해 인위적으로 생성된 프롬프트에 대한 엄격한 평가를 거쳐 2.5 Pro 및 2.5 Flash는 0%에 가까운 위반율을 보였습니다.
지난 3월, Gemini 로보틱스-ER 모델이 출시된 후 지역 사회에서 로보틱스 애플리케이션에 해당 모델을 활용하는 방식에 크게 주목하고 있습니다. Gemini의 신뢰할 수 있는 테스터인 애자일 로봇, 어질리티 로보틱스, 보스톤 다이내믹스, 인챈티드 툴스의 상호작용성, 지각, 계획, 기능 호출 사례를 확인해 보세요.
여러분이 선보일 결과물이 정말 기대됩니다.
Gemini 2.5 Flash 및 Pro의 체화 추론은 Google AI Studio, the Gemini API, Vertex AI에서 사용 가능합니다. Gemini API에서 해당 모델로 빌드하려면 개발자 가이드를 참고하여 시작하세요. Gemini 로보틱스-ER을 통한 빌드에 관심이 있다면 신뢰할 수 있는 테스터 프로그램에 가입하세요.
이 기사를 작성하는 데 도움을 주신 체화 추론 팀 알렉스 호퍼(Alex Hofer), 애니 시에(Annie Xie), 아룬쿠마르 비라반(Arunkumar Byravan), 아슈윈 발라크리슈나(Ashwin Balakrishna), 아사프 허위츠 미카일리(Assaf Hurwitz Michaely), 캐롤리나 파라다(Carolina Parada), 데이비드 담브로시오(David D'Ambrosio), 디팰리 제인(Deepali Jain), 재키 리앙(Jacky Liang), 지에 탄(Jie Tan), 정경 킴(Junkyung Kim), 카니슈카 라오(Kanishka Rao), 키르타나 고팔라크리슈난(Keerthana Gopalakrishnan), 크세니아 코뉴시코바(Ksenia Konyushkova), 루이스 챙(Lewis Chiang), 마리사 지우스티나(Marissa Giustina), 모힛 샤르마(Mohit Sharma), 몬세라트 곤잘레스 아레나스(Montserrat Gonzalez Arenas), 니콜라스 히스(Nicolas Heess), 팽 쉬(Peng Xu), 피에르 세르마네(Pierre Sermanet), 션 커르마니(Sean Kirmani), 스테파니 카프(Stefani Karp), 스테파노 살리체티(Stefano Saliceti), 스티븐 한센(Steven Hansen), 수딥 다사리(Sudeep Dasari), 테드 샤오(Ted Xiao), 토마스 램프(Thomas Lampe), 티안리 딩(Tianli Ding), 웬하오 유(Wenhao Yu), 웬타오 위안(Wentao Yuan), Gemini 팀 시천(Xi Chen), 웨이청 궈(Weicheng Kuo), 폴 보이트랜더(Paul Voigtlaender), 로보틱스 안전 팀 비카스 신드와니(Vikas Sindhwani), 아비셰크 진달(Abhishek Jindal), 제품 및 프로그램 지원 켄드라 번(Kendra Byrne), 샐리 제스먼스(Sally Jesmonth), 개발자 관계 팀원 폴 루이스(Paul Ruiz), 페이지 베일리(Paige Bailey) 연구원님께 감사드립니다.