質問編集履歴

3

文章の追加

2022/03/14 05:01

投稿

wave_vague
wave_vague

スコア21

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,8 @@
1
1
  下記サイトからフリーダウンロードできるライブラリをc#で使用したいと思っております。
2
2
  その際に、下記ライブラリは*.libしか作成されないため、*.dllを作成する必要があります。
3
3
  *.dllを作成するにあたり、提供されているライブラリがクラスになっているため、c++/CLIラッパを採用して作成しています。
4
+
5
+ Urg_driver.cppを直接ラッピングしたUrgDriver.cppを新規で作成しています。
4
6
 
5
7
  https://sourceforge.net/projects/urgnetwork/files/urg_library/urg_library_ja-1.2.5.zip/download
6
8
 

2

削除し忘れていた文章を削除

2022/03/14 05:00

投稿

wave_vague
wave_vague

スコア21

test CHANGED
File without changes
test CHANGED
@@ -3,10 +3,6 @@
3
3
  *.dllを作成するにあたり、提供されているライブラリがクラスになっているため、c++/CLIラッパを採用して作成しています。
4
4
 
5
5
  https://sourceforge.net/projects/urgnetwork/files/urg_library/urg_library_ja-1.2.5.zip/download
6
-
7
- ライブラリである\urg_library_ja-1.2.5\include\cpp\Urg_driver.hをUrgLib.h、
8
- \urg_library_ja-1.2.5\src\Urg_driver.cppをUrgLib.cpp
9
- として記述しました。
10
6
 
11
7
  ```UrgDriver.cpp
12
8
  #include "pch.h"

1

間にWrapperClassを挟むのをやめ、UrgDriverを直接ラッピングするようにしました

2022/03/14 04:58

投稿

wave_vague
wave_vague

スコア21

test CHANGED
File without changes
test CHANGED
@@ -8,40 +8,8 @@
8
8
  \urg_library_ja-1.2.5\src\Urg_driver.cppをUrgLib.cpp
9
9
  として記述しました。
10
10
 
11
- ```UrgLib.h(途中省略)
11
+ ```UrgDriver.cpp
12
- //------追記部分--------
13
- #ifdef URGLIB_EXPORTS
14
- #define URGLIB_API __declspec(dllexport)
15
- #else
16
- #define URGLIB_API __declspec(dllimport)
17
- #endif
18
- //---------------------
19
-
20
- #include <memory>
21
- #include <string>
22
-
23
- #include <vector>
24
- #include <cstddef>
25
- #include "Lidar.h"
26
-
27
- namespace qrk
28
- {
29
- class URGLIB_API UrgLib : public Lidar //classの後にURGLIB_APIを追記
30
- {
31
-
32
-    private:
33
- UrgLib(const UrgLib& rhs);
34
- UrgLib& operator = (const UrgLib& rhs);
35
-
36
- struct pImpl;
37
- std::auto_ptr<pImpl> pimpl;
38
- };
39
- }
40
- ```
41
-
42
- ```UrgLib.cpp(途中省略、追記した個所はなし)
43
12
  #include "pch.h"
44
- #include "UrgLib.h"
45
13
 
46
14
  #include "ticks.h"
47
15
  extern "C" {
@@ -52,139 +20,82 @@
52
20
  #include "urg_debug.h"
53
21
  }
54
22
 
23
+ #include "UrgDriver.h"
24
+ #include <string>
25
+ #include <vector>
26
+ #include <msclr\marshal.h>
27
+
28
+ using namespace msclr::interop;
55
29
  using namespace qrk;
30
+
56
- using namespace std;
31
+ namespace QRK
32
+ {
33
+ UrgDriver::UrgDriver(void)
34
+ {
35
+ urg_ = new urg_t;
36
+ urg_t_initialize(urg_);
37
+ }
38
+
39
+ UrgDriver::~UrgDriver(void)
40
+ {
41
+ Close();
42
+ }
43
+
44
+ bool UrgDriver::StartMeasurement(MeasurementType type,
45
+ int scan_times, int skip_scan)
46
+ {
47
+
48
+ typedef struct { //struct部分にてマネージドクラスのメンバー関数ではローカルクラス定義は使用できません
49
+ urg_measurement_type_t c_type;
50
+ MeasurementType type;
51
+ } type_table_t;
52
+
53
+
54
+ type_table_t type_table[] = {
55
+ { URG_DISTANCE, QRK::MeasurementType::Distance },
56
+ { URG_DISTANCE_INTENSITY, QRK::MeasurementType::Distance_intensity },
57
+ { URG_MULTIECHO, QRK::MeasurementType::Multiecho },
58
+ { URG_MULTIECHO_INTENSITY, QRK::MeasurementType::Multiecho_intensity },
59
+ };
60
+
61
+ size_t n = sizeof(type_table) / sizeof(type_table[0]);
62
+ for (size_t i = 0; i < n; ++i) {
63
+ const type_table_t* p = &type_table[i];
64
+ if (type == p->type) {
65
+ int ret = urg_start_measurement(urg_,
66
+ p->c_type, scan_times, skip_scan);
67
+ if (ret == URG_NO_ERROR) {
68
+ last_measure_type_ = type;
69
+ }
70
+ return (ret == URG_NO_ERROR) ? true : false;
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+
76
+ bool UrgDriver::GetDistanceIntensity(System::Collections::Generic::IList<int>^ data, System::Collections::Generic::IList<unsigned short>^ intensity, int% time_stamp)
77
+ {
78
+ if (last_measure_type_ != QRK::MeasurementType::Distance_intensity) {
79
+ urg_.last_errno = URG_MEASUREMENT_TYPE_MISMATCH;
80
+ return false;
81
+ }
82
+ // 最大サイズを確保し、そこにデータを格納する
83
+ size_t data_size = MaxDataSize();
84
+ data.resize(data_size); //①resize部分にて、class "System::Collections::Generic::IList<int>"にメンバー"resize"がありません
85
+ intensity.resize(data_size); //①と同じエラー
86
+ int ret = urg_get_distance_intensity(urg_,
87
+ &data[0], &intensity[0], (long*)time_stamp);//1. dataおよびintensity部分にて、式は左辺値または関数指定子である必要があります
88
+ if (ret > 0) {
89
+ data.resize(ret); //①と同じエラー
90
+ intensity.resize(ret);//①と同じエラー
91
+ adjust_time_stamp(time_stamp);
92
+ }
93
+ return (ret < 0) ? false : true;
94
+ }
95
+
96
+ }
57
97
 
58
98
  ```
