# Move Base - Dual Build System Support

Package `move_base` có thể được build bằng cả **Catkin** và **Standalone CMake**.

## Cách Build

### 1. Build với Catkin (ROS Workspace)

**⚠️ QUAN TRỌNG**: Thư mục gốc của project (`pnkx_robot_nav_core`) có `CMakeLists.txt` ở root, 
nên **KHÔNG THỂ** chạy `catkin_make` trực tiếp trong thư mục đó. Catkin workspace không được 
phép có `CMakeLists.txt` ở root.

**Giải pháp**: Tạo một catkin workspace riêng và link packages vào đó.

#### Cách 1: Sử dụng script tự động (Khuyến nghị)

```bash
# Chạy script setup từ thư mục gốc của project
cd /home/robotics/AGV/Diff_Wheel_Prj/pnkx_robot_nav_core
./setup_catkin_workspace.sh

# Script sẽ tạo workspace và link các packages có package.xml
# Sau đó build:
cd ../pnkx_nav_catkin_ws
catkin_make
source devel/setup.bash
```

#### Cách 2: Tạo workspace thủ công

```bash
# Tạo catkin workspace
mkdir -p ~/pnkx_nav_catkin_ws/src
cd ~/pnkx_nav_catkin_ws/src

# Link package move_base vào workspace
ln -s /home/robotics/AGV/Diff_Wheel_Prj/pnkx_robot_nav_core/src/Navigations/Packages/move_base move_base

# Link các dependencies cần thiết (nếu có package.xml)
ln -s /home/robotics/AGV/Diff_Wheel_Prj/pnkx_robot_nav_core/src/Libraries/tf3 tf3
ln -s /home/robotics/AGV/Diff_Wheel_Prj/pnkx_robot_nav_core/src/Libraries/nav_2d_utils nav_2d_utils

# Build với catkin
cd ~/pnkx_nav_catkin_ws
catkin_make
source devel/setup.bash
```

**Lưu ý**: Khi build với catkin, package sẽ tự động detect và sử dụng:
- `catkin_package()` để export dependencies
- Catkin installation paths
- ROS message dependencies

### 2. Build với Standalone CMake

```bash
cd /path/to/move_base
mkdir -p build
cd build
cmake ..
make
```

**Lưu ý**: Khi build standalone, bạn cần đảm bảo:
- Tất cả dependencies đã được build trước
- CMake có thể tìm thấy các internal packages (move_base_core, robot_nav_core, etc.)
- ROS packages (nếu cần) được cài đặt và có trong CMAKE_PREFIX_PATH

## Cách CMakeLists.txt Detect Build Mode

CMakeLists.txt tự động detect build mode bằng cách kiểm tra:
- `CATKIN_DEVEL_PREFIX` - biến môi trường của catkin
- `CATKIN_TOPLEVEL` - biến môi trường của catkin

Nếu một trong hai biến này được định nghĩa, package sẽ build ở **Catkin mode**.
Ngược lại, sẽ build ở **Standalone CMake mode**.

## Dependencies

### ROS Packages (khi build với Catkin):
- roscpp, rospy
- robot_std_msgs, geometry_msgs, robot_nav_msgs
- tf2, tf2_ros
- actionlib, dynamic_reconfigure

### Internal Packages (cần build trước):
- move_base_core
- robot_nav_core
- robot_costmap_2d
- xmlrpcpp
- node_handle
- robot_tf3_sensor_msgs
- robot_tf3_geometry_msgs

### System Libraries:
- Boost
- yaml-cpp
- pthread, dl

## Kiểm tra Build Mode

Khi chạy `cmake`, bạn sẽ thấy message:
```
Building move_base with Catkin
```
hoặc
```
Building move_base with Standalone CMake
```

## Troubleshooting

### Lỗi: "catkin_make must be invoked in the root of workspace"
**Nguyên nhân**: Thư mục hiện tại có `CMakeLists.txt` ở root, catkin không cho phép điều này.

**Giải pháp**: 
- Tạo catkin workspace riêng (xem hướng dẫn ở trên)
- Hoặc đổi tên/ẩn `CMakeLists.txt` ở root khi build với catkin (không khuyến nghị)

### Lỗi: "Cannot find package X"
- **Với Catkin**: 
  - Đảm bảo package X đã được build trong cùng workspace
  - Đảm bảo package X có `package.xml` và được link vào `src/` của workspace
  - Kiểm tra dependencies trong `package.xml`
- **Với Standalone**: 
  - Đảm bảo package X đã được build và cài đặt
  - Thêm vào `CMAKE_PREFIX_PATH` nếu cần

### Lỗi: "catkin_package() not found"
- Đảm bảo bạn đang build trong catkin workspace (không phải thư mục gốc có CMakeLists.txt)
- Kiểm tra `CATKIN_DEVEL_PREFIX` có được set không
- Source ROS setup: `source /opt/ros/noetic/setup.bash`

### Lỗi: "Cannot find ROS packages"
- Cài đặt ROS Noetic: `sudo apt-get install ros-noetic-<package-name>`
- Source ROS setup: `source /opt/ros/noetic/setup.bash`
- Kiểm tra `ROS_PACKAGE_PATH` environment variable

### Lỗi: Internal packages không tìm thấy (move_base_core, robot_nav_core, etc.)
- **Với Catkin**: Các internal packages cần có `package.xml` và được link vào workspace
- **Với Standalone**: Đảm bảo các packages đã được build trước trong project chính

