Skip to content

Commit

Permalink
Just feel like committing
Browse files Browse the repository at this point in the history
  • Loading branch information
Chao Qu committed Sep 4, 2014
1 parent 5597dce commit 7f47011
Show file tree
Hide file tree
Showing 17 changed files with 284 additions and 420 deletions.
21 changes: 5 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ else()
endif()

find_package(catkin REQUIRED COMPONENTS
roscpp sensor_msgs std_msgs
image_transport camera_info_manager
dynamic_reconfigure cv_bridge nodelet
roscpp nodelet camera_base cv_brdige
)
find_package(OpenCV)

Expand All @@ -42,15 +40,13 @@ include_directories(

# library
add_library(${PROJECT_NAME}
src/gige_camera.cpp
src/flir_gige.cpp
src/thermal_proc/thermal_proc.cpp
src/thermal_proc/thermal_proc_nodelet.cpp
src/flir_gige/flir_gige.cpp
src/flir_gige/flir_gige_ros.cpp
src/flir_gige/flir_gige_node.cpp
)
target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
${EBUS_LIBRARIES}
${OpenCV_LIBRARIES}
)

## Add cmake target dependencies of the executable/library
Expand All @@ -63,15 +59,8 @@ add_dependencies(${PROJECT_NAME}

# node
add_executable(${PROJECT_NAME}_node
src/flir_gige_node.cpp
src/flir_gige/flir_gige_main.cpp
)
target_link_libraries(${PROJECT_NAME}_node
${PROJECT_NAME}
)

add_executable(thermal_proc_node
src/thermal_proc/thermal_proc_node.cpp
)
target_link_libraries(thermal_proc_node
${PROJECT_NAME}
)
1 change: 0 additions & 1 deletion include/camera_base

This file was deleted.

89 changes: 15 additions & 74 deletions include/flir_gige/flir_gige.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
#ifndef FLIR_GIGE_GIGE_CAMERA_H_
#define FLIR_GIGE_GIGE_CAMERA_H_
#ifndef FLIR_GIGE_H_
#define FLIR_GIGE_H_

#include <stdint.h>

#include <string>
#include <memory>
#include <thread>
#include <functional>
#include <utility>

#include <PvSystem.h>
#include <PvDevice.h>
Expand All @@ -19,90 +13,44 @@
#include <PvBuffer.h>
#include <PvPipeline.h>

#include <opencv2/core/core.hpp>
#include <sensor_msgs/Image.h>

#include "flir_gige/planck.h"

namespace flir_gige {

/**
* @brief The BitSize enum
*/
enum BitSize { BIT8BIT = 2, BIT14BIT };

/**
* @brief The GigeConfig struct
*/
struct GigeConfig {
bool color{false};
int bit{2}; ///< 2 - 8bit, 3 - 14bit
};

/**
* @brief The FreeDevice struct
*/
struct FreeDevice {
void operator()(PvDevice *device) const { PvDevice::Free(device); }
};

/**
* @brief The FreeStream struct
*/
struct FreeStream {
void operator()(PvStream *stream) const { PvStream::Free(stream); }
};

/**
* @brief The GigeCamera class
*/
class GigeCamera {
class FlirGige {
public:
GigeCamera(const std::string &ip_address);
GigeCamera(const GigeCamera &) = delete; // No copy constructor
GigeCamera &operator=(const GigeCamera &) = delete; // No assignment operator
FlirGige(const std::string &ip_address);

/**
* @brief Connect Find and connect to device, create stream and pipeline
*/
void Connect();
const std::string &ip_address() const { return ip_address_; }
const std::string &display_id() const { return display_di_; }

/**
* @brief Configure Configure camera before image acquisition
* @param config
*/
void Configure(const GigeConfig &config);
void Connect();

/**
* @brief Start Start pipeline, enable stream and start acquisition
*/
void Start();

/**
* @brief Stop Stop acquisition, disable stream and stop pipeline
*/
void Stop();

/**
* @brief Disconnect Release all resources we hold
*/
void Disconnect();

/**
* @brief IsAcquire
* @return true if camera is acquring image
*/
const bool IsAcquire() const { return acquire_; }

std::function<void(const cv::Mat &image, const Planck &planck)> use_image;
std::function<void(const std::pair<double, double> &spot)> use_temperature;
void Configure(FlirGigeDynConfig &config);

private:
using PvDevicePtr = std::unique_ptr<PvDevice, FreeDevice>;
using PvStreamPtr = std::unique_ptr<PvStream, FreeStream>;
using PvPipelinePtr = std::unique_ptr<PvPipeline>;
using ThreadPtr = std::unique_ptr<std::thread>;

void FindDevice(const std::string &ip);
std::string AvailableDevice() const;
void ConnectDevice();
void OpenStream();
void ConfigureStream();
Expand All @@ -113,24 +61,17 @@ class GigeCamera {
void LabeledOutput(const std::string &msg) const;

double GetSpotPixel(const cv::Mat &image) const;
void SetAoi(const int width, const int height);
void SetPixelFormat(BitSize bit);

bool raw_{false};
bool acquire_{false};
bool color_{false}; // false - grayscale, true - jet
std::string label_{"\033[0;35m[ FLIR]:\033[0m "};
void SetPixelFormat(int bit);

std::string ip_address_;
std::string display_id_;
PvSystem system_;
const PvDeviceInfo *dinfo_;
PvDevicePtr device_;
PvStreamPtr stream_;
PvPipelinePtr pipeline_;
ThreadPtr image_thread_;
cv::Mat image_raw_;

}; // class GigeCamera
};

} // namespace flir_gige

#endif // FLIR_GIGE_GIGE_CAMERA_H_
#endif // FLIR_GIGE_H_
21 changes: 19 additions & 2 deletions include/flir_gige/flir_gige_node.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
#ifndef FLIR_GIGE_NODE_H_
#define FLIR_GIGE_NODE_H_

#include "flir_gige/flir_gige_ros.h"
#include "flir_gige/FlirGigeDynConfig.h"
#include "camera_base/camera_node_base.h"

namespace flir_gige {
}
#endif // FLIR_GIGE_NODE_H_

class FlirGigeNode : public CameraNodeBase<FlirGigeDynConfig> {
public:
FlirGigeNode(const ros::NodeHandle &nh)
: CameraNodeBase{nh}, flir_gige_ros_{nh} {}

virtual void Acquire() override;
virtual void Setup(FlirGigeDynConfig &config) override;

private:
FlirGigeRos flir_gige_ros_;
};

} // namespace flir_gige

#endif // FLIR_GIGE_NODE_H_
75 changes: 10 additions & 65 deletions include/flir_gige/flir_gige_ros.h
Original file line number Diff line number Diff line change
@@ -1,77 +1,22 @@
#ifndef FLIR_GIGE_FLIR_GIGE_H_
#define FLIR_GIGE_FLIR_GIGE_H_
#ifndef FLIR_GIGE_ROS_H_
#define FLIR_GIGE_ROS_H_

#include <utility>

#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CameraInfo.h>
#include <dynamic_reconfigure/server.h>
#include <image_transport/image_transport.h>
#include <camera_info_manager/camera_info_manager.h>
#include <cv_bridge/cv_bridge.h>
#include <diagnostic_updater/diagnostic_updater.h>
#include <diagnostic_updater/publisher.h>

#include <opencv2/core/core.hpp>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>

#include "flir_gige/planck.h"
#include "flir_gige/gige_camera.h"
#include "flir_gige/FlirDynConfig.h"
#include "flir_gige/flir_gige.h"
#include "camera_base/camera_ros_base.h"

namespace flir_gige {

class FlirGige {
class FlirGigeRos : public CameraRosBase {
public:
using camera_info_manager::CameraInfoManager;
using CameraInfoManagerPtr = boost::shared_ptr<CameraInfoManager>;
using FlirDynConfig = ::flir_gige::FlirDynConfig;

/**
* @brief FlirGige Constructor
* @param nh Private node handle
*/
FlirGige(const ros::NodeHandle &nh);

/**
* @brief Run Run camera
*/
void Run();
FlirGigeRos(const ros::NodeHandle& nh)
: CameraRosBase{nh}, flir_gige_{identifier()} {}

/**
* @brief End End camera
*/
void End();
virtual bool Grab(const sensor_msgs::ImagePtr* image_msg) override;

private:
void ReadConfig();
void PublishImage(const cv::Mat &image, const Planck &planck);
void PublishTemperature(const std::pair<double, double> &spot);
std::string GetImageEncoding(const cv::Mat &image) const;
void ConfigCb(FlirDynConfig &config, int level);

ros::NodeHandle nh_; ///< Private node handle
std::string frame_id_; ///< Frame id
std::string camera_name_; ///< Camera name
boost::shared_ptr<ros::Rate> rate_; ///< Acquisition rate

image_transport::ImageTransport it_; ///< Image transport
image_transport::CameraPublisher pub_camera_; ///< Camera publisher
CameraInfoManagerPtr cinfo_manager_; ///< Camera info manager
ros::Publisher pub_temperature_; ///< Temperature publisher

FlirDynConfig config_; ///< Reconfigure parameters
dynamic_reconfigure::Server<FlirDynConfig> server_; ///< Reconfigure server

diagnostic_updater::Updater updater_; ///< Diagnostic updater
diagnostic_updater::TopicDiagnostic diagnostics_; ///< topic diagnostics

boost::shared_ptr<GigeCamera> gige_camera_; ///< GigE camera
boost::shared_ptr<boost::thread> image_thread_; ///< Image acquisition thread
FlirGige flir_gige_;
};

} // namespace flir_gige

#endif // FLIR_GIGE_FLIR_GIGE_H_
#endif // FLIR_GIGE_ROS_H_
10 changes: 5 additions & 5 deletions include/flir_gige/planck.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,24 @@ struct Planck {
double F;
double O;
double R;
const double kT0{273.15}; ///< Kelvin at 0 celcius
static const double kT0{273.15}; ///< Kelvin at 0 celcius

/**
* @brief CelsiusToRaw Convert celsius to 16-bit raw data
* @param t Celcius
* @return raw data
*/
int CelsiusToRaw(const double t) const {
inline int CelsiusToRaw(const double t) const {
return R / (std::exp(B / (t + kT0)) - F) + O;
}

/**
* @brief RawToCelsius Convert 16-bit raw data to celsius
* @param S Raw data
* @param s Raw data
* @return temperature in celsius
*/
double RawToCelsius(const int S) const {
return B / std::log(R / (S - O) + F) - kT0;
inline double RawToCelsius(const int s) const {
return B / std::log(R / (s - O) + F) - kT0;
}
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#ifndef FLIR_GIGE_THERMAL_PROC_H_
#define FLIR_GIGE_THERMAL_PROC_H_
#ifndef FLIR_GIGE_THERMAL_PROC_NODE_H_
#define FLIR_GIGE_THERMAL_PROC_NODE_H_

#include <cstdint>
#include <mutex>
Expand Down Expand Up @@ -51,4 +51,4 @@ Planck GetPlanck(const sensor_msgs::CameraInfo &cinfo_msg);

} // namespace flir_gige

#endif // FLIR_GIGE_THERMAL_PROC_H_
#endif // FLIR_GIGE_THERMAL_PROC_NODE_H_
16 changes: 4 additions & 12 deletions package.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?xml version="1.0"?>
<package>
<name>flir_gige</name>
<version>0.0.0</version>
<version>0.0.1</version>
<description>The flir_gige package</description>

<maintainer email="[email protected]">chao</maintainer>
<maintainer email="[email protected]">Chao Qu</maintainer>

<license>BSD</license>

Expand All @@ -13,20 +13,12 @@
<build_depend>roscpp</build_depend>
<build_depend>nodelet</build_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>camera_info_manager</build_depend>
<build_depend>dynamic_reconfigure</build_depend>
<build_depend>diagnostic_updater</build_depend>
<build_depend>camera_base</build_depend>

<run_depend>roscpp</run_depend>
<run_depend>nodelet</run_depend>
<run_depend>cv_bridge</run_depend>
<run_depend>sensor_msgs</run_depend>
<run_depend>image_transport</run_depend>
<run_depend>camera_info_manager</run_depend>
<run_depend>dynamic_reconfigure</run_depend>
<run_depend>diagnostic_updater</run_depend>
<run_depend>camera_base</run_depend>

<export>
<nodelet plugin="${prefix}/nodelet_plugins.xml" />
Expand Down
Loading

0 comments on commit 7f47011

Please sign in to comment.