59
- WrapperClass.hはUrgLib.hをラッピング、WrapperClass.cppはUrgLib.cppをラッピングして作成しています。
60
-
61
- ```WrapperClass.h(途中省略)
62
- #include "../UrgLib/UrgLib.h"
63
-
64
- #include <msclr/marshal_cppstd.h>
65
- #include <msclr/marshal.h>
66
-
67
- using namespace System;
68
- using namespace System::Runtime::InteropServices;
69
- using namespace System::Collections::Generic;
70
- using namespace msclr::interop;
71
-
72
-
73
- namespace Wrapper
74
- {
75
- public ref class WrapperClass
76
- {
77
-
78
- private:
79
- qrk::UrgLib* _urglib;
80
-
81
- public:
82
-
83
- WrapperClass();
84
- ~WrapperClass();
85
- !WrapperClass();
86
-
87
- enum class Default{
88
- Default_baudrate = 115200,
89
- Default_port = 10940,
90
- Infinity_times = -1,
91
- };
92
-
93
- };
94
- }
95
- ```
96
-
97
- その際、UrgLib.cppで記述されている
98
-
99
- ```UrgLib.cppで記述されているstruct
100
- struct UrgLib::pImpl
101
- {
102
- urg_t urg_;
103
- measurement_type_t last_measure_type_;
104
- long time_stamp_offset_;
105
-
106
- string product_type_;  //WrapperClass.cppではSystem::String^ product_type = msclr::interop::marshal_as<System::String^>(product_type_);と記述する予定。下のstringも同じように記述する予定
107
- string firmware_version_;
108
- string serial_id_;
109
- string status_;
110
- string state_;
111
-
112
-
113
- pImpl(void)
114
- :last_measure_type_(Distance), time_stamp_offset_(0)
115
- {
116
- urg_t_initialize(&urg_);
117
- }
118
-
119
-
120
- void adjust_time_stamp(long* time_stamp)
121
- {
122
- if (time_stamp) {
123
- *time_stamp += time_stamp_offset_;
124
- }
125
- }
126
- };
127
- ```
128
- をWrapperClass.cppに記述しようとしているのですが、構造がややこしく検索してもマーシャリングの方法が分からなかったため、お手数をおかけしますがご教示お願いいたします。
129
-
130
- urg_t urg_;のurg_tはUrgLib.cppでインクルードしているurg_sensor.hの中で記述されている構造体(下記)で、
131
- この構造体の中でもさらに別の構造体(urg_range_data_byte等)を定義しています。
132
- ※ここの部分がややこしくどのようにマーシャリングすればよいかが分かりませんでした。
133
-
134
- ```urg_sensor.h(途中省略)
135
-
136
- #include "urg_connection.h"
137
-
138
- typedef enum {
139
- URG_COMMUNICATION_3_BYTE, //!< Use 3-bytes encoding for distance
140
- URG_COMMUNICATION_2_BYTE, //!< Use 2-bytes encoding for distance
141
- } urg_range_data_byte_t;
142
-
143
- typedef struct
144
- {
145
- int is_active;
146
- int last_errno;
147
- urg_connection_t connection; //urg_connection.hにて定義されている構造体
148
- //中身は下記
149
-                   //typedef struct
150
-                   //{
151
-                  // urg_connection_type_t type;
152
-                  // urg_serial_t serial;
153
-                 // urg_tcpclient_t tcpclient;
154
-                   //} urg_connection_t;
155
-
156
- int first_data_index;
157
- int last_data_index;
158
- int front_data_index;
159
- int area_resolution;
160
- long scan_usec;
161
- int min_distance;
162
- int max_distance;
163
- int scanning_first_step;
164
- int scanning_last_step;
165
- int scanning_skip_step;
166
- int scanning_skip_scan;
167
- urg_range_data_byte_t range_data_byte;
168
-
169
- int timeout;
170
- int specified_scan_times;
171
- int scanning_remain_times;
172
- int is_laser_on;
173
-
174
- int received_first_index;
175
- int received_last_index;
176
- int received_skip_step;
177
- urg_range_data_byte_t received_range_data_byte;
178
- int is_sending;
179
-
180
- urg_error_handler error_handler;
181
-
182
- char return_buffer[80];
183
- } urg_t;
184
-
185
-
186
- ```
187
- また、この構造体をc#で使用するにはどのように使用すればよいかもご教示いただけると幸いです。
188
99
 
189
100
 
190
101