Skip to content

Commit 0b4d4f8

Browse files
authored
Merge pull request #2 from InfiniteSenseLab/main
[07 May] Merge main
2 parents 38e01b9 + e61f546 commit 0b4d4f8

10 files changed

Lines changed: 238 additions & 75 deletions

File tree

example/ZMQ/zmq_main.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,43 @@
11
#include "infinite_sense.h"
2-
#include <thread>
32
using namespace infinite_sense;
43
int main() {
4+
5+
// 1.创建同步器
56
Synchronizer synchronizer;
6-
// use net link
7-
// synchronizer.SetNetLink("192.168.1.188", 8888);
8-
// use serial link
9-
synchronizer.SetSerialLink("/dev/ttyACM0",460800);
10-
// use mv camera
11-
// synchronizer.UseMvCam();
7+
/*
8+
使用网口连接
9+
synchronizer.SetNetLink("192.168.1.188", 8888);
10+
*/
11+
// 使用USB连接
12+
synchronizer.SetSerialLink("/dev/ttyACM0", 460800);
13+
/*
14+
如使用工业相机, 需要指定 相机名称 和 同步板的触发端口
15+
std::map<std::string, TriggerDevice> params;
16+
params["camera_1"] = TriggerDevice::CAM_1; //camera_1:表示设备的名称,TriggerDevice::CAM_1:使用同步板CAM_1端口触发
17+
synchronizer.UseMvCam(params);
18+
*/
19+
20+
// 2.开启同步
1221
synchronizer.Start();
22+
23+
// 3.订阅数据
1324
Synchronizer::PrintSummary();
25+
zmq::context_t context(1);
26+
zmq::socket_t subscriber(context, zmq::socket_type::sub);
27+
subscriber.connect("tcp://localhost:5555");
28+
29+
const std::string topic = "imu_1"; // 订阅特定主题(如,板载IMU数据: "imu_1")
30+
subscriber.setsockopt(ZMQ_SUBSCRIBE, topic.c_str(), topic.size());
31+
zmq::message_t msg;
1432
while (true) {
15-
std::this_thread::sleep_for(std::chrono::milliseconds{1000});
33+
if (subscriber.recv(msg, zmq::recv_flags::dontwait)) {
34+
if (subscriber.get(zmq::sockopt::rcvmore)) {
35+
zmq::message_t dummy;
36+
subscriber.recv(dummy);
37+
}
38+
}
1639
}
40+
// 4.停止同步
1741
synchronizer.Stop();
1842
return 0;
1943
}

infinite_sense_core/include/cam.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class CamManger {
2020
void Restart();
2121

2222
private:
23-
void Receive(void* handle, const std::string&) const;
23+
void Receive(void* handle, const std::string&);
2424
bool is_running_{false};
2525
std::vector<int> rets_;
2626
std::vector<void*> handles_;

infinite_sense_core/include/data.h

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,43 @@
33
#include <string>
44
#include "image.h"
55
namespace infinite_sense {
6-
struct ImuData {
7-
uint64_t time_stamp_us;
8-
float temperature;
9-
std::string name;
10-
float a[3];
11-
float g[3];
12-
float q[4];
13-
};
6+
struct ImuData {
7+
uint64_t time_stamp_us;
8+
float temperature;
9+
std::string name;
10+
float a[3];
11+
float g[3];
12+
float q[4];
13+
};
1414

15-
struct CamData {
16-
uint64_t time_stamp_us;
17-
std::string name;
18-
GMat image;
19-
};
15+
struct CamData {
16+
uint64_t time_stamp_us;
17+
std::string name;
18+
GMat image;
19+
};
2020

21-
struct LaserData {
22-
uint64_t time_stamp_us;
23-
std::string name;
24-
};
21+
struct LaserData {
22+
uint64_t time_stamp_us;
23+
std::string name;
24+
};
2525

26-
struct GPSData {
27-
uint64_t time_stamp_us;
28-
uint64_t gps_stamp_us;
29-
uint64_t gps_stamp_us_trigger;
30-
std::string name;
31-
float latitude;
32-
float longitude;
33-
};
26+
struct GPSData {
27+
uint64_t time_stamp_us;
28+
uint64_t gps_stamp_us;
29+
uint64_t gps_stamp_us_trigger;
30+
std::string name;
31+
float latitude;
32+
float longitude;
33+
};
3434

35-
enum TriggerDevice {
36-
IMU_1 = 0, // internal imu
37-
IMU_2 = 1, // external imu
38-
CAM_1 = 2, // camera 1
39-
CAM_2 = 3, // camera 2
40-
CAM_3 = 4, // camera 3
41-
CAM_4 = 5, // camera 4
42-
LASER = 6, // laser pps
43-
GPS = 7, // gps pps
44-
};
45-
}
35+
enum TriggerDevice {
36+
IMU_1 = 0, // internal imu
37+
IMU_2 = 1, // external imu
38+
CAM_1 = 2, // camera 1
39+
CAM_2 = 3, // camera 2
40+
CAM_3 = 4, // camera 3
41+
CAM_4 = 5, // camera 4
42+
LASER = 6, // laser pps
43+
GPS = 7, // gps pps
44+
};
45+
} // namespace infinite_sense

