ros::spin()κ³Ό ros::spinOnce의 차이점에 λŒ€ν•΄μ„œ μ •λ¦¬ν•œλ‹€

κ²Œμ‹œκΈ€ 끝에 κ°„λ‹¨ν•œ μ½”λ“œ 예제λ₯Ό λ³΄λ©΄μ„œ 이해λ₯Ό λ•μž!


ros ν†΅μ‹ μ—μ„œλŠ” 기본적으둜 messageκ°€ ν† ν”½ ν˜•μ‹μœΌλ‘œ subscriber에 μˆ˜μ‹ μ΄ 될 경우 그것을 큐(queue)에 μ €μž₯ν•œλ‹€


보톡 μˆ˜μ‹ μΈ‘μ—μ„œ spin() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 큐에 μžˆλŠ” 메세지λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ ꡬ성이 λ˜μ–΄ μžˆλ‹€
이 λ•Œ spin, spinOnce λͺ¨λ‘ 토픽을 subscribeν•  λ•Œ ν•΄λ‹Ή callback ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€

차이점

무엇이 λ‹€λ₯Έκ°€?

ros::spin()

μ•„μ£Ό μ‰½κ²Œ λ§ν•΄μ„œ ros::spin()은 μΌμ’…μ˜ λ¬΄ν•œ 루프이닀
즉, 이 ν•¨μˆ˜κ°€ 호좜되기 이전에 μ„ μ–Έλœ λͺ¨λ“  callback ν•¨μˆ˜λ₯Ό λͺ¨λ‘ μ‹€ν–‰ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€


이 경우 λ³„λ„μ˜ while문을 μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€
λ¬΄ν•œλ£¨ν”„μ΄λ―€λ‘œ ros::spin() 이후에 μ„ μ–Έλœ λ¬Έμž₯듀은 λ³„λ„μ˜ μ’…λ£Œ ν”„λ‘œμ„ΈμŠ€κ°€ 있기 μ „κΉŒμ§€ μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ‹ˆ μ£Όμ˜ν•˜μž


ros::spinOnce

κ²½ν—˜μƒ ros::spin()에 λΉ„ν•΄ 정말 μœ μ—°ν•˜κ³  자주 μ‚¬μš©λ˜λŠ” 방법인 것 κ°™λ‹€
ros::spinOnce()λΌλŠ” μ΄λ¦„μ—μ„œλ„ λŠκ»΄μ§€λ“― ν•œλ²ˆ λˆλ‹€μ΄λŸ° λ‰˜μ•™μŠ€λ‹€

μ΄λŠ” ν˜„μž¬κΉŒμ§€ μš”μ²­λœ λͺ¨λ“  callback ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  callback ν•¨μˆ˜μ— λ“€μ–΄κ°”λ‹€κ°€ λ°”λ‘œ λ‹€μŒ μ€„μ˜ λͺ…λ μ–΄λ‘œ λ„˜μ–΄κ°„λ‹€
λ”°λΌμ„œ 이 λ•Œ ν•„μš”ν•œ 것은 반볡문의 ꡬ쑰와 κ·Έ μ£ΌκΈ°λ₯Ό ν•„μš”λ‘œ ν•œλ‹€

μ£ΌκΈ°λŠ” ros::Rate() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ •μ˜ν•œλ‹€

특히 μ„Όμ„œ λ°μ΄ν„°λ‚˜ ν˜„μž¬ μƒνƒœλ₯Ό 정해진 μ£ΌκΈ°(e.g. 100Hz)둜 μ—…λ°μ΄νŠΈ μ‹œμΌœμ•Όν•  λ•Œ 자주 μ‚¬μš©λœλ‹€

μ½”λ“œ 예제

ros::spin()

chatcallback()μ΄λΌλŠ” μ½œλ°±ν•¨μˆ˜λ₯Ό 루프 μ£ΌκΈ° 없이 계속 μ‹€ν–‰ν•˜κ² λ‹€λŠ” λœ»μ΄λ‹€

int main(int argc, char **argv)
{
  ros::init(argc, argv, "listener");

  ros::Subscriber sub = n.subscribe("chat", 1, chatcallback);

  ros::spin();
  return 0;
}


ros::spinOnce()

chatcallback ν•¨μˆ˜μ— ν•œλ²ˆ λ“€μ–΄κ°”λ‹€κ°€ λ‹€μ‹œ λ‚˜μ™€μ„œ 메인 루프가 10hz둜 λ™μž‘ν•˜λŠ” μ˜ˆμ œλ‹€

int main(int argc, char **argv)
{
  ros::init(argc, argv, "listener");

  ros::Subscriber sub = n.subscribe("chat", 2, chatcallback);

  ros::Rate loop_rate(10);
  while (ros::ok())
  {
      /*...TODO...*/ 

      ros::spinOnce();

      loop_rate.sleep();
  }
  return 0;
}

Leave a comment