diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0bc0bd3..06a079f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,7 +20,7 @@ jobs:
steps:
- uses: actions/checkout@v4
with:
- path: src/hikmicro_ptz_driver
+ path: src/hikmicro_driver # holds hikmicro_msgs and hikmicro_driver
- name: Dependencies
run: |
deps() {
@@ -86,7 +86,7 @@ jobs:
source /opt/ros/noetic/setup.bash
source devel/setup.bash
result=0
- bash src/hikmicro_ptz_driver/test/smoke_test.sh > smoke.txt 2>&1 || result=$?
+ bash src/hikmicro_driver/hikmicro_driver/test/smoke_test.sh > smoke.txt 2>&1 || result=$?
cat smoke.txt
echo "::notice title=Smoke test::$(grep -c '^ok' smoke.txt) ok, $(grep -c '^FAIL' smoke.txt) failed"
if [ "$result" != 0 ]; then
diff --git a/README.md b/README.md
index 9dcb3e5..7ce7695 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-# hikmicro_ptz_driver
+# hikmicro_driver
**ROS Noetic driver for the HIKMICRO HM-TD5567T bi-spectrum (thermal + visible) PTZ camera
over ISAPI: precise pan/tilt/zoom that tells you when it has arrived, presets, light and wiper,
@@ -23,6 +23,10 @@ Deep Robotics X30.**
---
+**Docs:** [ISAPI summary](docs/isapi.md) · [network setup](docs/network.md) ·
+[first run on the camera](docs/first_run.md) · [troubleshooting](docs/troubleshooting.md) ·
+[messages](hikmicro_msgs/README.md)
+
Everything goes over the LAN cable: the camera is controlled with **ISAPI** (HTTP with digest
authentication, *ISAPI Thermography thermal cameras PT series*, which lists the HM-TD5567T-7/15/25
W models) and streams its two sensors over **RTSP**. The ISAPI client, the multipart/thermometry
@@ -61,11 +65,11 @@ All names under the launch namespace (`/hikmicro` by default).
| Topic | Type | |
|---|---|---|
-| `ptz/state` | `hikmicro_ptz_driver/PtzState` | connected, pan, tilt, zoom, moving (`state_rate`, 10 Hz) |
+| `ptz/state` | `hikmicro_msgs/PtzState` | connected, pan, tilt, zoom, moving (`state_rate`, 10 Hz) |
| `joint_states` | `sensor_msgs/JointState` | pan / tilt joints for `robot_state_publisher` |
| `ptz/cmd_vel` (in) | `geometry_msgs/Twist` | manual: `angular.z` pan, `angular.y` tilt, `linear.z` zoom, −1..1; stops 0.5 s after the last message |
| `thermal/temperature` | `sensor_msgs/Image` | **32FC1, °C per pixel** (pixel-to-pixel thermometry, `radiometric_rate`) |
-| `thermal/stats` | `hikmicro_ptz_driver/ThermalStats` | full-frame max / min / mean and where |
+| `thermal/stats` | `hikmicro_msgs/ThermalStats` | full-frame max / min / mean and where |
| `visible/image_raw` | `sensor_msgs/Image` | RGB stream (channel 1) |
| `thermal/image_raw` | `sensor_msgs/Image` | thermal video (channel 2, palette as set on the camera) |
| `*/image_raw/compressed` | `sensor_msgs/CompressedImage` | via image_transport |
@@ -136,7 +140,7 @@ catkin_make && source devel/setup.bash # or: catkin build
# 3. Launch (the password comes from the environment, so roslaunch never prints it)
export HIKMICRO_PASSWORD='
'
-roslaunch hikmicro_ptz_driver hikmicro.launch host:=192.168.1.64
+roslaunch hikmicro_driver hikmicro.launch host:=192.168.1.64
# cameras:=false for control only
# 4. Second terminal
@@ -150,7 +154,7 @@ rosrun rqt_image_view rqt_image_view /hikmicro/visible/image_raw
```bash
rosrun actionlib_tools axclient.py /hikmicro/ptz/move_to # GUI
-rostopic pub -1 /hikmicro/ptz/move_to/goal hikmicro_ptz_driver/MoveToActionGoal \
+rostopic pub -1 /hikmicro/ptz/move_to/goal hikmicro_msgs/MoveToActionGoal \
"{goal: {pan: 123.4, tilt: -12.5, zoom: 8.0}}"
rostopic echo -n 1 /hikmicro/ptz/move_to/result # state: "reached"
```
@@ -160,7 +164,7 @@ rostopic echo -n 1 /hikmicro/ptz/move_to/result # state: "reache
```bash
rosservice call /hikmicro/ptz/set_preset "{id: 3, name: 'trafo 1 bushing'}"
rosservice call /hikmicro/ptz/get_presets
-rostopic pub -1 /hikmicro/ptz/goto_preset/goal hikmicro_ptz_driver/GotoPresetActionGoal \
+rostopic pub -1 /hikmicro/ptz/goto_preset/goal hikmicro_msgs/GotoPresetActionGoal \
"{goal: {id: 3}}"
```
@@ -202,8 +206,8 @@ rosservice call /hikmicro/isapi/request "{method: GET, path: /ISAPI/PTZCtrl/chan
#!/usr/bin/env python3
import actionlib
import rospy
-from hikmicro_ptz_driver.msg import MoveToAction, MoveToGoal
-from hikmicro_ptz_driver.srv import GetTemperature, Snapshot
+from hikmicro_msgs.msg import MoveToAction, MoveToGoal
+from hikmicro_msgs.srv import GetTemperature, Snapshot
from std_srvs.srv import Trigger
POINTS = [ # name, pan, tilt, zoom, box in the thermal image (x1, y1, x2, y2)
@@ -233,7 +237,7 @@ for name, pan, tilt, zoom, (x1, y1, x2, y2) in POINTS:
## Parameters
-[config/hikmicro.yaml](config/hikmicro.yaml) and [config/camera.yaml](config/camera.yaml), every
+[hikmicro.yaml](hikmicro_driver/config/hikmicro.yaml) and [camera.yaml](hikmicro_driver/config/camera.yaml), every
one commented.
**`hikmicro_ptz_node`**
@@ -287,32 +291,34 @@ one commented.
```bash
catkin_make run_tests && catkin_test_results build/test_results --verbose
-bash src/hikmicro_ptz_driver/test/smoke_test.sh # with the workspace sourced
+bash src/hikmicro_ptz_driver/hikmicro_driver/test/smoke_test.sh # with the workspace sourced
```
- `test_isapi_xml`: builders and parsers against the document's example messages
- `test_radiometric`: multipart parsing, float32 and 16-bit Kelvin matrices, region statistics
- `test_motion`: arrival detection (reached, overshoot, stall, timeout, wrap around 0°)
-- `test_camera_fake`: the ISAPI client end to end against [test/fake_camera.py](test/fake_camera.py)
+- `test_camera_fake`: the ISAPI client end to end against [fake_camera.py](hikmicro_driver/test/fake_camera.py)
(digest auth, a PTZ that moves at finite speed, presets, aux, IR-cut, snapshots, thermometry)
- `test_rtsp`: GStreamer pipelines, decoder order, the capture loop on a local video
- `smoke_test.sh`: `hikmicro.launch` against the fake camera — actions, services, topics; CI runs
all of it in a `ros:noetic` container
```
-hikmicro_ptz_driver/
-├── include/hikmicro_ptz_driver/
-│ ├── http_client.hpp libcurl, digest auth (no ROS)
-│ ├── isapi_xml.hpp ISAPI messages (no ROS)
-│ ├── radiometric.hpp jpegPicWithAppendData, temperature statistics (no ROS)
-│ ├── motion.hpp arrival detection (no ROS)
-│ ├── camera.hpp HikCamera: the whole camera API (no ROS)
-│ ├── rtsp_capture.hpp RTSP capture thread (OpenCV, no ROS)
-│ └── *_interface.hpp ROS: PTZ, aux, thermal
-├── src/ hikmicro_node.cpp, camera_node.cpp, ...
-├── msg/ srv/ action/
-├── config/ launch/
-└── test/
+hikmicro_ptz_driver/ repo
+├── hikmicro_msgs/ PtzState, PtzPreset, ThermalStats, 7 services, MoveTo, GotoPreset
+├── hikmicro_driver/
+│ ├── include/hikmicro_driver/
+│ │ ├── http_client.hpp libcurl, digest auth (no ROS)
+│ │ ├── isapi_xml.hpp ISAPI messages (no ROS)
+│ │ ├── radiometric.hpp jpegPicWithAppendData, temperature statistics (no ROS)
+│ │ ├── motion.hpp arrival detection (no ROS)
+│ │ ├── camera.hpp HikCamera: the whole camera API (no ROS)
+│ │ ├── rtsp_capture.hpp RTSP capture thread (OpenCV, no ROS)
+│ │ └── *_interface.hpp ROS: PTZ, aux, thermal
+│ ├── src/ hikmicro_node.cpp, camera_node.cpp, ...
+│ ├── config/ launch/
+│ └── test/
+└── docs/ guides
```
-hikmicro_ptz_driver is released under the [Apache License 2.0](LICENSE).
+hikmicro_driver is released under the [Apache License 2.0](LICENSE).
diff --git a/docs/first_run.md b/docs/first_run.md
new file mode 100644
index 0000000..8f0412b
--- /dev/null
+++ b/docs/first_run.md
@@ -0,0 +1,33 @@
+# First run on the camera
+
+The driver is tested against a simulated camera
+([fake_camera.py](../hikmicro_driver/test/fake_camera.py)). Fill in the **Result** column on
+the real camera; it decides the defaults that go into `hikmicro.yaml`.
+
+```bash
+export HIKMICRO_PASSWORD=''
+roslaunch hikmicro_driver hikmicro.launch host:=192.168.1.64
+```
+
+| # | Check | Command | Expected | Result |
+|---|---|---|---|---|
+| 1 | Connection | `rostopic echo -n 1 /hikmicro/ptz/state` | `connected: True`; the log shows model and firmware | |
+| 2 | Precision | same | `high_precision: True` (absoluteEx, 0.001°) | |
+| 3 | Pan direction | `move_to` pan 10, then pan 20 | turns which way? → `pan_sign`, `invert_pan` | |
+| 4 | Tilt direction | `move_to` tilt 0, then tilt 10 | tilts which way? → `tilt_sign`, `invert_tilt` | |
+| 5 | Arrival | `rostopic pub -1 /hikmicro/ptz/move_to/goal hikmicro_msgs/MoveToActionGoal "{goal: {pan: 120, tilt: -10, zoom: 4}}"` | result `state: "reached"` within tolerance | |
+| 6 | Limit | `move_to` beyond the tilt limit | `stalled` or `error` | |
+| 7 | Aux ids | `rosservice call /hikmicro/isapi/request "{method: GET, path: /ISAPI/PTZCtrl/channels/1/auxcontrols}"` | ids of LIGHT / WIPER | light: · wiper: |
+| 8 | Light / wiper | `rosservice call /hikmicro/aux/light "data: true"`, `aux/wiper` | the right device switches | |
+| 9 | Night | `rosservice call /hikmicro/image/day_night "mode: 'night'"` | B/W image with IR light | |
+| 10 | Thermometry | `rosservice call /hikmicro/thermal/get_temperature "{mode: 0, normalized: true, x: 0.5, y: 0.5}"` on a hand | 30–36 °C | |
+| 11 | Streams | `rostopic hz /hikmicro/visible/image_raw /hikmicro/thermal/image_raw` | stream frame rates | codec: |
+
+## If a check fails
+
+- **2 `False`:** the firmware has no `absoluteEx`; moves use `/status` with 0.1° steps.
+- **7 / 8:** set `light_aux_id` / `wiper_aux_id` in [hikmicro.yaml](../hikmicro_driver/config/hikmicro.yaml).
+- **10 `notSupport`:** no pixel-to-pixel thermometry on this firmware.
+- **11 with `decoder: jetson`:** set `codec` to what `ffprobe` shows (H.264 / H.265).
+
+See also [troubleshooting.md](troubleshooting.md).
diff --git a/docs/isapi.md b/docs/isapi.md
new file mode 100644
index 0000000..cefde5c
--- /dev/null
+++ b/docs/isapi.md
@@ -0,0 +1,55 @@
+# ISAPI summary
+
+What the driver uses from *ISAPI Thermography thermal cameras PT series* (Hikvision / HIKMICRO).
+All requests are HTTP with **digest authentication** on port 80; `` is 1 for the visible /
+PTZ channel and 2 for the thermal one.
+
+## PTZ
+
+| Method, path | Body / answer | Driver |
+|---|---|---|
+| `GET /ISAPI/PTZCtrl/channels/1/absoluteEx` | `elevation`, `azimuth` (degrees, 0.001), `absoluteZoom` (ratio) | `ptz/state` (high precision) |
+| `PUT /ISAPI/PTZCtrl/channels/1/absoluteEx` | same fields, optional `horizontalSpeed` / `verticalSpeed` | `ptz/move_to` |
+| `GET /ISAPI/PTZCtrl/channels/1/status` | `AbsoluteHigh`: elevation −900..2700, azimuth 0..3600 (tenths), `absoluteZoom` ×10 | fallback without `absoluteEx` |
+| `PUT /ISAPI/PTZCtrl/channels/1/absolute` | `AbsoluteHigh` | fallback move |
+| `PUT /ISAPI/PTZCtrl/channels/1/continuous` | `pan`, `tilt`, `zoom` −100..100 (0 0 0 stops) | `ptz/cmd_vel`, `ptz/stop` |
+| `GET /ISAPI/PTZCtrl/channels/1/presets` | id, name, position | `ptz/get_presets` |
+| `PUT` / `DELETE /ISAPI/PTZCtrl/channels/1/presets/` | save the current position / delete | `ptz/set_preset`, `ptz/remove_preset` |
+| `PUT /ISAPI/PTZCtrl/channels/1/presets//goto` | — | `ptz/goto_preset` |
+| `PUT /ISAPI/PTZCtrl/channels/1/onepushfoucs/start` | (the camera's own spelling) | `ptz/focus` |
+
+The camera only acknowledges a move; "arrived" is decided from the polled position (in
+tolerance and still for `settle_time`).
+
+## Auxiliaries and image
+
+| Method, path | Body / answer | Driver |
+|---|---|---|
+| `GET /ISAPI/PTZCtrl/channels/1/auxcontrols` | list of id + type (`LIGHT`, `WIPER`, `FAN`, `HEATER`) | ids for the aux services |
+| `PUT /ISAPI/PTZCtrl/channels/1/auxcontrols/` | `PTZAux`: type, `status` on / off | `aux/light`, `aux/wiper`, `aux/set` |
+| `GET` / `PUT /ISAPI/Image/channels/1/ircutFilter` | `IrcutFilterType` auto / day / night | `image/day_night` |
+| `GET /ISAPI/Streaming/channels/01/picture` | JPEG | `snapshot` |
+| `GET /ISAPI/System/deviceInfo` | model, serial, firmware | log at start |
+
+## Thermometry
+
+`GET /ISAPI/Thermal/channels/2/thermometry/jpegPicWithAppendData?format=json` answers
+`multipart/form-data`:
+
+1. JSON `JpegPictureWithAppendData`: `jpegPicWidth`, `jpegPicHeight`,
+ `temperatureDataLength`, `scale`, `offset`
+2. the thermal JPEG
+3. the temperature matrix: float32 °C, or 16-bit where `K = raw / scale + offset`
+4. on bi-spectrum models, the visible JPEG
+
+The driver publishes it as `thermal/temperature` (32FC1 °C) and answers
+`thermal/get_temperature` from it.
+
+## Errors
+
+`ResponseStatus` (XML) or JSON with `statusCode`, `subStatusCode` (e.g. `notSupport`), and
+`errorMsg`; the driver puts them in the service / action messages.
+
+## RTSP
+
+`rtsp://:554/Streaming/Channels/101` visible, `/201` thermal (`102` / `202` sub streams).
diff --git a/docs/network.md b/docs/network.md
new file mode 100644
index 0000000..f1d66af
--- /dev/null
+++ b/docs/network.md
@@ -0,0 +1,45 @@
+# Network setup
+
+The camera ships with `192.168.1.64/24`. The computer running the driver needs an address in the
+same subnet, or the camera gets a new one (SADP tool or the camera's web page).
+
+## An address in the camera's subnet
+
+Quick test, lost on reboot:
+
+```bash
+sudo ip addr add 192.168.1.10/24 dev eth0 # your interface: ip -br link
+ping -c 3 192.168.1.64
+```
+
+Permanent, with netplan (`/etc/netplan/60-hikmicro.yaml`):
+
+```yaml
+network:
+ version: 2
+ ethernets:
+ eth0:
+ addresses:
+ - 192.168.1.10/24
+```
+
+```bash
+sudo netplan apply
+```
+
+## Ports
+
+| Port | Use |
+|---|---|
+| 80 | ISAPI (HTTP, digest authentication), `port:=` |
+| 554 | RTSP, `/Streaming/Channels/101` visible, `/201` thermal |
+
+## Check before launching
+
+```bash
+curl --digest -u admin: http://192.168.1.64/ISAPI/System/deviceInfo
+ffprobe -v error -show_streams "rtsp://admin:@192.168.1.64:554/Streaming/Channels/101" | grep -E 'codec_name|width'
+```
+
+A 401 means a wrong password; no answer means the address or the subnet is wrong. Several
+failed logins lock the account for a while (camera setting).
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
new file mode 100644
index 0000000..997b48d
--- /dev/null
+++ b/docs/troubleshooting.md
@@ -0,0 +1,22 @@
+# Troubleshooting
+
+| Symptom | Cause | Fix |
+|---|---|---|
+| `deviceInfo: ... Couldn't connect` | address or subnet | [network.md](network.md); `ping 192.168.1.64` |
+| `HTTP 401 ... wrong user or password` | password, or the account is locked after failed logins | `export HIKMICRO_PASSWORD=...`; wait for the lock to expire |
+| `no password ... the camera will answer 401` | `HIKMICRO_PASSWORD` not set | set it, or `password:=` (printed by roslaunch) |
+| `ptz/state` `high_precision: False` | no `absoluteEx` on this firmware | works with 0.1° via `/status` |
+| `move_to` → `stalled` | end stop, limit or obstruction | target inside the camera's range |
+| `move_to` → `timeout` | slow move, or tolerance too tight | raise `move_timeout` / `pan_tolerance` / `tilt_tolerance` |
+| `move_to` → `superseded` | a newer goal, `cmd_vel` or `ptz/stop` took over | |
+| arrived but the image still shakes | settles slower than `settle_time` | raise `settle_time` |
+| `aux/light` switches the wrong device or `missing` | aux ids differ | `light_aux_id`, `wiper_aux_id` (first run check 7) |
+| `get_temperature` `notSupport` | no pixel-to-pixel thermometry | |
+| `radiometric frame: ...` warnings every 30 s | thermometry failing; the node backs off | see the message (`notSupport`, timeout) |
+| `cannot open rtsp://...` repeating | port 554, credentials or decoder | `ffprobe` the URL; `decoder: ffmpeg` |
+| `cmd_vel` keeps moving | publisher stopped without a zero command | stops by itself after `cmd_vel_timeout` (0.5 s) |
+
+```bash
+roslaunch hikmicro_driver hikmicro.launch host:= 2>&1 | tee hikmicro.log
+rosservice call /hikmicro/isapi/request "{method: GET, path: /ISAPI/PTZCtrl/channels/1/capabilities}"
+```
diff --git a/hikmicro_driver/CHANGELOG.rst b/hikmicro_driver/CHANGELOG.rst
new file mode 100644
index 0000000..ff83b29
--- /dev/null
+++ b/hikmicro_driver/CHANGELOG.rst
@@ -0,0 +1,10 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package hikmicro_driver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+0.1.0 (2026-10-18)
+------------------
+* ISAPI client: digest authentication, PTZ (absoluteEx / status), presets, auxiliaries, IR-cut, snapshots, pixel-to-pixel thermometry
+* hikmicro_ptz_node: move_to / goto_preset with arrival detection, cmd_vel, aux, day/night, temperatures
+* hikmicro_camera_node: visible and thermal RTSP streams as images
+* Unit tests, fake camera and launch smoke test on Noetic
diff --git a/CMakeLists.txt b/hikmicro_driver/CMakeLists.txt
similarity index 86%
rename from CMakeLists.txt
rename to hikmicro_driver/CMakeLists.txt
index cc01dd2..64662d2 100644
--- a/CMakeLists.txt
+++ b/hikmicro_driver/CMakeLists.txt
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.0.2)
-project(hikmicro_ptz_driver)
+project(hikmicro_driver)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -15,7 +15,7 @@ find_package(catkin REQUIRED COMPONENTS
geometry_msgs
actionlib
actionlib_msgs
- message_generation
+ hikmicro_msgs
cv_bridge
image_transport
)
@@ -26,31 +26,11 @@ find_package(PkgConfig REQUIRED)
pkg_check_modules(TINYXML2 REQUIRED tinyxml2)
find_package(nlohmann_json 3 REQUIRED)
-add_message_files(FILES
- PtzPreset.msg
- PtzState.msg
- ThermalStats.msg
-)
-add_service_files(FILES
- GetPresets.srv
- GetTemperature.srv
- RawRequest.srv
- SetAux.srv
- SetDayNight.srv
- SetPreset.srv
- Snapshot.srv
-)
-add_action_files(FILES
- GotoPreset.action
- MoveTo.action
-)
-generate_messages(DEPENDENCIES std_msgs sensor_msgs actionlib_msgs)
-
catkin_package(
INCLUDE_DIRS include
LIBRARIES hikmicro_isapi hikmicro_rtsp
CATKIN_DEPENDS roscpp std_msgs std_srvs sensor_msgs geometry_msgs actionlib actionlib_msgs
- message_runtime cv_bridge image_transport
+ cv_bridge image_transport hikmicro_msgs
DEPENDS CURL
)
@@ -75,7 +55,7 @@ add_executable(hikmicro_ptz_node
)
include_directories(include ${catkin_INCLUDE_DIRS})
target_link_libraries(hikmicro_ptz_node hikmicro_isapi ${catkin_LIBRARIES})
-add_dependencies(hikmicro_ptz_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
+add_dependencies(hikmicro_ptz_node ${catkin_EXPORTED_TARGETS})
# RTSP capture (OpenCV, no ROS) and the camera node: one per stream, visible / thermal
add_library(hikmicro_rtsp src/rtsp_capture.cpp)
diff --git a/config/camera.yaml b/hikmicro_driver/config/camera.yaml
similarity index 100%
rename from config/camera.yaml
rename to hikmicro_driver/config/camera.yaml
diff --git a/config/hikmicro.yaml b/hikmicro_driver/config/hikmicro.yaml
similarity index 100%
rename from config/hikmicro.yaml
rename to hikmicro_driver/config/hikmicro.yaml
diff --git a/include/hikmicro_ptz_driver/aux_interface.hpp b/hikmicro_driver/include/hikmicro_driver/aux_interface.hpp
similarity index 77%
rename from include/hikmicro_ptz_driver/aux_interface.hpp
rename to hikmicro_driver/include/hikmicro_driver/aux_interface.hpp
index ac533c5..2d2e7a7 100644
--- a/include/hikmicro_ptz_driver/aux_interface.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/aux_interface.hpp
@@ -8,15 +8,17 @@
#include
#include
-#include "hikmicro_ptz_driver/RawRequest.h"
-#include "hikmicro_ptz_driver/SetAux.h"
-#include "hikmicro_ptz_driver/SetDayNight.h"
-#include "hikmicro_ptz_driver/Snapshot.h"
-#include "hikmicro_ptz_driver/camera.hpp"
+#include "hikmicro_msgs/RawRequest.h"
+#include "hikmicro_msgs/SetAux.h"
+#include "hikmicro_msgs/SetDayNight.h"
+#include "hikmicro_msgs/Snapshot.h"
+#include "hikmicro_driver/camera.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
+using namespace hikmicro_msgs; // messages, services, actions
+
class AuxInterface
{
public:
@@ -35,4 +37,4 @@ class AuxInterface
ros::ServiceServer light_srv_, wiper_srv_, aux_srv_, day_night_srv_, snapshot_srv_, raw_srv_;
};
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/camera.hpp b/hikmicro_driver/include/hikmicro_driver/camera.hpp
similarity index 94%
rename from include/hikmicro_ptz_driver/camera.hpp
rename to hikmicro_driver/include/hikmicro_driver/camera.hpp
index c76c066..c603d8b 100644
--- a/include/hikmicro_ptz_driver/camera.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/camera.hpp
@@ -10,11 +10,11 @@
#include
#include
-#include "hikmicro_ptz_driver/http_client.hpp"
-#include "hikmicro_ptz_driver/radiometric.hpp"
-#include "hikmicro_ptz_driver/types.hpp"
+#include "hikmicro_driver/http_client.hpp"
+#include "hikmicro_driver/radiometric.hpp"
+#include "hikmicro_driver/types.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
struct CameraConfig
@@ -90,4 +90,4 @@ class HikCamera
std::map aux_cache_;
};
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/http_client.hpp b/hikmicro_driver/include/hikmicro_driver/http_client.hpp
similarity index 96%
rename from include/hikmicro_ptz_driver/http_client.hpp
rename to hikmicro_driver/include/hikmicro_driver/http_client.hpp
index 4bd36a9..90100cd 100644
--- a/include/hikmicro_ptz_driver/http_client.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/http_client.hpp
@@ -9,7 +9,7 @@
typedef void CURL;
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
struct HttpResponse
@@ -71,4 +71,4 @@ class HttpClient
// Percent-encoding for credentials in RTSP URLs (RFC 3986 unreserved characters kept).
std::string urlEncode(const std::string & s);
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/isapi_xml.hpp b/hikmicro_driver/include/hikmicro_driver/isapi_xml.hpp
similarity index 96%
rename from include/hikmicro_ptz_driver/isapi_xml.hpp
rename to hikmicro_driver/include/hikmicro_driver/isapi_xml.hpp
index 7b9a649..ae0babd 100644
--- a/include/hikmicro_ptz_driver/isapi_xml.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/isapi_xml.hpp
@@ -6,9 +6,9 @@
#include
#include
-#include "hikmicro_ptz_driver/types.hpp"
+#include "hikmicro_driver/types.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace isapi
{
@@ -71,4 +71,4 @@ std::optional setElementText(
const std::string & xml, const std::string & element, const std::string & text);
} // namespace isapi
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/motion.hpp b/hikmicro_driver/include/hikmicro_driver/motion.hpp
similarity index 97%
rename from include/hikmicro_ptz_driver/motion.hpp
rename to hikmicro_driver/include/hikmicro_driver/motion.hpp
index 854e9b7..922ef59 100644
--- a/include/hikmicro_ptz_driver/motion.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/motion.hpp
@@ -7,9 +7,9 @@
#include
-#include "hikmicro_ptz_driver/types.hpp"
+#include "hikmicro_driver/types.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
// Signed shortest difference a - b for angles in degrees, in (-180, 180].
@@ -128,4 +128,4 @@ inline const char * toString(ArrivalDetector::State s)
return "unknown";
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/ptz_interface.hpp b/hikmicro_driver/include/hikmicro_driver/ptz_interface.hpp
similarity index 90%
rename from include/hikmicro_ptz_driver/ptz_interface.hpp
rename to hikmicro_driver/include/hikmicro_driver/ptz_interface.hpp
index 8989821..d4e7ab3 100644
--- a/include/hikmicro_ptz_driver/ptz_interface.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/ptz_interface.hpp
@@ -15,16 +15,18 @@
#include
#include
-#include "hikmicro_ptz_driver/GetPresets.h"
-#include "hikmicro_ptz_driver/GotoPresetAction.h"
-#include "hikmicro_ptz_driver/MoveToAction.h"
-#include "hikmicro_ptz_driver/SetPreset.h"
-#include "hikmicro_ptz_driver/camera.hpp"
-#include "hikmicro_ptz_driver/motion.hpp"
-
-namespace hikmicro_ptz_driver
+#include "hikmicro_msgs/GetPresets.h"
+#include "hikmicro_msgs/GotoPresetAction.h"
+#include "hikmicro_msgs/MoveToAction.h"
+#include "hikmicro_msgs/SetPreset.h"
+#include "hikmicro_driver/camera.hpp"
+#include "hikmicro_driver/motion.hpp"
+
+namespace hikmicro_driver
{
+using namespace hikmicro_msgs; // messages, services, actions
+
class PtzInterface
{
public:
@@ -112,4 +114,4 @@ class PtzInterface
double last_cmd_t_{0.0};
};
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/radiometric.hpp b/hikmicro_driver/include/hikmicro_driver/radiometric.hpp
similarity index 97%
rename from include/hikmicro_ptz_driver/radiometric.hpp
rename to hikmicro_driver/include/hikmicro_driver/radiometric.hpp
index 4194193..4205de2 100644
--- a/include/hikmicro_ptz_driver/radiometric.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/radiometric.hpp
@@ -10,7 +10,7 @@
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
struct MultipartPart
@@ -63,4 +63,4 @@ struct TemperatureStats
std::optional regionStats(
const RadiometricFrame & frame, int x1, int y1, int x2, int y2);
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/rtsp_capture.hpp b/hikmicro_driver/include/hikmicro_driver/rtsp_capture.hpp
similarity index 96%
rename from include/hikmicro_ptz_driver/rtsp_capture.hpp
rename to hikmicro_driver/include/hikmicro_driver/rtsp_capture.hpp
index c8ec36c..7abc8ad 100644
--- a/include/hikmicro_ptz_driver/rtsp_capture.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/rtsp_capture.hpp
@@ -11,7 +11,7 @@
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
struct CaptureConfig
@@ -59,4 +59,4 @@ class RtspCapture
std::string active_decoder_;
};
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/rtsp_pipeline.hpp b/hikmicro_driver/include/hikmicro_driver/rtsp_pipeline.hpp
similarity index 97%
rename from include/hikmicro_ptz_driver/rtsp_pipeline.hpp
rename to hikmicro_driver/include/hikmicro_driver/rtsp_pipeline.hpp
index ce25bf6..49b2b7d 100644
--- a/include/hikmicro_ptz_driver/rtsp_pipeline.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/rtsp_pipeline.hpp
@@ -9,7 +9,7 @@
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
inline std::string lower(std::string s)
@@ -88,4 +88,4 @@ inline bool opencvHasGstreamer(const std::string & build_information)
return false;
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/thermal_interface.hpp b/hikmicro_driver/include/hikmicro_driver/thermal_interface.hpp
similarity index 88%
rename from include/hikmicro_ptz_driver/thermal_interface.hpp
rename to hikmicro_driver/include/hikmicro_driver/thermal_interface.hpp
index 453846c..b076261 100644
--- a/include/hikmicro_ptz_driver/thermal_interface.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/thermal_interface.hpp
@@ -13,12 +13,14 @@
#include
#include
-#include "hikmicro_ptz_driver/GetTemperature.h"
-#include "hikmicro_ptz_driver/camera.hpp"
+#include "hikmicro_msgs/GetTemperature.h"
+#include "hikmicro_driver/camera.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
+using namespace hikmicro_msgs; // messages, services, actions
+
class ThermalInterface
{
public:
@@ -62,4 +64,4 @@ class ThermalInterface
std::thread thread_;
};
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/include/hikmicro_ptz_driver/types.hpp b/hikmicro_driver/include/hikmicro_driver/types.hpp
similarity index 94%
rename from include/hikmicro_ptz_driver/types.hpp
rename to hikmicro_driver/include/hikmicro_driver/types.hpp
index d148ceb..9a4b99e 100644
--- a/include/hikmicro_ptz_driver/types.hpp
+++ b/hikmicro_driver/include/hikmicro_driver/types.hpp
@@ -5,7 +5,7 @@
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
// PTZ position as the camera reports it: azimuth (pan) 0..360 deg, elevation (tilt) in deg,
@@ -56,4 +56,4 @@ struct IsapiStatus
bool ok() const {return status_code == 0 || status_code == 1;}
};
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/launch/hikmicro.launch b/hikmicro_driver/launch/hikmicro.launch
similarity index 80%
rename from launch/hikmicro.launch
rename to hikmicro_driver/launch/hikmicro.launch
index 04c5394..428c2ef 100644
--- a/launch/hikmicro.launch
+++ b/hikmicro_driver/launch/hikmicro.launch
@@ -7,12 +7,12 @@
-
+
-
+
-
@@ -22,7 +22,7 @@
-
@@ -31,7 +31,7 @@
-
diff --git a/package.xml b/hikmicro_driver/package.xml
similarity index 92%
rename from package.xml
rename to hikmicro_driver/package.xml
index b09a6fc..745e29f 100644
--- a/package.xml
+++ b/hikmicro_driver/package.xml
@@ -1,7 +1,7 @@
- hikmicro_ptz_driver
+ hikmicro_driver
0.1.0
ROS Noetic driver for the HIKMICRO HM-TD5567T bi-spectrum (thermal + visible) PTZ camera
@@ -27,10 +27,9 @@
actionlib_msgs
cv_bridge
image_transport
+ hikmicro_msgs
libopencv-dev
- message_generation
- message_runtime
roslaunch
gstreamer1.0-plugins-good
diff --git a/src/aux_interface.cpp b/hikmicro_driver/src/aux_interface.cpp
similarity index 97%
rename from src/aux_interface.cpp
rename to hikmicro_driver/src/aux_interface.cpp
index 2d8795c..4f387cf 100644
--- a/src/aux_interface.cpp
+++ b/hikmicro_driver/src/aux_interface.cpp
@@ -1,9 +1,9 @@
-#include "hikmicro_ptz_driver/aux_interface.hpp"
+#include "hikmicro_driver/aux_interface.hpp"
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace
@@ -125,4 +125,4 @@ bool AuxInterface::onRaw(RawRequest::Request & req, RawRequest::Response & res)
return true;
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/camera.cpp b/hikmicro_driver/src/camera.cpp
similarity index 98%
rename from src/camera.cpp
rename to hikmicro_driver/src/camera.cpp
index b80b5cd..3f41349 100644
--- a/src/camera.cpp
+++ b/hikmicro_driver/src/camera.cpp
@@ -1,11 +1,11 @@
-#include "hikmicro_ptz_driver/camera.hpp"
+#include "hikmicro_driver/camera.hpp"
#include
#include
-#include "hikmicro_ptz_driver/isapi_xml.hpp"
+#include "hikmicro_driver/isapi_xml.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace
@@ -302,4 +302,4 @@ std::string HikCamera::rtspUrl(int channel, int stream, int rtsp_port) const
"/Streaming/Channels/" + std::to_string(channel * 100 + stream);
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/camera_node.cpp b/hikmicro_driver/src/camera_node.cpp
similarity index 96%
rename from src/camera_node.cpp
rename to hikmicro_driver/src/camera_node.cpp
index 16e08cb..94972fa 100644
--- a/src/camera_node.cpp
+++ b/hikmicro_driver/src/camera_node.cpp
@@ -10,10 +10,10 @@
#include
#include
-#include "hikmicro_ptz_driver/http_client.hpp"
-#include "hikmicro_ptz_driver/rtsp_capture.hpp"
+#include "hikmicro_driver/http_client.hpp"
+#include "hikmicro_driver/rtsp_capture.hpp"
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
int main(int argc, char ** argv)
{
diff --git a/src/hikmicro_node.cpp b/hikmicro_driver/src/hikmicro_node.cpp
similarity index 91%
rename from src/hikmicro_node.cpp
rename to hikmicro_driver/src/hikmicro_node.cpp
index 5546588..dbc422f 100644
--- a/src/hikmicro_node.cpp
+++ b/hikmicro_driver/src/hikmicro_node.cpp
@@ -8,12 +8,12 @@
#include
#include
-#include "hikmicro_ptz_driver/aux_interface.hpp"
-#include "hikmicro_ptz_driver/camera.hpp"
-#include "hikmicro_ptz_driver/ptz_interface.hpp"
-#include "hikmicro_ptz_driver/thermal_interface.hpp"
+#include "hikmicro_driver/aux_interface.hpp"
+#include "hikmicro_driver/camera.hpp"
+#include "hikmicro_driver/ptz_interface.hpp"
+#include "hikmicro_driver/thermal_interface.hpp"
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
namespace
{
diff --git a/src/http_client.cpp b/hikmicro_driver/src/http_client.cpp
similarity index 97%
rename from src/http_client.cpp
rename to hikmicro_driver/src/http_client.cpp
index ac54bb4..10a3d05 100644
--- a/src/http_client.cpp
+++ b/hikmicro_driver/src/http_client.cpp
@@ -1,4 +1,4 @@
-#include "hikmicro_ptz_driver/http_client.hpp"
+#include "hikmicro_driver/http_client.hpp"
#include
@@ -7,7 +7,7 @@
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace
@@ -150,4 +150,4 @@ std::string urlEncode(const std::string & s)
return out;
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/isapi_xml.cpp b/hikmicro_driver/src/isapi_xml.cpp
similarity index 98%
rename from src/isapi_xml.cpp
rename to hikmicro_driver/src/isapi_xml.cpp
index dfc5604..dfd03f1 100644
--- a/src/isapi_xml.cpp
+++ b/hikmicro_driver/src/isapi_xml.cpp
@@ -1,4 +1,4 @@
-#include "hikmicro_ptz_driver/isapi_xml.hpp"
+#include "hikmicro_driver/isapi_xml.hpp"
#include
@@ -10,7 +10,7 @@
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace isapi
{
@@ -356,4 +356,4 @@ std::optional setElementText(
}
} // namespace isapi
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/ptz_interface.cpp b/hikmicro_driver/src/ptz_interface.cpp
similarity index 98%
rename from src/ptz_interface.cpp
rename to hikmicro_driver/src/ptz_interface.cpp
index 7776ee5..355c20f 100644
--- a/src/ptz_interface.cpp
+++ b/hikmicro_driver/src/ptz_interface.cpp
@@ -1,4 +1,4 @@
-#include "hikmicro_ptz_driver/ptz_interface.hpp"
+#include "hikmicro_driver/ptz_interface.hpp"
#include
@@ -7,9 +7,9 @@
#include
#include
-#include "hikmicro_ptz_driver/PtzState.h"
+#include "hikmicro_msgs/PtzState.h"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace
@@ -441,4 +441,4 @@ bool PtzInterface::onGetPresets(GetPresets::Request &, GetPresets::Response & re
return true;
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/radiometric.cpp b/hikmicro_driver/src/radiometric.cpp
similarity index 98%
rename from src/radiometric.cpp
rename to hikmicro_driver/src/radiometric.cpp
index 1d49c49..5416832 100644
--- a/src/radiometric.cpp
+++ b/hikmicro_driver/src/radiometric.cpp
@@ -1,4 +1,4 @@
-#include "hikmicro_ptz_driver/radiometric.hpp"
+#include "hikmicro_driver/radiometric.hpp"
#include
@@ -9,7 +9,7 @@
#include
#include
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace
@@ -276,4 +276,4 @@ std::optional regionStats(
return s;
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/rtsp_capture.cpp b/hikmicro_driver/src/rtsp_capture.cpp
similarity index 96%
rename from src/rtsp_capture.cpp
rename to hikmicro_driver/src/rtsp_capture.cpp
index 4ab3745..5d56864 100644
--- a/src/rtsp_capture.cpp
+++ b/hikmicro_driver/src/rtsp_capture.cpp
@@ -1,4 +1,4 @@
-#include "hikmicro_ptz_driver/rtsp_capture.hpp"
+#include "hikmicro_driver/rtsp_capture.hpp"
#include
#include
@@ -9,9 +9,9 @@
#include
#include
-#include "hikmicro_ptz_driver/rtsp_pipeline.hpp"
+#include "hikmicro_driver/rtsp_pipeline.hpp"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
RtspCapture::RtspCapture(CaptureConfig config, FrameCallback on_frame, LogCallback on_log)
@@ -173,4 +173,4 @@ void RtspCapture::loop()
}
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/src/thermal_interface.cpp b/hikmicro_driver/src/thermal_interface.cpp
similarity index 97%
rename from src/thermal_interface.cpp
rename to hikmicro_driver/src/thermal_interface.cpp
index 0da5945..17f310b 100644
--- a/src/thermal_interface.cpp
+++ b/hikmicro_driver/src/thermal_interface.cpp
@@ -1,4 +1,4 @@
-#include "hikmicro_ptz_driver/thermal_interface.hpp"
+#include "hikmicro_driver/thermal_interface.hpp"
#include
#include
@@ -8,9 +8,9 @@
#include
#include
-#include "hikmicro_ptz_driver/ThermalStats.h"
+#include "hikmicro_msgs/ThermalStats.h"
-namespace hikmicro_ptz_driver
+namespace hikmicro_driver
{
namespace
@@ -196,4 +196,4 @@ bool ThermalInterface::onGetTemperature(
return true;
}
-} // namespace hikmicro_ptz_driver
+} // namespace hikmicro_driver
diff --git a/test/action_client.py b/hikmicro_driver/test/action_client.py
similarity index 94%
rename from test/action_client.py
rename to hikmicro_driver/test/action_client.py
index e3f19f0..8039128 100755
--- a/test/action_client.py
+++ b/hikmicro_driver/test/action_client.py
@@ -10,7 +10,7 @@
import actionlib
import rospy
-from hikmicro_ptz_driver.msg import GotoPresetAction, GotoPresetGoal, MoveToAction, MoveToGoal
+from hikmicro_msgs.msg import GotoPresetAction, GotoPresetGoal, MoveToAction, MoveToGoal
def main():
diff --git a/test/fake_camera.py b/hikmicro_driver/test/fake_camera.py
similarity index 100%
rename from test/fake_camera.py
rename to hikmicro_driver/test/fake_camera.py
diff --git a/test/main.cpp b/hikmicro_driver/test/main.cpp
similarity index 100%
rename from test/main.cpp
rename to hikmicro_driver/test/main.cpp
diff --git a/test/smoke_test.sh b/hikmicro_driver/test/smoke_test.sh
similarity index 98%
rename from test/smoke_test.sh
rename to hikmicro_driver/test/smoke_test.sh
index 032e492..3b85ce5 100755
--- a/test/smoke_test.sh
+++ b/hikmicro_driver/test/smoke_test.sh
@@ -50,7 +50,7 @@ check() { # check
export HIKMICRO_PASSWORD=test12345
python3 "$here/fake_camera.py" --port "$port" --log "$work/camera.log" &
pids+=($!)
-roslaunch hikmicro_ptz_driver hikmicro.launch host:=127.0.0.1 port:="$port" \
+roslaunch hikmicro_driver hikmicro.launch host:=127.0.0.1 port:="$port" \
> "$work/launch.log" 2>&1 &
pids+=($!)
for _ in $(seq 1 30); do
diff --git a/test/test_camera_fake.cpp b/hikmicro_driver/test/test_camera_fake.cpp
similarity index 98%
rename from test/test_camera_fake.cpp
rename to hikmicro_driver/test/test_camera_fake.cpp
index 7320eb7..b6a59f0 100644
--- a/test/test_camera_fake.cpp
+++ b/hikmicro_driver/test/test_camera_fake.cpp
@@ -13,14 +13,14 @@
#include
#include
-#include "hikmicro_ptz_driver/camera.hpp"
-#include "hikmicro_ptz_driver/motion.hpp"
+#include "hikmicro_driver/camera.hpp"
+#include "hikmicro_driver/motion.hpp"
#ifndef FAKE_CAMERA_PY
#define FAKE_CAMERA_PY "test/fake_camera.py"
#endif
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
using namespace std::chrono_literals;
namespace
diff --git a/test/test_isapi_xml.cpp b/hikmicro_driver/test/test_isapi_xml.cpp
similarity index 99%
rename from test/test_isapi_xml.cpp
rename to hikmicro_driver/test/test_isapi_xml.cpp
index 79c6045..ed744ee 100644
--- a/test/test_isapi_xml.cpp
+++ b/hikmicro_driver/test/test_isapi_xml.cpp
@@ -4,9 +4,9 @@
#include
-#include "hikmicro_ptz_driver/isapi_xml.hpp"
+#include "hikmicro_driver/isapi_xml.hpp"
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
TEST(IsapiXml, AbsoluteExBuildAndParse)
{
diff --git a/test/test_motion.cpp b/hikmicro_driver/test/test_motion.cpp
similarity index 98%
rename from test/test_motion.cpp
rename to hikmicro_driver/test/test_motion.cpp
index a9dcb9a..4d94e17 100644
--- a/test/test_motion.cpp
+++ b/hikmicro_driver/test/test_motion.cpp
@@ -4,9 +4,9 @@
#include
#include
-#include "hikmicro_ptz_driver/motion.hpp"
+#include "hikmicro_driver/motion.hpp"
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
namespace
{
diff --git a/test/test_radiometric.cpp b/hikmicro_driver/test/test_radiometric.cpp
similarity index 98%
rename from test/test_radiometric.cpp
rename to hikmicro_driver/test/test_radiometric.cpp
index 395e1d7..d3b6dc3 100644
--- a/test/test_radiometric.cpp
+++ b/hikmicro_driver/test/test_radiometric.cpp
@@ -7,9 +7,9 @@
#include
#include
-#include "hikmicro_ptz_driver/radiometric.hpp"
+#include "hikmicro_driver/radiometric.hpp"
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
namespace
{
diff --git a/test/test_rtsp.cpp b/hikmicro_driver/test/test_rtsp.cpp
similarity index 96%
rename from test/test_rtsp.cpp
rename to hikmicro_driver/test/test_rtsp.cpp
index ebb701a..5e22277 100644
--- a/test/test_rtsp.cpp
+++ b/hikmicro_driver/test/test_rtsp.cpp
@@ -10,10 +10,10 @@
#include
#include
-#include "hikmicro_ptz_driver/rtsp_capture.hpp"
-#include "hikmicro_ptz_driver/rtsp_pipeline.hpp"
+#include "hikmicro_driver/rtsp_capture.hpp"
+#include "hikmicro_driver/rtsp_pipeline.hpp"
-using namespace hikmicro_ptz_driver;
+using namespace hikmicro_driver;
using namespace std::chrono_literals;
TEST(RtspPipeline, SoftwareAutoUsesDecodebin)
diff --git a/hikmicro_msgs/CHANGELOG.rst b/hikmicro_msgs/CHANGELOG.rst
new file mode 100644
index 0000000..eb980c7
--- /dev/null
+++ b/hikmicro_msgs/CHANGELOG.rst
@@ -0,0 +1,7 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package hikmicro_msgs
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+0.1.0 (2026-10-18)
+------------------
+* Messages, services and the MoveTo / GotoPreset actions, split out of the driver
diff --git a/hikmicro_msgs/CMakeLists.txt b/hikmicro_msgs/CMakeLists.txt
new file mode 100644
index 0000000..4089973
--- /dev/null
+++ b/hikmicro_msgs/CMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 3.0.2)
+project(hikmicro_msgs)
+
+find_package(catkin REQUIRED COMPONENTS
+ std_msgs
+ sensor_msgs
+ actionlib_msgs
+ message_generation
+)
+
+add_message_files(FILES
+ PtzPreset.msg
+ PtzState.msg
+ ThermalStats.msg
+)
+add_service_files(FILES
+ GetPresets.srv
+ GetTemperature.srv
+ RawRequest.srv
+ SetAux.srv
+ SetDayNight.srv
+ SetPreset.srv
+ Snapshot.srv
+)
+add_action_files(FILES
+ GotoPreset.action
+ MoveTo.action
+)
+generate_messages(DEPENDENCIES std_msgs sensor_msgs actionlib_msgs)
+
+catkin_package(
+ CATKIN_DEPENDS std_msgs sensor_msgs actionlib_msgs message_runtime
+)
diff --git a/hikmicro_msgs/README.md b/hikmicro_msgs/README.md
new file mode 100644
index 0000000..28c3861
--- /dev/null
+++ b/hikmicro_msgs/README.md
@@ -0,0 +1,35 @@
+# hikmicro_msgs
+
+Messages, services and actions of [hikmicro_driver](../README.md).
+
+## Actions
+
+| | |
+|---|---|
+| `MoveTo` | goal: `pan`, `tilt`, `zoom` (≤ 0 keeps it), `speed`, `tolerance`, `timeout` · result: `reached`, `state` (`reached`, `stalled`, `timeout`, `preempted`, `superseded`, `error`), position, `message` · feedback: position and errors |
+| `GotoPreset` | goal: preset `id`; same result and feedback |
+
+## Messages
+
+| | |
+|---|---|
+| `PtzState` | connected, high precision, moving, pan / tilt (°), zoom (x) |
+| `PtzPreset` | id, name, enabled, position |
+| `ThermalStats` | mode (`POINT`, `REGION`, `FRAME`), box used, max / min / mean (°C) and where |
+
+## Services
+
+| | |
+|---|---|
+| `GetPresets` | every preset with its position |
+| `SetPreset` | save the current position as `id` / `name` (also used to remove) |
+| `SetAux` | auxiliary by type (`LIGHT`, `WIPER`, `FAN`, `HEATER`), `enabled` |
+| `SetDayNight` | IR-cut mode `auto` / `day` / `night` (empty: read) |
+| `Snapshot` | JPEG of the visible (`0`) or thermal (`1`) sensor |
+| `GetTemperature` | °C at a point, in a box or over the frame; pixels or normalized |
+| `RawRequest` | any ISAPI call |
+
+```python
+from hikmicro_msgs.msg import MoveToAction, MoveToGoal, PtzState
+from hikmicro_msgs.srv import GetTemperature
+```
diff --git a/action/GotoPreset.action b/hikmicro_msgs/action/GotoPreset.action
similarity index 100%
rename from action/GotoPreset.action
rename to hikmicro_msgs/action/GotoPreset.action
diff --git a/action/MoveTo.action b/hikmicro_msgs/action/MoveTo.action
similarity index 100%
rename from action/MoveTo.action
rename to hikmicro_msgs/action/MoveTo.action
diff --git a/msg/PtzPreset.msg b/hikmicro_msgs/msg/PtzPreset.msg
similarity index 100%
rename from msg/PtzPreset.msg
rename to hikmicro_msgs/msg/PtzPreset.msg
diff --git a/msg/PtzState.msg b/hikmicro_msgs/msg/PtzState.msg
similarity index 100%
rename from msg/PtzState.msg
rename to hikmicro_msgs/msg/PtzState.msg
diff --git a/msg/ThermalStats.msg b/hikmicro_msgs/msg/ThermalStats.msg
similarity index 100%
rename from msg/ThermalStats.msg
rename to hikmicro_msgs/msg/ThermalStats.msg
diff --git a/hikmicro_msgs/package.xml b/hikmicro_msgs/package.xml
new file mode 100644
index 0000000..f10a23e
--- /dev/null
+++ b/hikmicro_msgs/package.xml
@@ -0,0 +1,20 @@
+
+
+
+ hikmicro_msgs
+ 0.1.0
+
+ Messages, services and actions of the HIKMICRO HM-TD5567T PTZ thermal camera driver.
+
+ Agus Darmawan
+ Apache-2.0
+ https://github.com/DarmawanRobotics/hikmicro_ptz_driver
+
+ catkin
+
+ message_generation
+ std_msgs
+ sensor_msgs
+ actionlib_msgs
+ message_runtime
+
diff --git a/srv/GetPresets.srv b/hikmicro_msgs/srv/GetPresets.srv
similarity index 100%
rename from srv/GetPresets.srv
rename to hikmicro_msgs/srv/GetPresets.srv
diff --git a/srv/GetTemperature.srv b/hikmicro_msgs/srv/GetTemperature.srv
similarity index 100%
rename from srv/GetTemperature.srv
rename to hikmicro_msgs/srv/GetTemperature.srv
diff --git a/srv/RawRequest.srv b/hikmicro_msgs/srv/RawRequest.srv
similarity index 100%
rename from srv/RawRequest.srv
rename to hikmicro_msgs/srv/RawRequest.srv
diff --git a/srv/SetAux.srv b/hikmicro_msgs/srv/SetAux.srv
similarity index 100%
rename from srv/SetAux.srv
rename to hikmicro_msgs/srv/SetAux.srv
diff --git a/srv/SetDayNight.srv b/hikmicro_msgs/srv/SetDayNight.srv
similarity index 100%
rename from srv/SetDayNight.srv
rename to hikmicro_msgs/srv/SetDayNight.srv
diff --git a/srv/SetPreset.srv b/hikmicro_msgs/srv/SetPreset.srv
similarity index 100%
rename from srv/SetPreset.srv
rename to hikmicro_msgs/srv/SetPreset.srv
diff --git a/srv/Snapshot.srv b/hikmicro_msgs/srv/Snapshot.srv
similarity index 100%
rename from srv/Snapshot.srv
rename to hikmicro_msgs/srv/Snapshot.srv