Priceless

[ROS1] ROS1 Package(패키지) 본문

ROS1 & ROS2

[ROS1] ROS1 Package(패키지)

Hyun__ 2023. 10. 8. 17:18

ROS의 패키지 만들기

Package란

- Package: ROS에서 개발하는 코드들을 묶어서 만든 파일

워크스페이스 내의 src 파일 내에 만든다

 

구조

워크스페이스의 전체적인 구조는 아래와 같다

package 내의 파일을 관리하는 과정이다

package는 src 폴더 내에 여러 개 있을 수 있다

 

과정

1. 워크스페이스(폴더)를 생성하고 내에 src 폴더를 생성한다

워크스페이스 내에서 catkin으로 빌드한다

그 결과 워크스페이스 내에 devel, build 폴더가 생성된다

# 워크스페이스 생성
mkdir -p ~/<workspace_name>/src
cd ~/<workspace_name>/
catkin_make

 

2. 워크스페이스 내의 src 파일로 이동한다

이후 아래 명령어를 통해 Package가 의존하고 있는 다른 package를 추가한다

cd <path to workspace/src>
#cd my_ws/src

catkin_create_pkg <package 이름> <package가 의존하고 있는 다른 packages>
catkin_create_pkg my_pkg1 std_msgs rospy

 

3. 새로운 package가 추가되었으므로 package를 다시 build 한다

cd <path to workspace>
catkin_make

 

3-1. package와 관련된 명령어

rospack find <pkg name> # package의 경로를 찾는다
rospack list | grep <pkg name> # package의 경로를 찾는다
rospack depend1 <pkg name> # package가 의존하는 다른 packages를 출력한다
roscd <pkg name> # package가 위치한 곳으로 이동한다

 

Package 예제 

구성

turtlesim 노드와 packag를 통해 작동시키는 예제이다

 

실습 과정

0. ROS 마스터를 실행한 후 다른 터미널에서 turtlesim node를 실행한다

# 1st terminal
roscore

# other terminal
rosrun turtlesim turtlesim_node

 

1. package 내의 src 폴더 내에서 ROS 작업을 할 package 파일을 추가한다

# 경로: /<path to workspace>/src/<pkg name>/src

 

publish하기 위한 pub.py를 추가한다

pub.py

#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

# 노드를 만든다
rospy.init_node('my_node', anonymous=True) # True인 경우 이름 변경 가능

# publisher 객체를 생성한다
pub = rospy. Publisher ('/turtle1/cmd_vel', Twist, queue_size=10)

msg = Twist()
msg.linear.x = 2.0
msg. linear.y = 0.0
Publisher 77|| #
msg.linear.z = 0.0
msg. angular.x = 0.0
msg. angular.y = 0.0
msg. angular.z = 1.8

# 1Hz 주기로 메시지를 발행한다
rate = rospy.Rate(1)
while not rospy.is_shutdown():
	pub.publish(msg)
	rate.sleep() # 1초까지 남은 시간 동안 sleep한다

 

C++ 로 작성할 경우 아래와 같다

pub.cpp

#include "ros/ros.h"
#include "geometry_msgs/Twist.h"

int main(int argc, char **argv)
{
	// 노드를 만든다
    ros::init(argc, argv, "my_node", ros::init_options::AnonymousName);
    ros::NodeHandle nh;
    
    // publisher 객체를 생성한다
    ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1);

    geometry_msgs::Twist msg;
    msg.linear.x = 2.0;
    msg.linear.y = 2.0;
    msg.linear.z = 2.0;

    msg.angular.x = 0.0;
    msg.angular.y = 0.0;
    msg.angular.z = 1.8;

	// 1Hz 주기로 메시지를 발행한다
    ros::Rate rate(1);

    while (ros::ok())
    {
        pub.publish(msg);
        rate.sleep(); // 1초까지 남은 시간 동안 sleep한다
    }
    return 0;
}

 

2. python 파일인 경우 작성한 파일의 실행 권한이 필요하므로 실행 권한을 부여한 후 프로그램을 실행한다

# 경로: /<path to workspace>/src/<pkg name>/src

# 해당 파일의 실행 권한 부여
chmod +x <file name>

# 권환 여부 확인 
ls -l

# package 파일 실행
rosrun <pkg name> <file name>

터틀이 계속 회전하는 것을 알 수 있다

3. turtlesim_node가 받고 있는 topic을 확인한다

# topic 종류 확인
rostopic list

# turtle의 위치 확인
rostopic echo /turtle1/pose

4. subscribed topic을 출력하는 코드를 추가한다

위의 코드를 참고하여 새로 추가한 python 파일에 실행 권한을 부여한다

# 경로: /<path to workspace>/src/<pkg name>/src

sub.py

#!/usr/bin/env python
import rospy
from turtlesim.msg import Pose
def callback(data):
	s = "Location: %.2f, %.2f" % (data.x, data.y)
	rospy.loginfo(rospy.get_caller_id() + s)
    
# 노드를 만든다
rospy.init_node("my_listener", anonymous=True) 
# subscribe 객체를 만든다
rospy.Subscriber ("/turtle1/pose", Pose, callback) # 메시지를 수신하면 함수가 호출된다
rospy.spin() # spin을 반복한다

 

5. subscriber 노드를 통해 전달 받은 topic을 확인하고

노드가 잘 동작하고 있는지 그래프를 통해 확인한다

# one terminal
rosrun my_pkg1 sub.py

# another terminal
rqt_graph

 

참고 사이트

catkin/Tutorials/create_a_workspace - ROS Wiki

 

 

'ROS1 & ROS2' 카테고리의 다른 글

[ROS1] ROS1 노드 통신 (1대1 ~ N대N)  (1) 2023.10.09
[ROS1] ROS1 launch  (0) 2023.10.08
[ROS1] ROS1 Publish, Subscribe, Topic 이해하기(with turtlesim)  (1) 2023.10.08
[ROS1] ROS1 기초  (0) 2023.10.06
[ROS] ROS2 빌드 설정 파일  (0) 2022.11.17