Priceless
[ROS1] ROS1 Package(패키지) 본문
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 |