매우 짧은 답변 : 2
센서
하나의 노드 또는 각각의 센서에서 모든 센서를 읽을 지 여부와 관련하여이 질문을 스스로에게해야합니다.
다른 센서가 없으면 센서가 의미가 없습니까?
이 질문은 센서가 단단히 결합되어 있는지 묻습니다. 예를 들어 온도에 민감한 센서가 있고이를 보상해야한다고 가정 해보십시오. 주로 다른 센서의 값을 고정하기 위해 온도 센서를 추가합니다. 이 시나리오에서는 두 값이 밀접하게 연결되어 있기 때문에 두 값을 동시에 읽는 것이 좋습니다. 실제로 온도 센서의 판독 값이 없으면 원래 센서의 판독 값이 쓸모가 없습니다.
반면에 센서가 개별적으로 유용한 경우 반드시 별도의 노드에 보관하십시오. 이것은 많은 이점이 있습니다 :
- 별도의 프로세서에서 노드를 실행할 수 있습니다
- 미래 로봇에서 노드를 재사용 할 수 있음
- 한 노드와의 통신 실패로 전체 시스템이 다운되지는 않습니다.
- 결함이있는 센서 보드에서 수집을 다시 시작하면 다른 센서 보드와 별도로 수행 할 수 있습니다.
실제로, 위의 이점 중 하나 가 필요한 경우 센서가 단단히 연결되어 있어도 별도의 노드를 사용해야하지만 일반적으로 발생하지는 않습니다.
액추에이터
이것은 비슷합니다.
액추에이터없이 다른 액추에이터는 의미가 없습니까?
예를 들어, 각 힘줄마다 (어떤 이유로 든) 두 모터가 동시에 한 방향으로 또는 다른 방향으로 관절을 움직일 책임이있는 로봇 힘줄이 있는 손목을 설계하는 경우 , 동일한 노드에 서비스를 제공하면 훨씬 더 많은 효과를 볼 수 있습니다 별도의 것보다 감각.
반면, 액추에이터가 독립적 인 경우 (일반적인 경우)에는 각 액추에이터마다 하나의 노드가있는 것이 좋습니다. 이 경우 각 노드를 다른 노드에 넣을 수 있습니다. 센서와 동일한 이점 외에도 다음과 같은 이점이 있습니다.
- 어떤 이유로 든 액츄에이터가 정지되면 다른 액츄에이터는 여전히 작동합니다. 여분의 자유도가 있다면, 그들은 그것을 완전히 보상 할 수도 있습니다.
이것은 한 가지 의미가 있습니다. 액추에이터가 조화롭게 작동 해야하는 경우 동일한 노드에 배치하십시오. 이것은 통신 장애 때문이 아니라 다른 노드가 다른 지연을 의미하기 때문입니다. 분산 시스템에서 각 노드는 네트워크의 다른 부분에 있으므로 지연의 차이가 발생합니다. 중앙 집중식 시스템에서는 각 프로세스의 스케줄링 운 으로 인해 CPU 부하가 높을 때 다른 지연이 발생합니다 .
핸들러가 있어야합니까?
대답은 "의존"이지만 많은 장점이있는 일반적인 접근 방식이 있습니다. 이름을 변경하고 "컨트롤러"라고하겠습니다. 접근 방식은 "예, 컨트롤러가 있어야합니다"입니다.
컨트롤러를 사용하면 다음과 같은 장점이 있습니다.
- 분리 된 처리 : 각 노드는 다음을 의미합니다.
- 단순성 : 암시
- 보다 쉬운 개발
- 보다 쉬운 디버깅
- 적은 오류
- 실패 가능성 감소
- 재사용 성 : 동일한 기능 (메시지 및 서비스 형식)이있는 경우 동일한 컨트롤러를 다른 센서 노드와 함께 사용할 수 있기 때문입니다.
- 별도의 하드웨어에서 실행 : 각 노드는 네트워크에서 이동할 수 있습니다. 예를 들어, 센서 및 액츄에이터 노드는 전용 마이크로 컨트롤러 ( 예 : 아두 이노 (권장하지 않음)) 및 PC의 컨트롤러 로 이동할 수 있습니다 .
- 센서가 액추에이터에 직접 영향을 미치려고한다면 결과는 엉망입니다. 컨트롤러가 없다고 가정하면 각 경우를 살펴 보겠습니다.
- 하나의 센서 노드 : 기본적으로 이는 센서 노드와 컨트롤러가 동일한 노드에 결합됨을 의미합니다. 나쁘지는 않지만 매우 불필요합니다.
- 많은 센서 노드 : 이것은 혼란입니다. 이는 컨트롤러가 센서 노드에 분산되어 있음을 의미합니다 . 따라서 모든 센서 노드는 관련 액추에이터를 제어하는 방법을 알기 위해 서로 통신해야합니다. 의사 소통에 실패했거나 다양한 종류의 지연이 있다고 상상해보십시오. 이것이 완전히 불필요하다는 것을 감안할 때, 그럴 이유가 없습니다!
이들은 단점도 있다고 말했다. 더 많은 노드 (컨트롤러뿐만 아니라 모든 노드)를 갖는 것은 다음을 의미합니다.
- 더 낭비되는 통신 : 데이터는 네트워크 또는 공유 메모리를 통해 표준 형식 (직렬화 및 역 직렬화)으로 이동해야하며, ROS 코어는이를보고 누구에게 전달할 것인지 등을 결정해야합니다. 의사 소통에서. 한 곳에있는 모든 노드가 그 비용이 0 일 수 있습니다.
- 더 높은 실패 가능성 : 어떤 이유로 든 네트워크 링크가 다운되거나 노드가 종료되면 시스템에 장애가있는 것입니다. 준비하지 않으면 전체 시스템이 중단 될 수 있습니다. 이제 이것은 일반적으로 시스템의 일부를 잃을 수는 있지만 모든 시스템을 (실제로 열화 시키는 것은 아님) 잃을 수있는 좋은 방법이지만 , 가능한 한 피해야하는 응용 프로그램도 있습니다. 통신을 차단하고 모든 코드를 하나의 노드에 배치하면 실제로 시스템 안정성에 도움이됩니다. 단점은 물론 시스템이 제대로 작동하거나 갑자기 완전히 죽는다는 것입니다.
- 혼란스러운 타이밍 : 각 노드는 자체적으로 실행됩니다. 메시지가 다른 사람에게 도착하는 데 걸리는 시간은 비 결정적이며 실행마다 다릅니다. 노드가 각 메시지에 타임 스탬프를 표시하지 않는 한 (부록 참고 : ROS에서는 그렇지 않은 경우 시계를 제대로 동기화해야 함) 각 수신 노드가 지연을 고려하여 적절하게 제어 할 수없는 경우 (매우 어려운 작업 임) 그 자체로) 여러 노드를 갖는 것은 데이터의 연령에 대한 높은 불확실성을 의미합니다. 이것은 사실 대부분의 로봇이 너무 느리게 움직이는 이유 중 하나입니다. 제어 루프는 모든 데이터가 현재주기와 일치하도록 충분히 느려 야합니다. 지연이 클수록 제어 루프가 느려집니다.
상기의 모든 단점에서, 해결책은 노드의 수를, 바람직하게는 단일 노드로 감소시키는 것이다. 잠깐만, 더 이상 ROS를 사용하지 않습니다! 바로 그거죠.
요약:
- 지연이 산발적으로 높아질 수있는 비 실시간 시스템에는 ROS를 사용하십시오. 이 경우 원하는만큼의 ROS 노드를 보유하십시오. 실제로 각 ROS 노드가 한 가지만 수행하도록하는 것이 좋습니다. 그렇게하면 매우 단순 해지며 재사용 성이 높아집니다.
- 반면, 실시간 시스템의 경우 ROS를 피하십시오. 이를 위해 EtherCAT 과 같은 오 로코 와 기술 이 있으며 종종 애드혹 솔루션이 있습니다.
마지막으로 실제로 ROS는 훌륭합니다. 좋지는 않지만 괜찮습니다. 시스템이 중요하지 않은 경우가 많으며 실패 할 가능성이 너무 작아서 다시 시작하는 것이 그리 중요하지 않은 경우가 많습니다. 이것은 타조 알고리즘입니다 !