프로젝트/1차 프로젝트[AGV]

🛞[ROS] AGV를 좌표로 이동시키기

projectlim 2024. 11. 19. 17:04
728x90
반응형
SMALL

SLAM이 제대로 동작하지 않는 이유를 파악하기 위해 AGV를 좌표 기반으로 이동시키는 테스트를 진행했습니다. 이 과정을 블로그에 정리해봅니다! 😊


프로젝트 기본 셋팅 ⚙️

1. 워크스페이스 생성 🏗️

mkdir -p ~/myagv_ws/src
cd ~/myagv_ws
catkin_make  # ROS1 기준
source devel/setup.bash

2. 폴더 구조 예시 📂

폴더명 설명

myagv_ws/ 프로젝트 루트
├── src/ 소스 코드 폴더
│ ├── lidar_pkg/ LiDAR 데이터 관리
│ ├── camera_pkg/ 카메라 데이터 관리 및 ArUco 인식
│ ├── motor_pkg/ 모터 제어 패키지
│ ├── myagv_bringup/ 전체 시스템 통합

3. 각 패키지 설명 📌

🔹 lidar_pkg - LiDAR 데이터 관리

cd ~/myagv_ws/src
catkin_create_pkg lidar_pkg rospy sensor_msgs std_msgs

lidar_node.py 예시

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import LaserScan

def lidar_callback(data):
    rospy.loginfo("Received LiDAR data: %s", data.ranges[:10])

def main():
    rospy.init_node('lidar_node')
    rospy.Subscriber('/scan', LaserScan, lidar_callback)
    rospy.spin()

if __name__ == "__main__":
    main()

🔹 camera_pkg - 카메라 데이터 관리 및 ArUco 인식

cd ~/myagv_ws/src
catkin_create_pkg camera_pkg rospy cv_bridge sensor_msgs geometry_msgs

camera_node.py 예시

#!/usr/bin/env python
import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image

bridge = CvBridge()

def image_callback(msg):
    frame = bridge.imgmsg_to_cv2(msg, "bgr8")
    rospy.loginfo("Processing image frame")
    cv2.imshow("Camera Feed", frame)
    cv2.waitKey(1)

def main():
    rospy.init_node('camera_node')
    rospy.Subscriber('/camera/image_raw', Image, image_callback)
    rospy.spin()

if __name__ == "__main__":
    main()

🔹 motor_pkg - 모터 제어

cd ~/myagv_ws/src
catkin_create_pkg motor_pkg rospy std_msgs

motor_node.py 예시

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def motor_command():
    rospy.init_node('motor_node')
    pub = rospy.Publisher('/motor/command', String, queue_size=10)
    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        pub.publish("Move Forward")
        rate.sleep()

if __name__ == "__main__":
    motor_command()

🔹 myagv_bringup - 통합 실행

cd ~/myagv_ws/src
catkin_create_pkg myagv_bringup rospy

bringup.launch 예시

<launch>
    <include file="$(find lidar_pkg)/launch/lidar.launch"/>
    <include file="$(find camera_pkg)/launch/camera.launch"/>
    <include file="$(find motor_pkg)/launch/motor.launch"/>
</launch>

좌표 기반 AGV 이동 🎯

1. /move_base_simple/goal 토픽 확인 🗺️

rostopic echo /move_base_simple/goal

이제 목표 좌표를 설정하고 이동 여부를 확인할 수 있습니다!

2. 목표 지점 설정 ✨

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import PoseStamped

def set_goal():
    rospy.init_node('send_goal', anonymous=True)
    pub = rospy.Publisher('/move_base_simple/goal', PoseStamped, queue_size=10)
    rospy.sleep(1)

    goal = PoseStamped()
    goal.header.frame_id = "map"
    goal.header.stamp = rospy.Time.now()
    
    goal.pose.position.x = 0.6164789795875549
    goal.pose.position.y = 0.1577601134777069
    goal.pose.position.z = 0.0
    
    goal.pose.orientation.z = -0.0018928490219073594
    goal.pose.orientation.w = 0.9999982085596855
    
    pub.publish(goal)
    rospy.loginfo("Goal Sent!")

if __name__ == "__main__":
    set_goal()

3. 결과 확인 ✅

rostopic echo /move_base/status
rostopic echo /move_base/result

AGV가 설정한 좌표로 정상적으로 이동하는지 확인하세요! 🚗💨


마무리 🏁

SLAM이 원활하게 동작하지 않을 경우, AGV가 목표 좌표를 잘 따르는지 먼저 확인하는 것이 중요합니다. 위 과정대로 진행하면 AGV의 네비게이션이 정상 작동하는지 쉽게 검증할 수 있습니다. 🚀

 

혹시 궁금한 점이 있으면 댓글로 남겨주세요! 😊

728x90
반응형
LIST