mocap_node.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022, Mocap Nokov Company., Lika.Ji
3  * Copyright (c) 2018, Houston Mechatronics Inc., JD Yamokoski
4  * Copyright (c) 2012, Clearpath Robotics, Inc., Alex Bencz
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the copyright holder nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 // Local includes
34 #include <mocap_nokov/MocapNokovConfig.h>
35 #include <mocap_nokov/data_model.h>
37 // STL includes
38 #include <mutex>
39 // Ros includes
40 #include <ros/ros.h>
41 #include <dynamic_reconfigure/server.h>
42 // SDK includes
43 #include <SeekerSDKClient.h>
44 
45 namespace mocap_nokov
46 {
47  std::mutex mtx;
49 
50  void DataHandler(sFrameOfMocapData* pFrameOfData, void* pUserData)
51  {
52  if (nullptr == pFrameOfData)
53  return;
54 
55  // Store the frame
56  std::lock_guard<std::mutex> lck (mtx);
57 
58  int nmaker = (pFrameOfData->nOtherMarkers < MAX_MARKERS)?pFrameOfData->nOtherMarkers:MAX_MARKERS;
59 
60  frameObjData.frameNumber = pFrameOfData->iFrame;
61  frameObjData.dataFrame.markerSets.resize(pFrameOfData->nMarkerSets);
62  frameObjData.dataFrame.rigidBodies.resize(pFrameOfData->nRigidBodies);
63  frameObjData.dataFrame.otherMarkers.resize(pFrameOfData->nOtherMarkers);
64  frameObjData.dataFrame.latency = pFrameOfData->fLatency;
65 
66  for(int i = 0; i< nmaker; ++i)
67  {
68  frameObjData.dataFrame.otherMarkers.push_back(
69  Marker{pFrameOfData->OtherMarkers[i][0] * 0.001f,
70  pFrameOfData->OtherMarkers[i][1] * 0.001f,
71  pFrameOfData->OtherMarkers[i][2] * 0.001f}
72  );
73  }
74 
75  for(int i = 0; i< pFrameOfData->nRigidBodies; ++i)
76  {
77  RigidBody body;
78  body.bodyId = pFrameOfData->RigidBodies[i].ID;
79  body.isTrackingValid = true;
80  body.pose.position = {pFrameOfData->RigidBodies[i].x * 0.001f,
81  pFrameOfData->RigidBodies[i].y * 0.001f,
82  pFrameOfData->RigidBodies[i].z * 0.001f};
83 
84  body.pose.orientation = {pFrameOfData->RigidBodies[i].qx,
85  pFrameOfData->RigidBodies[i].qy,
86  pFrameOfData->RigidBodies[i].qz,
87  pFrameOfData->RigidBodies[i].qw};
88 
89  frameObjData.dataFrame.rigidBodies.push_back(body);
90  }
91  }
92 
94  {
95  static DataModel frame;
96  {
97  std::lock_guard<std::mutex> lck (mtx);
98  frame = frameObjData;
99  }
100  return frame;
101  }
102 
104  {
105  public:
108  ServerDescription const& serverDescr,
109  PublisherConfigurations const& pubConfigs) :
110  nh(nh),
111  server(ros::NodeHandle("~/nokov_config")),
112  serverDescription(serverDescr),
113  publisherConfigurations(pubConfigs)
114  {
115  server.setCallback(boost::bind(&NokovRosBridge::reconfigureCallback, this, _1, _2));
116  }
117 
118  void reconfigureCallback(MocapNokovConfig& config, uint32_t)
119  {
120  serverDescription.IpAddress = config.server_address;
121 
122  initialize();
123  }
124 
125  void initialize()
126  {
127  // Create client
128  sdkClientPtr.reset(new SeekerSDKClient());
129  sdkClientPtr->SetDataCallback(DataHandler);
130 
131  unsigned char sdkVersion[4] = {0};
132  sdkClientPtr->SeekerSDKVersion(sdkVersion);
133  Version ver((int)sdkVersion[0], (int)sdkVersion[1], (int)sdkVersion[2], (int)sdkVersion[3]);
134  ROS_INFO("Load SDK Ver:%s", (char*)ver.getVersionString().c_str());
135 
136  while(ros::ok() && sdkClientPtr->Initialize((char*)serverDescription.IpAddress.c_str()))
137  {
138  ROS_WARN("Connecting to server again");
139  ros::Duration(2.).sleep();
140  }
141 
142  // Once we have the server info, create publishers
143  publishDispatcherPtr.reset(
146 
147  ROS_INFO("Initialization complete");
148 
149  initialized = true;
150  };
151 
152  void run()
153  {
154  while (ros::ok())
155  {
156  if (initialized)
157  {
158  static int preIFrame = 0;
159 
160  const auto frame = GetCurrentFrame();
161 
162  if (frame.frameNumber != preIFrame)
163  {
164  preIFrame = frame.frameNumber ;
165 
166  const ros::Time time = ros::Time::now();
167 
168  publishDispatcherPtr->publish(time, frame.dataFrame.rigidBodies);
169  }
170 
171  usleep(100);
172  }
173  else
174  {
175  ros::Duration(1.).sleep();
176  }
177  ros::spinOnce();
178  }
179  }
180 
181  private:
186  std::unique_ptr<RigidBodyPublishDispatcher> publishDispatcherPtr;
187  std::unique_ptr<SeekerSDKClient> sdkClientPtr;
188  dynamic_reconfigure::Server<MocapNokovConfig> server;
189  };
190 
191 } // namespace
192 
193 
195 int main( int argc, char* argv[] )
196 {
197  // Initialize ROS nh
198  ros::init(argc, argv, "mocap_nh");
199  ros::NodeHandle nh("~");
200 
201  // Grab nh configuration from rosparam
204  mocap_nokov::NodeConfiguration::fromRosParam(nh, serverDescription, publisherConfigurations);
205 
206  // Create nh object, initialize and run
207  mocap_nokov::NokovRosBridge nb(nh, serverDescription, publisherConfigurations);
208  nb.initialize();
209  nb.run();
210 
211  return 0;
212 }
MarkerData * OtherMarkers
std::unique_ptr< RigidBodyPublishDispatcher > publishDispatcherPtr
Definition: mocap_node.cpp:186
std::vector< PublisherConfiguration > PublisherConfigurations
Definition: mocap_config.h:72
dynamic_reconfigure::Server< MocapNokovConfig > server
Definition: mocap_node.cpp:188
std::string const & getVersionString() const
Definition: version.cpp:69
std::vector< RigidBody > rigidBodies
Definition: data_model.h:104
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
#define MAX_MARKERS
Server communication info.
Definition: mocap_config.h:43
void DataHandler(sFrameOfMocapData *pFrameOfData, void *pUserData)
Definition: mocap_node.cpp:50
DataModel frameObjData
Definition: mocap_node.cpp:48
Version class containing the version information and helpers for comparison.
Definition: version.h:39
Dispatches RigidBody data to the correct publisher.
#define ROS_WARN(...)
const DataModel & GetCurrentFrame()
Definition: mocap_node.cpp:93
sRigidBodyData RigidBodies[MAX_RIGIDBODIES]
PublisherConfigurations publisherConfigurations
Definition: mocap_node.cpp:185
std::mutex mtx
Definition: mocap_node.cpp:47
#define ROS_INFO(...)
std::vector< Marker > otherMarkers
Definition: data_model.h:103
ROSCPP_DECL bool ok()
int main(int argc, char *argv[])
Definition: mocap_node.cpp:195
The data model for this node.
Definition: data_model.h:109
Data object holding information about a single rigid body within a mocap skeleton.
Definition: data_model.h:66
Data object holding the position of a single mocap marker in 3d space.
Definition: data_model.h:43
static void fromRosParam(ros::NodeHandle &nh, ServerDescription &serverDescription, PublisherConfigurations &pubConfigs)
std::unique_ptr< SeekerSDKClient > sdkClientPtr
Definition: mocap_node.cpp:187
NokovRosBridge(ros::NodeHandle &nh, ServerDescription const &serverDescr, PublisherConfigurations const &pubConfigs)
Definition: mocap_node.cpp:106
static Time now()
std::vector< MarkerSet > markerSets
Definition: data_model.h:102
ServerDescription serverDescription
Definition: mocap_node.cpp:184
bool sleep() const
ROSCPP_DECL void spinOnce()
void reconfigureCallback(MocapNokovConfig &config, uint32_t)
Definition: mocap_node.cpp:118


mocap_nokov
Author(s):
autogenerated on Sat Sep 10 2022 02:45:32