ROS 노드 통신 프로그래밍3(나만의 메시지 정리)
###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 문구 집어넣기. 한글 주석했다가 아스키문제 생김.
[Python 오늘의 에러] Non-ASCII Character 관련된 한글 에러 문제
파이썬의 경우 기본적인 설정 상태에서, 코드내에 한글이 있는 경우 다음과 같은 오류가 발생합니다. SyntaxError: Non-ASCII Character 관련된 에러라고 부릅니다. 코드 내에 한글을 파이썬이 읽어들이
codaa.tistory.com


ROS 노드 통신 프로그래밍
#1. 다양한 상황에서의 노드 통신