프로그래머스/ROS

ROS 노드 통신 프로그래밍3(나만의 메시지 정리)

junl 2022. 11. 8. 22:46

###1. 나만의 메시지 만들기

 

##1. 메시지 파일 생성 및 작성

$ cd ~/xycar_ws/src
$ roscd msg_send
$ mkdir msg
$ cd msg
$ gedit my_msg.msg

 

$ gedit my_msg.msg  내용

string first_name
string last_name
int32 age
int32 score
string phone_number
int32 id_number

 

##2

#1 Custom Message 선언

1) package.xml 수정

$ gedit package.xml

 

#2 파일 아래쪽에 내용 추가

  1)

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

 

#3 Custom Message 선언

 1) CMakeLists.txt 수정 (# 코멘트 삭제하고, 추가 삽입하고)

//1줄 새롭게 추가
find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
  message_generation
)                                            

//코멘트 풀고 1줄 새롭게 추가
add_message_files(
    FILES
    my_msg.msg
)

 //코멘트 풀기
generate_messages(
    DEPENDENCIES
    std_msgs
)                             

//1줄 새롭게 추가
catkin_package(
    CATKIN_DEPENDS message_runtime
  #  INCLUDE_DIRS include
  #  CATKIN_DEPENDS rospy std_msgs
  #  DEPENDS system_lib
  )

 

##3 Custom Message 설정과 확인

#1

$ cm
$ rosmsg show my_msg   //결과 확인

string first_name, string last_name, int32 age, int32 score, string phone_number, int32 id_number 총 6개 나와야함

 

 

#2.

1)  (파이썬) ~/xycar_ws/devel/lib/python2.7/dist_packages/msg_send/msg

 

 

실습

1)  msg파일 만들기

string first_name
string last_name
int32 age
int32 score
string phone_number
int32 id_number

 

 

2)

 

 

ROS tutorial 사이트 접속해서 Creating a ROS msg and srv  여기 참조  

복사

추가 

 

CMakeList 텍스트 열기

Open CMakeLists.txt in your favorite text editor (rosed from the previous tutorial is a good option).

 

find페이지 가기

message_generation  타이핑.

 

 

 

 

 

해당 함수 주석지우기 !! ( 첫번쨰랑 마지막)  빌드에러 유의

 

 

빌드하기 

 

 

rosmsg show msg_send/mymsg  로 확인

 

 


### 2. 내 코드 안에서 Custom Message 사용하기

##1. 코드 안에 include or import 방식

1)파이썬 

from msg_send.msg import my_msg

 

2)다른 패키지에서도 custom msg 사용가능

 

3) 참고링크

http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv

 

##2. my_msg 사용예제

1) 

$ gedit msg_sender.py

#!/usr/bin/env python

import rospy
 #my_msg 사용
from msg_send.msg import my_msg  

rospy.init_node("msg_sender", anonymous=True)
pub = rospy.Publisher("msg_to_xycar", my_msg)  #이 노드는 publisher(rospy.Publisher) , msg_to_xycar 토픽을 밖으로 보냄 해당 타입 my_msg

#my_msg 안에 데이터 채워넣기
msg = my_msg()
msg.first_name = "gildon"
msg.last_name = "Hong"
msg.id_number = 20041003
msg.phone_number = "010-8990-3003

#// my_msg 토픽 발행
rate = rospy.Rate(1)
while not rospy.is_shutdown():
    pub.publish(msg)
    print("sending message")
    rate.sleep()

 

2) 메시지 구독 Subscriber node

$ gedit msg_receiver.py

#!/usr/bin/env python

import rospy
from msg_send.msg import my_msg    #my_msg 사용

#my_msg 데이터 꺼내기
def callback(msg):
    print("1. Name: ", msg.last_name + msg.first_name)
    print("2. ID: ", msg.id_number)
    print("3. Phone Number: ", msg.phone_number)

rospy.init_node("msg_receiver", anonymous=True)

#my_msg 토픽 구독
sub = rospy.Subscriber("msg_to_xycar", my_msg, callback)

rospy.spin()

$ chmod +x *.py  로 권한 허용

 

빌드 & 실행

$ cm
$ roscore
$ rosrun msg_send msg_receiver.py
$ rosrun msg_Send msg_sender.py

 

launch 로 하면

& roslaunch msg_send m_send_sr.launch    파일 만들기

<launch>
         <node pkg="msg_send" type="msg_sender.py" name="sender1"/>
         <node pkg="msg_send" type="msg_sender.py" name="sender2"/>
         <node pkg="msg_send" type="msg_receiver.py" name="receiver" output="screen"/>
</launch>

 

 


실습

ROS 는 파이썬 2.0이라서 하기 블로그참조하여 파이썬 코드 맨 상단에 utf-8 문구 집어넣기.  한글 주석했다가 아스키문제 생김.

 

https://codaa.tistory.com/371

 

[Python 오늘의 에러] Non-ASCII Character 관련된 한글 에러 문제

파이썬의 경우 기본적인 설정 상태에서, 코드내에 한글이 있는 경우 다음과 같은 오류가 발생합니다. SyntaxError: Non-ASCII Character 관련된 에러라고 부릅니다. 코드 내에 한글을 파이썬이 읽어들이

codaa.tistory.com

 

 

 

 

 

 


ROS 노드 통신 프로그래밍

#1. 다양한 상황에서의 노드 통신