From 64fa51559ceee85e6fbd87e968c985b6b7530c0f Mon Sep 17 00:00:00 2001 From: agus-darmawan Date: Sun, 18 Oct 2026 08:55:31 +0700 Subject: [PATCH 1/2] refactor: split messages into hikmicro_msgs --- .github/workflows/ci.yml | 4 +- README.md | 56 ++++++++++--------- .../CMakeLists.txt | 28 ++-------- .../config}/camera.yaml | 0 .../config}/hikmicro.yaml | 0 .../hikmicro_driver}/aux_interface.hpp | 16 +++--- .../include/hikmicro_driver}/camera.hpp | 10 ++-- .../include/hikmicro_driver}/http_client.hpp | 4 +- .../include/hikmicro_driver}/isapi_xml.hpp | 6 +- .../include/hikmicro_driver}/motion.hpp | 6 +- .../hikmicro_driver}/ptz_interface.hpp | 20 ++++--- .../include/hikmicro_driver}/radiometric.hpp | 4 +- .../include/hikmicro_driver}/rtsp_capture.hpp | 4 +- .../hikmicro_driver}/rtsp_pipeline.hpp | 4 +- .../hikmicro_driver}/thermal_interface.hpp | 10 ++-- .../include/hikmicro_driver}/types.hpp | 4 +- .../launch}/hikmicro.launch | 10 ++-- package.xml => hikmicro_driver/package.xml | 5 +- .../src}/aux_interface.cpp | 6 +- {src => hikmicro_driver/src}/camera.cpp | 8 +-- {src => hikmicro_driver/src}/camera_node.cpp | 6 +- .../src}/hikmicro_node.cpp | 10 ++-- {src => hikmicro_driver/src}/http_client.cpp | 6 +- {src => hikmicro_driver/src}/isapi_xml.cpp | 6 +- .../src}/ptz_interface.cpp | 8 +-- {src => hikmicro_driver/src}/radiometric.cpp | 6 +- {src => hikmicro_driver/src}/rtsp_capture.cpp | 8 +-- .../src}/thermal_interface.cpp | 8 +-- .../test}/action_client.py | 2 +- {test => hikmicro_driver/test}/fake_camera.py | 0 {test => hikmicro_driver/test}/main.cpp | 0 {test => hikmicro_driver/test}/smoke_test.sh | 2 +- .../test}/test_camera_fake.cpp | 6 +- .../test}/test_isapi_xml.cpp | 4 +- .../test}/test_motion.cpp | 4 +- .../test}/test_radiometric.cpp | 4 +- {test => hikmicro_driver/test}/test_rtsp.cpp | 6 +- hikmicro_msgs/CMakeLists.txt | 33 +++++++++++ .../action}/GotoPreset.action | 0 .../action}/MoveTo.action | 0 {msg => hikmicro_msgs/msg}/PtzPreset.msg | 0 {msg => hikmicro_msgs/msg}/PtzState.msg | 0 {msg => hikmicro_msgs/msg}/ThermalStats.msg | 0 hikmicro_msgs/package.xml | 20 +++++++ {srv => hikmicro_msgs/srv}/GetPresets.srv | 0 {srv => hikmicro_msgs/srv}/GetTemperature.srv | 0 {srv => hikmicro_msgs/srv}/RawRequest.srv | 0 {srv => hikmicro_msgs/srv}/SetAux.srv | 0 {srv => hikmicro_msgs/srv}/SetDayNight.srv | 0 {srv => hikmicro_msgs/srv}/SetPreset.srv | 0 {srv => hikmicro_msgs/srv}/Snapshot.srv | 0 51 files changed, 194 insertions(+), 150 deletions(-) rename CMakeLists.txt => hikmicro_driver/CMakeLists.txt (86%) rename {config => hikmicro_driver/config}/camera.yaml (100%) rename {config => hikmicro_driver/config}/hikmicro.yaml (100%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/aux_interface.hpp (77%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/camera.hpp (94%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/http_client.hpp (96%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/isapi_xml.hpp (96%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/motion.hpp (97%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/ptz_interface.hpp (90%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/radiometric.hpp (97%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/rtsp_capture.hpp (96%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/rtsp_pipeline.hpp (97%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/thermal_interface.hpp (88%) rename {include/hikmicro_ptz_driver => hikmicro_driver/include/hikmicro_driver}/types.hpp (94%) rename {launch => hikmicro_driver/launch}/hikmicro.launch (80%) rename package.xml => hikmicro_driver/package.xml (92%) rename {src => hikmicro_driver/src}/aux_interface.cpp (97%) rename {src => hikmicro_driver/src}/camera.cpp (98%) rename {src => hikmicro_driver/src}/camera_node.cpp (96%) rename {src => hikmicro_driver/src}/hikmicro_node.cpp (91%) rename {src => hikmicro_driver/src}/http_client.cpp (97%) rename {src => hikmicro_driver/src}/isapi_xml.cpp (98%) rename {src => hikmicro_driver/src}/ptz_interface.cpp (98%) rename {src => hikmicro_driver/src}/radiometric.cpp (98%) rename {src => hikmicro_driver/src}/rtsp_capture.cpp (96%) rename {src => hikmicro_driver/src}/thermal_interface.cpp (97%) rename {test => hikmicro_driver/test}/action_client.py (94%) rename {test => hikmicro_driver/test}/fake_camera.py (100%) rename {test => hikmicro_driver/test}/main.cpp (100%) rename {test => hikmicro_driver/test}/smoke_test.sh (98%) rename {test => hikmicro_driver/test}/test_camera_fake.cpp (98%) rename {test => hikmicro_driver/test}/test_isapi_xml.cpp (99%) rename {test => hikmicro_driver/test}/test_motion.cpp (98%) rename {test => hikmicro_driver/test}/test_radiometric.cpp (98%) rename {test => hikmicro_driver/test}/test_rtsp.cpp (96%) create mode 100644 hikmicro_msgs/CMakeLists.txt rename {action => hikmicro_msgs/action}/GotoPreset.action (100%) rename {action => hikmicro_msgs/action}/MoveTo.action (100%) rename {msg => hikmicro_msgs/msg}/PtzPreset.msg (100%) rename {msg => hikmicro_msgs/msg}/PtzState.msg (100%) rename {msg => hikmicro_msgs/msg}/ThermalStats.msg (100%) create mode 100644 hikmicro_msgs/package.xml rename {srv => hikmicro_msgs/srv}/GetPresets.srv (100%) rename {srv => hikmicro_msgs/srv}/GetTemperature.srv (100%) rename {srv => hikmicro_msgs/srv}/RawRequest.srv (100%) rename {srv => hikmicro_msgs/srv}/SetAux.srv (100%) rename {srv => hikmicro_msgs/srv}/SetDayNight.srv (100%) rename {srv => hikmicro_msgs/srv}/SetPreset.srv (100%) rename {srv => hikmicro_msgs/srv}/Snapshot.srv (100%) 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/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/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/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 From 4659a8e2e4faf95fdeea8db47de5f734afa47e6d Mon Sep 17 00:00:00 2001 From: agus-darmawan Date: Sun, 18 Oct 2026 08:56:13 +0700 Subject: [PATCH 2/2] docs: add isapi, network, first run and troubleshooting guides --- docs/first_run.md | 33 +++++++++++++++++++++ docs/isapi.md | 55 +++++++++++++++++++++++++++++++++++ docs/network.md | 45 ++++++++++++++++++++++++++++ docs/troubleshooting.md | 22 ++++++++++++++ hikmicro_driver/CHANGELOG.rst | 10 +++++++ hikmicro_msgs/CHANGELOG.rst | 7 +++++ hikmicro_msgs/README.md | 35 ++++++++++++++++++++++ 7 files changed, 207 insertions(+) create mode 100644 docs/first_run.md create mode 100644 docs/isapi.md create mode 100644 docs/network.md create mode 100644 docs/troubleshooting.md create mode 100644 hikmicro_driver/CHANGELOG.rst create mode 100644 hikmicro_msgs/CHANGELOG.rst create mode 100644 hikmicro_msgs/README.md 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/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/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 +```