Q1. YAML 파일에서 초기 위치 설정

  1. ~/nav2_ws/src/neuronbot2/neuronbot2_nav/param경로의 neuronbot_params.yaml 파일 수정

    amcl:
      ros__parameters:
    		...
    
        **# Initial Pose
        set_initial_pose: True
        initial_pose.x: 5.0
        initial_pose.y: 5.0
        initial_pose.z: 0.0
        initial_pose.yaw: -3.141592**
    
  2. 런치 파일을 다시 실행시키고 결과 확인

    # 시뮬레이션 환경 (Terminal 1)
    ros2 launch neuronbot2_gazebo neuronbot2_world.launch.py
    
    # Rviz2 실행 (Terminal 2)
    cd ~/nav2_ws/src/neuronbot2/neuronbot2_nav/rviz
    rviz2 -d nav2_default_view.rviz
    
    # Localization (Terminal 3)
    ros2 launch neuronbot2_nav localization_launch.py use_sim_time:=true
    

    Untitled

Q2. 터미널에서 초기 위치 설정

  1. Rviz2 상의 Publish Point 버튼을 통해 누르고 지도 상에서 특정 위치를 누르면 /clicked_point 토픽이 publish

  2. /clicked_point 확인을 위해서 터미널을 열어 토픽 구독 구독 중인 상태에서 Publish Point 버튼을 통해 지도 상의 위치를 클릭하면, map 프레임을 기준으로 클릭한 위치 확인 가능

    ros2 topic echo /clicked_point
    

    Untitled

  3. 아래 명령어로 /initialpose 토픽을 퍼블리싱하여 초기 위치 설정

Q3. 프로그램 상에서 초기위치 설정

  1. nav2_ws/src 디렉터리에 localizer_server라는 이름의 새 패키지를 만들고 토픽 작업에 필요한 종속성을 추가

    sudo apt install ros-humble-tf-transformations
    
    cd ~/nav2_ws/src
    ros2 pkg create --build-type ament_python localizer_server --dependencies rclpy geometry_msgs tf-transformations
    
  2. 방금 생성한 패키지의 localizer_server 디렉토리에 init_robot.py라는 ****파일

    Untitled

  3. init_robot.py에 다음 코드 복사

    import rclpy
    from rclpy.node import Node
    from geometry_msgs.msg import PoseWithCovarianceStamped
    from geometry_msgs.msg import PointStamped
    from tf_transformations import quaternion_from_euler
    
    # init_pose = x, y, theta
    init_pose = [3.0, 4.0, 3.141592]
    
    class InitRobot(Node):
    
        def __init__(self):
            super().__init__('initial_pose_pub_node')
            self.init_pose_pub_ = self.create_publisher(PoseWithCovarianceStamped, '/initialpose', 1)
            self.clicked_point_sub_ = self.create_subscription(PointStamped, '/clicked_point', self.point_callback, 1)
    
            # Set initial pose after a short delay
            timer_period = 0.5  # seconds
            self.trial_count = 5
            self.timer = self.create_timer(timer_period, self.timer_callback)
    
        def timer_callback(self):
            self.trial_count -= 1
            self.init_pose(init_pose[0], init_pose[1], init_pose[2])
    
            if self.trial_count == 0:
                self.timer.cancel()  # Cancel timer after firing once
    
        def point_callback(self, msg):
            self.get_logger().info('Recieved Data:\\n X : %f \\n Y : %f \\n Z : %f' % (msg.point.x, msg.point.y, msg.point.z))
            self.init_pose(msg.point.x, msg.point.y)
    
        def init_pose(self, x, y, theta=0.0):
            # radian to quaternion
            quat = quaternion_from_euler(0.0, 0.0, theta)
    
            # Publish initial pose
            msg = PoseWithCovarianceStamped()
            msg.header.frame_id = '/map'
            msg.pose.pose.position.x = x
            msg.pose.pose.position.y = y
            msg.pose.pose.position.z = 0.0
            msg.pose.pose.orientation.x = quat[0]
            msg.pose.pose.orientation.y = quat[1]
            msg.pose.pose.orientation.z = quat[2]
            msg.pose.pose.orientation.w = quat[3]
    
            self.get_logger().info('Publishing  Initial Position\\n X= %f \\n Y= %f '% (msg.pose.pose.position.x, msg.pose.pose.position.y))
            self.init_pose_pub_.publish(msg)
    
    def main(args=None):
        rclpy.init(args=args)
        init_robot = InitRobot()
    
        rclpy.spin(init_robot)
        init_robot.destroy_node()
        rclpy.shutdown()
    
    if __name__ == '__main__':
        main()
    
  4. setup.py에 init_robot.py 스크립트의 실행 파일을 entry_points에 추가

    from setuptools import find_packages, setup
    
    package_name = 'localizer_server'
    
    setup(
        name=package_name,
        version='0.0.0',
        packages=find_packages(exclude=['test']),
        data_files=[
            ('share/ament_index/resource_index/packages',
                ['resource/' + package_name]),
            ('share/' + package_name, ['package.xml']),
        ],
        install_requires=['setuptools'],
        zip_safe=True,
        maintainer='spoons',
        maintainer_email='[email protected]',
        description='TODO: Package description',
        license='TODO: License declaration',
        tests_require=['pytest'],
        entry_points={
            'console_scripts': [
                **'init_pose = localizer_server.init_robot:main',**
            ],
        },
    )