infinite_sense_core/include/image.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ class GMat {
104104
public:
105105
GMat();
106106

107-
GMat(int rows_, int cols_, int type = GMatType<>::Type, uchar* src = nullptr, bool copy = false, int image_align = 16);
107+
GMat(int rows_, int cols_, int type = GMatType<>::Type, uchar* src = nullptr, bool copy = false,
108+
int image_align = 16);
108109

109110
GMat(const GMat& ref);
110111

infinite_sense_core/include/infinite_sense.h

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,96 @@ class SerialManager;
1010
class CamManger;
1111
class TriggerManger;
1212
class Messenger;
13+
14+
/**
15+
* @class Synchronizer
16+
* @brief 同步器类,负责统一协调网络、串口、相机等模块的启动与配置,管理多传感器系统的时间同步。
17+
*/
1318
class Synchronizer {
1419
public:
20+
/**
21+
* @brief 构造函数,初始化成员变量。
22+
*/
1523
Synchronizer();
24+
25+
/// 默认析构函数。
1626
~Synchronizer() = default;
27+
28+
/**
29+
* @brief 启动同步器,初始化并启动各组件(网络、串口、相机等)。
30+
*/
1731
void Start() const;
32+
33+
/**
34+
* @brief 停止同步器,释放资源。
35+
*/
1836
void Stop() const;
19-
static void SetLogPath(const std::string &path);
37+
38+
/**
39+
* @brief 设置日志输出路径(静态方法)。
40+
*
41+
* @param path 日志保存路径。
42+
*/
43+
static void SetLogPath(const std::string& path);
44+
45+
/**
46+
* @brief 配置串口连接参数。
47+
*
48+
* @param serial_dev 串口设备名称(如 "/dev/ttyUSB0")。
49+
* @param serial_baud_rate 波特率(如 115200)。
50+
*/
2051
void SetSerialLink(std::string serial_dev, int serial_baud_rate);
52+
53+
/**
54+
* @brief 配置网络连接参数。
55+
*
56+
* @param net_dev 目标网络 IP 地址。
57+
* @param port 网络端口号。
58+
*/
2159
void SetNetLink(std::string net_dev, unsigned int port);
60+
61+
/**
62+
* @brief 使用 MV(迈德威视)相机,并配置其对应的触发设备。
63+
*
64+
* @param params 可选参数:映射相机名称到 TriggerDevice 枚举。
65+
*/
2266
void UseMvCam(const std::map<std::string, TriggerDevice>& params = std::map<std::string, TriggerDevice>());
67+
68+
/**
69+
* @brief 获取指定设备最近一次的触发时间(静态方法)。
70+
*
71+
* @param dev 查询的设备类型。
72+
* @param time 返回对应的触发时间戳。
73+
* @return true 如果查询成功(设备有触发记录)。
74+
* @return false 如果设备无记录。
75+
*/
2376
static bool GetLastTriggerTime(TriggerDevice dev, uint64_t time);
24-
static void PrintSummary() ;
77+
78+
/**
79+
* @brief 打印当前系统的配置与状态摘要信息。
80+
*/
81+
static void PrintSummary();
82+
2583
private:
84+
/// 网络地址
2685
std::string net_ip_;
86+
87+
/// 网络端口号
2788
unsigned short net_port_{};
89+
90+
/// 串口设备
2891
std::string serial_dev_;
92+
93+
/// 串口波特率
2994
int serial_baud_rate_{};
95+
96+
/// 网络管理器
3097
std::shared_ptr<NetManager> net_manager_{nullptr};
98+
99+
/// 串口管理器
31100
std::shared_ptr<SerialManager> serial_manager_{nullptr};
101+
102+
/// 相机管理器
32103
std::shared_ptr<CamManger> cam_manager_{nullptr};
33104
};
34105

infinite_sense_core/include/trigger.h

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,99 @@
33
#include <mutex>
44
#include <infinite_sense.h>
55
#include <map>
6+
67
namespace infinite_sense {
8+
9+
/**
10+
* @brief 宏定义:设置所有设备的最新触发状态。
11+
*
12+
* @param timestamp 触发时间戳。
13+
* @param status 触发状态位掩码(每一位对应一个设备)。
14+
*/
715
#define SET_LAST_TRIGGER_STATUS(timestamp, status) TriggerManger::GetInstance().SetLastTriggerStatus(timestamp, status)
16+
17+
/**
18+
* @brief 宏定义:获取指定设备的最新触发状态时间。
19+
*
20+
* @param device 要查询的设备。
21+
* @param timestamp 返回设备的最后触发时间戳。
22+
*/
823
#define GET_LAST_TRIGGER_STATUS(device, timestamp) TriggerManger::GetInstance().GetLastTriggerStatus(device, timestamp)
24+
25+
/**
26+
* @class TriggerManger
27+
* @brief 管理各传感器或设备的触发状态,并通过消息机制发布状态信息。
28+
*
29+
* 使用单例模式管理系统中所有的触发设备。支持位掩码形式更新所有设备的状态,
30+
* 并可查询特定设备的最后一次有效触发时间。
31+
*/
932
class TriggerManger {
1033
public:
34+
/**
35+
* @brief 获取 TriggerManger 单例对象。
36+
* @return TriggerManger& 单例引用。
37+
*/
1138
static TriggerManger &GetInstance() {
1239
static TriggerManger instance;
1340
return instance;
1441
}
42+
43+
// 删除拷贝构造函数和赋值运算符,确保单例语义。
1544
TriggerManger(const TriggerManger &) = delete;
1645
TriggerManger &operator=(const TriggerManger &) = delete;
17-
void SetLastTriggerStatus(const uint64_t &, const uint8_t &);
18-
bool GetLastTriggerStatus(TriggerDevice, uint64_t &);
46+
47+
/**
48+
* @brief 设置所有设备的最新触发状态。
49+
*
50+
* @param time 当前触发的时间戳。
51+
* @param status 状态掩码,每一位表示一个设备是否触发。
52+
*/
53+
void SetLastTriggerStatus(const uint64_t &time, const uint8_t &status);
54+
55+
/**
56+
* @brief 获取指定设备的最后一次触发状态及时间。
57+
*
58+
* @param dev 设备枚举。
59+
* @param time 返回该设备最后一次触发的时间戳。
60+
* @return true 如果该设备有有效的触发状态。
61+
* @return false 如果该设备无记录。
62+
*/
63+
bool GetLastTriggerStatus(TriggerDevice dev, uint64_t &time);
64+
1965
private:
66+
/**
67+
* @brief 从位掩码中获取对应设备的状态。
68+
*
69+
* @param data 状态字节。
70+
* @param index 目标设备在位掩码中的索引。
71+
* @return true 对应位置为1,表示已触发。
72+
* @return false 对应位置为0,表示未触发。
73+
*/
2074
static bool GetBool(const uint8_t data, const int index) { return (data >> index) & 1; }
75+
76+
/**
77+
* @brief 更新设备状态,并发布触发信息。
78+
*
79+
* @param dev 目标设备。
80+
* @param bit_index 设备对应的位掩码索引。
81+
* @param time 触发时间戳。
82+
*/
2183
void UpdateAndPublishDevice(TriggerDevice dev, int bit_index, uint64_t time);
84+
85+
/**
86+
* @brief 发布指定设备的状态信息。
87+
*
88+
* @param dev 目标设备。
89+
* @param time 触发时间戳。
90+
* @param status 当前触发状态。
91+
*/
2292
void PublishDeviceStatus(TriggerDevice dev, uint64_t time, bool status);
2393
TriggerManger();
2494
~TriggerManger() = default;
2595
uint8_t status_{0};
2696
std::mutex lock_{};
2797
std::map<TriggerDevice, std::tuple<bool, uint64_t>> status_map_{};
28-
std::map<TriggerDevice, std::string> device_topics_; // 设备-topic映射
98+
std::map<TriggerDevice, std::string> device_topics_;
2999
};
100+
30101
} // namespace infinite_sense

infinite_sense_core/src/cam.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "infinite_sense.h"
33
#include "MvCameraControl.h"
44
#include "log.h"
5-
5+
#include "trigger.h"
66
namespace infinite_sense {
77
bool IsColor(const MvGvspPixelType type) {
88
switch (type) {
@@ -190,7 +190,7 @@ void CamManger::Stop() {
190190
LOG(INFO) << "Exit " << i << " cam ";
191191
}
192192
}
193-
void CamManger::Receive(void *handle, const std::string &name) const {
193+
void CamManger::Receive(void *handle, const std::string &name) {
194194
unsigned int last_count = 0;
195195
MV_FRAME_OUT st_out_frame;
196196
CamData cam_data;
@@ -204,10 +204,18 @@ void CamManger::Receive(void *handle, const std::string &name) const {
204204
if (n_ret != MV_OK) {
205205
LOG(ERROR) << "Get ExposureTime fail! n_ret [0x" << std::hex << n_ret << "]";
206206
}
207-
// {
208-
// cam_data.time_stamp_us =
209-
// DataManger::GetInstance().GetLastTiggerTime() + static_cast<uint64_t>(expose_time.fCurValue / 2.);
210-
// }
207+
// 这里的time_stamp_us是相机触发时间,需要加上曝光时间的一半,以获得相机拍摄的时间
208+
if (params_.find(name) == params_.end()) {
209+
LOG(ERROR) << "cam " << name << " not found!";
210+
}
211+
else {
212+
if (uint64_t time; GET_LAST_TRIGGER_STATUS(params_[name], time)) {
213+
cam_data.time_stamp_us = time + static_cast<uint64_t>(expose_time.fCurValue / 2.);
214+
}
215+
else {
216+
LOG(ERROR) << "cam " << name << " not found!";
217+
}
218+
}
211219
MvGvspPixelType en_dst_pixel_type = PixelType_Gvsp_Undefined;
212220
unsigned int n_channel_num = 0;
213221
// 如果是彩色则转成RGB8

0 commit comments

Comments
 (0)