ROS의 통신 지연 시간 검증 ①
개요
ROS(melodic)의 통신 지연 시간을 검증해 보았다.
최근 본격적으로 ROS를 개발하기 시작한 ROS 초보자입니다.
알다시피 ROS의 실시간성은 매우 낮지만 실제로 얼마나 큰 실시간성을 기대할 수 있는지는 노드 간 통신의 지연 시간 관점에서 검증되었다.
여기에는 검증 프로그램의 기본 동작과 ROS의 시간 시스템이 기본적으로 설명되어 있다.적절한 가상 시스템에서 검증되었으며 자세한 성능 검증은 별도로 발표됩니다.
ROS에서의 처리 시간 측정
나는 C/C++에서chrono 함수 등 시간 측정용 함수로 처리 시간 측정을 한다고 생각한다.
처리 시간 측정 함수
ROS는 물론 같은 함수로 시간 측정을 할 수도 있지만 ROS를 이해하기 위해 ROS의 일지에서 처리 시간을 측정하고 싶다.
코드 및 실행 결과 확인
그럼, 노드 간 통신의 지연 시간을 보고 싶습니다.
여기에서 나는 간단한 문자열을 보내서 발송할 때와 수신할 때의 시간 스탬프를 보고 지연 시간을 측정하고 싶다.
검증에서 아래 ROS 강좌를 참고했습니다.
ROS 강좌 03Pub & Sub 통신
인증에 사용할 송신 코드입니다.
상세한 동작은 상술한 ROS 강좌에 기재되어 있기 때문에 사랑을 베는 것이지만, 여기서 주목해야 할 것은ros::Rate loop_rate(100);
이다.
이것은publisher단의 데이터 전송 속도입니다.즉, 이 코드는 100Hz(10ms당 한 번)로 데이터를 전송합니다.이때 전송된 데이터는 msg.data = "Test msg";
와 같이'테스트 msg'문자열입니다.
test_publisher.cpp#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "test_publisher");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 10);
ros::Rate loop_rate(100);
while (ros::ok())
{
std_msgs::String msg;
msg.data = "Test msg";
ROS_INFO("publish: %s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
이에 대응하는subscriber (수신) 는 다음과 같습니다.
test_subscriber.cpp#include <ros/ros.h>
#include <std_msgs/String.h>
void chatterCallback(const std_msgs::String& msg)
{
ROS_INFO("subscribe: %s", msg.data.c_str());
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "test_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 10, chatterCallback);
ros::spin();
return 0;
}
이 밖에 모든publisher와subscriber는 ROS_INFO
라는 함수를 사용하는데 이것은 마치 결과를 단말기printf
에 출력하기 위한 것과 같다.
다음은 launch 파일입니다.
test_pubsub.launch<launch>
<node name="test_publisher" pkg="latency_test" type="test_publisher" output="screen"/>
<node name="test_sybscriber" pkg="latency_test" type="test_subscriber" output="screen"/>
</launch>
현재, 상기 launch 파일을 실행할 때, 아래와 같이 "테스트 msg"라는 문자열만 보내고 수신합니다.
이 시간ROS_INFO
이 실행된 시간도 표시됩니다.
ROS의 시간 형식은 여기의 공식 문서에 기록되어 있는데 소수점 전은sec이고 소수점 이후는nsec이다.한편,sec는 에포크 초다.
이 단말기에서 져보니publish는 10msec 정도의 간격으로 진행되며,publish에서subscribe까지의 간격은 1msec 이하입니다.
전송 속도 및 통신 지연 시간 확인 script
로 단말기의 디스플레이 결과를 기록하고 분석할 수 있지만 ROS의 기능은 이 결과를 자동으로 로그로 보존한다.기본적으로 사용자 폴더 바로 아래에 저장됩니다 /.ros/log/latestrosout.log
.
나는 아래의 스크립트로 이 로그 파일을 간단하게 분석했다.
check_time_stamp_pubsub.pyimport csv
import numpy as np
import matplotlib.pyplot as plt
# Specify file name of log file
file = 'rosout.log'
log_file = open(file, "r", encoding="UTF-8")
dataList = log_file.readlines()
# Specify extract name
extract_word1 = 'publish'
extract_word2 = 'subscribe'
published_time = []
subscribed_time = []
for row in dataList:
if extract_word1 in row:
published_time.append(float(row[:20]))
if extract_word2 in row:
subscribed_time.append(float(row[:20]))
# Convert to numpy array
published_time = np.array(published_time)
subscribed_time = np.array(subscribed_time)
diff_pub_time = []
for t in range(0,len(published_time)-1):
diff_pub_time.append(published_time[t+1]-published_time[t])
# Remove surplus index
diff_num = len(published_time) - len(subscribed_time)
published_time = np.delete(published_time,slice(0,diff_num))
transmit_time = subscribed_time - published_time
pub_time_ave = np.mean(diff_pub_time)
pub_time_std = np.std(diff_pub_time)
transmit_time_ave = np.mean(transmit_time)
transmit_time_std = np.std(transmit_time)
print('Pub time : Ave = {0}, STD = {1}'.format(pub_time_ave, pub_time_std))
print('Transmit time : Ave = {0}, STD = {1}'.format(transmit_time_ave, transmit_time_std))
plt.figure()
plt.scatter(range(0,len(diff_pub_time)),diff_pub_time)
plt.xlabel('Frame')
plt.ylabel('Time [sec.]')
plt.figure()
plt.scatter(range(0,len(transmit_time)),transmit_time)
plt.xlabel('Frame')
plt.ylabel('Time [sec.]')
plt.show()
다음은 전송 속도입니다.전송 시간과 이전 전송 시간 사이의 차이를 그립니다.100Hz로 보내기 때문에 여기는 10msec일 거예요. 하지만 최대 2msec 정도의 편차가 있어요.평균 10msec, 표준 편차가 400usec이기 때문에 대략 100Hz로 발송된다는 것을 알 수 있다.
다음 전송에서 수신까지의 지연을 검증했습니다.
지연이 가장 크면 3msec 정도의 지연이 있는데 평균 300us이고 표준 편차는 90usec의 지연이다.300us라면 충분히 빠를 것 같지만 3msec라면 뒷부분에 따라 실시간 동작에 영향을 줄 수 있습니다.
또한 이때publish의 횟수와subscribe의 횟수가 없으면publish가 먼저 동작을 시작하고 11번을 보내면subscribe의 동작이 시작됩니다.분석용 스크립트에서publish 측에서 먼저 동작을 시작하는 것을 전제로subscribe가 동작을 시작하기 전의 데이터를 버립니다.
총결산
우리는pub&sub가 발송될 때의 지연 시간을 간단하게 검증했다.
· 송신 속도, 통신 지연에 편차가 있음(최대 2msec, 3msec)
· 통신 지연이 짧은 문자열이면 300us 정도
・ 노드의 동작이 시작될 때 차이가 있음
앞으로 다음 내용을 바꿔 지연 시간 검증을 진행할 계획이다.
전송 데이터 용량
버퍼 크기
ROS 초보자라서 기재 내용이 틀리거나 조언이 있으면 댓글로 남겨주세요.
(추적) 데이터 크기와 지연 시간을 검증했습니다.ROS에서의 통신 지연 시간 검증 ②
Reference
이 문제에 관하여(ROS의 통신 지연 시간 검증 ①), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/moominparis/items/79ccd5b96548e958e837
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
나는 C/C++에서chrono 함수 등 시간 측정용 함수로 처리 시간 측정을 한다고 생각한다.
처리 시간 측정 함수
ROS는 물론 같은 함수로 시간 측정을 할 수도 있지만 ROS를 이해하기 위해 ROS의 일지에서 처리 시간을 측정하고 싶다.
코드 및 실행 결과 확인
그럼, 노드 간 통신의 지연 시간을 보고 싶습니다.
여기에서 나는 간단한 문자열을 보내서 발송할 때와 수신할 때의 시간 스탬프를 보고 지연 시간을 측정하고 싶다.
검증에서 아래 ROS 강좌를 참고했습니다.
ROS 강좌 03Pub & Sub 통신
인증에 사용할 송신 코드입니다.
상세한 동작은 상술한 ROS 강좌에 기재되어 있기 때문에 사랑을 베는 것이지만, 여기서 주목해야 할 것은ros::Rate loop_rate(100);
이다.
이것은publisher단의 데이터 전송 속도입니다.즉, 이 코드는 100Hz(10ms당 한 번)로 데이터를 전송합니다.이때 전송된 데이터는 msg.data = "Test msg";
와 같이'테스트 msg'문자열입니다.
test_publisher.cpp#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "test_publisher");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 10);
ros::Rate loop_rate(100);
while (ros::ok())
{
std_msgs::String msg;
msg.data = "Test msg";
ROS_INFO("publish: %s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
이에 대응하는subscriber (수신) 는 다음과 같습니다.
test_subscriber.cpp#include <ros/ros.h>
#include <std_msgs/String.h>
void chatterCallback(const std_msgs::String& msg)
{
ROS_INFO("subscribe: %s", msg.data.c_str());
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "test_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 10, chatterCallback);
ros::spin();
return 0;
}
이 밖에 모든publisher와subscriber는 ROS_INFO
라는 함수를 사용하는데 이것은 마치 결과를 단말기printf
에 출력하기 위한 것과 같다.
다음은 launch 파일입니다.
test_pubsub.launch<launch>
<node name="test_publisher" pkg="latency_test" type="test_publisher" output="screen"/>
<node name="test_sybscriber" pkg="latency_test" type="test_subscriber" output="screen"/>
</launch>
현재, 상기 launch 파일을 실행할 때, 아래와 같이 "테스트 msg"라는 문자열만 보내고 수신합니다.
이 시간ROS_INFO
이 실행된 시간도 표시됩니다.
ROS의 시간 형식은 여기의 공식 문서에 기록되어 있는데 소수점 전은sec이고 소수점 이후는nsec이다.한편,sec는 에포크 초다.
이 단말기에서 져보니publish는 10msec 정도의 간격으로 진행되며,publish에서subscribe까지의 간격은 1msec 이하입니다.
전송 속도 및 통신 지연 시간 확인 script
로 단말기의 디스플레이 결과를 기록하고 분석할 수 있지만 ROS의 기능은 이 결과를 자동으로 로그로 보존한다.기본적으로 사용자 폴더 바로 아래에 저장됩니다 /.ros/log/latestrosout.log
.
나는 아래의 스크립트로 이 로그 파일을 간단하게 분석했다.
check_time_stamp_pubsub.pyimport csv
import numpy as np
import matplotlib.pyplot as plt
# Specify file name of log file
file = 'rosout.log'
log_file = open(file, "r", encoding="UTF-8")
dataList = log_file.readlines()
# Specify extract name
extract_word1 = 'publish'
extract_word2 = 'subscribe'
published_time = []
subscribed_time = []
for row in dataList:
if extract_word1 in row:
published_time.append(float(row[:20]))
if extract_word2 in row:
subscribed_time.append(float(row[:20]))
# Convert to numpy array
published_time = np.array(published_time)
subscribed_time = np.array(subscribed_time)
diff_pub_time = []
for t in range(0,len(published_time)-1):
diff_pub_time.append(published_time[t+1]-published_time[t])
# Remove surplus index
diff_num = len(published_time) - len(subscribed_time)
published_time = np.delete(published_time,slice(0,diff_num))
transmit_time = subscribed_time - published_time
pub_time_ave = np.mean(diff_pub_time)
pub_time_std = np.std(diff_pub_time)
transmit_time_ave = np.mean(transmit_time)
transmit_time_std = np.std(transmit_time)
print('Pub time : Ave = {0}, STD = {1}'.format(pub_time_ave, pub_time_std))
print('Transmit time : Ave = {0}, STD = {1}'.format(transmit_time_ave, transmit_time_std))
plt.figure()
plt.scatter(range(0,len(diff_pub_time)),diff_pub_time)
plt.xlabel('Frame')
plt.ylabel('Time [sec.]')
plt.figure()
plt.scatter(range(0,len(transmit_time)),transmit_time)
plt.xlabel('Frame')
plt.ylabel('Time [sec.]')
plt.show()
다음은 전송 속도입니다.전송 시간과 이전 전송 시간 사이의 차이를 그립니다.100Hz로 보내기 때문에 여기는 10msec일 거예요. 하지만 최대 2msec 정도의 편차가 있어요.평균 10msec, 표준 편차가 400usec이기 때문에 대략 100Hz로 발송된다는 것을 알 수 있다.
다음 전송에서 수신까지의 지연을 검증했습니다.
지연이 가장 크면 3msec 정도의 지연이 있는데 평균 300us이고 표준 편차는 90usec의 지연이다.300us라면 충분히 빠를 것 같지만 3msec라면 뒷부분에 따라 실시간 동작에 영향을 줄 수 있습니다.
또한 이때publish의 횟수와subscribe의 횟수가 없으면publish가 먼저 동작을 시작하고 11번을 보내면subscribe의 동작이 시작됩니다.분석용 스크립트에서publish 측에서 먼저 동작을 시작하는 것을 전제로subscribe가 동작을 시작하기 전의 데이터를 버립니다.
총결산
우리는pub&sub가 발송될 때의 지연 시간을 간단하게 검증했다.
· 송신 속도, 통신 지연에 편차가 있음(최대 2msec, 3msec)
· 통신 지연이 짧은 문자열이면 300us 정도
・ 노드의 동작이 시작될 때 차이가 있음
앞으로 다음 내용을 바꿔 지연 시간 검증을 진행할 계획이다.
전송 데이터 용량
버퍼 크기
ROS 초보자라서 기재 내용이 틀리거나 조언이 있으면 댓글로 남겨주세요.
(추적) 데이터 크기와 지연 시간을 검증했습니다.ROS에서의 통신 지연 시간 검증 ②
Reference
이 문제에 관하여(ROS의 통신 지연 시간 검증 ①), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/moominparis/items/79ccd5b96548e958e837
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "test_publisher");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 10);
ros::Rate loop_rate(100);
while (ros::ok())
{
std_msgs::String msg;
msg.data = "Test msg";
ROS_INFO("publish: %s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
#include <ros/ros.h>
#include <std_msgs/String.h>
void chatterCallback(const std_msgs::String& msg)
{
ROS_INFO("subscribe: %s", msg.data.c_str());
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "test_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 10, chatterCallback);
ros::spin();
return 0;
}
<launch>
<node name="test_publisher" pkg="latency_test" type="test_publisher" output="screen"/>
<node name="test_sybscriber" pkg="latency_test" type="test_subscriber" output="screen"/>
</launch>
script
로 단말기의 디스플레이 결과를 기록하고 분석할 수 있지만 ROS의 기능은 이 결과를 자동으로 로그로 보존한다.기본적으로 사용자 폴더 바로 아래에 저장됩니다 /.ros/log/latestrosout.log
.나는 아래의 스크립트로 이 로그 파일을 간단하게 분석했다.
check_time_stamp_pubsub.py
import csv
import numpy as np
import matplotlib.pyplot as plt
# Specify file name of log file
file = 'rosout.log'
log_file = open(file, "r", encoding="UTF-8")
dataList = log_file.readlines()
# Specify extract name
extract_word1 = 'publish'
extract_word2 = 'subscribe'
published_time = []
subscribed_time = []
for row in dataList:
if extract_word1 in row:
published_time.append(float(row[:20]))
if extract_word2 in row:
subscribed_time.append(float(row[:20]))
# Convert to numpy array
published_time = np.array(published_time)
subscribed_time = np.array(subscribed_time)
diff_pub_time = []
for t in range(0,len(published_time)-1):
diff_pub_time.append(published_time[t+1]-published_time[t])
# Remove surplus index
diff_num = len(published_time) - len(subscribed_time)
published_time = np.delete(published_time,slice(0,diff_num))
transmit_time = subscribed_time - published_time
pub_time_ave = np.mean(diff_pub_time)
pub_time_std = np.std(diff_pub_time)
transmit_time_ave = np.mean(transmit_time)
transmit_time_std = np.std(transmit_time)
print('Pub time : Ave = {0}, STD = {1}'.format(pub_time_ave, pub_time_std))
print('Transmit time : Ave = {0}, STD = {1}'.format(transmit_time_ave, transmit_time_std))
plt.figure()
plt.scatter(range(0,len(diff_pub_time)),diff_pub_time)
plt.xlabel('Frame')
plt.ylabel('Time [sec.]')
plt.figure()
plt.scatter(range(0,len(transmit_time)),transmit_time)
plt.xlabel('Frame')
plt.ylabel('Time [sec.]')
plt.show()
다음은 전송 속도입니다.전송 시간과 이전 전송 시간 사이의 차이를 그립니다.100Hz로 보내기 때문에 여기는 10msec일 거예요. 하지만 최대 2msec 정도의 편차가 있어요.평균 10msec, 표준 편차가 400usec이기 때문에 대략 100Hz로 발송된다는 것을 알 수 있다.다음 전송에서 수신까지의 지연을 검증했습니다.
지연이 가장 크면 3msec 정도의 지연이 있는데 평균 300us이고 표준 편차는 90usec의 지연이다.300us라면 충분히 빠를 것 같지만 3msec라면 뒷부분에 따라 실시간 동작에 영향을 줄 수 있습니다.
또한 이때publish의 횟수와subscribe의 횟수가 없으면publish가 먼저 동작을 시작하고 11번을 보내면subscribe의 동작이 시작됩니다.분석용 스크립트에서publish 측에서 먼저 동작을 시작하는 것을 전제로subscribe가 동작을 시작하기 전의 데이터를 버립니다.
총결산
우리는pub&sub가 발송될 때의 지연 시간을 간단하게 검증했다.
· 송신 속도, 통신 지연에 편차가 있음(최대 2msec, 3msec)
· 통신 지연이 짧은 문자열이면 300us 정도
・ 노드의 동작이 시작될 때 차이가 있음
앞으로 다음 내용을 바꿔 지연 시간 검증을 진행할 계획이다.
전송 데이터 용량
버퍼 크기
ROS 초보자라서 기재 내용이 틀리거나 조언이 있으면 댓글로 남겨주세요.
(추적) 데이터 크기와 지연 시간을 검증했습니다.ROS에서의 통신 지연 시간 검증 ②
Reference
이 문제에 관하여(ROS의 통신 지연 시간 검증 ①), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/moominparis/items/79ccd5b96548e958e837
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(ROS의 통신 지연 시간 검증 ①), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/moominparis/items/79ccd5b96548e958e837텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)