Skip to content

Commit cbbce49

Browse files
committed
- explicitly requested on-the-fly message and service definitions now
trump definitions from gennodejs. This puts the choice closer to runtime and also is required right now until the md5sum for services is fixed in gennodejs. - Some fixes in action client - Some fixes to on-the-fly message definitions to resemble gennodejs-generated classes - Broke some long lines
1 parent 736f8fc commit cbbce49

File tree

4 files changed

+115
-87
lines changed

4 files changed

+115
-87
lines changed

example_turtle.js

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
'use strict';
22

33
let rosnodejs = require('./index.js');
4+
const ActionClient = require('./lib/ActionClient.js');
45

56
rosnodejs.initNode('/my_node', {
67
messages: [
78
'rosgraph_msgs/Log', // required for new logging approach
89
'turtlesim/Pose',
910
'turtle_actionlib/ShapeActionGoal',
10-
'geometry_msgs/Twist'
11+
'turtle_actionlib/ShapeActionFeedback',
12+
'turtle_actionlib/ShapeActionResult',
13+
'geometry_msgs/Twist',
14+
'actionlib_msgs/GoalStatusArray',
15+
'actionlib_msgs/GoalID'
1116
],
1217
services: ['std_srvs/SetBool', "turtlesim/TeleportRelative"]
1318
}).then((rosNode) => {
1419

20+
// console.log(new (rosnodejs.require('rosgraph_msgs').msg.Log)());
21+
22+
1523
// ---------------------------------------------------------
1624
// Service Call
1725

@@ -56,24 +64,23 @@ rosnodejs.initNode('/my_node', {
5664
latching: true,
5765
throttleMs: 9
5866
});
59-
cmd_vel.on('registered', function() {
60-
console.log("registered");
61-
const Twist = rosnodejs.require('geometry_msgs').msg.Twist;
62-
const msgTwist = new Twist();
63-
msgTwist.linear = new (rosnodejs.require('geometry_msgs').msg.Vector3)();
64-
msgTwist.linear.x = 1;
65-
msgTwist.linear.y = 0;
66-
msgTwist.linear.z = 0;
67-
msgTwist.angular = new (rosnodejs.require('geometry_msgs').msg.Vector3)();
68-
msgTwist.angular.x = 0;
69-
msgTwist.angular.y = 0;
70-
msgTwist.angular.z = 0;
71-
console.log("Twist", msgTwist);
72-
cmd_vel.publish(msgTwist);
73-
});
74-
cmd_vel.on('connection', function(s) {
75-
console.log("connected", s);
76-
});
67+
68+
const Twist = rosnodejs.require('geometry_msgs').msg.Twist;
69+
const msgTwist = new Twist();
70+
msgTwist.linear = new (rosnodejs.require('geometry_msgs').msg.Vector3)();
71+
msgTwist.linear.x = 1;
72+
msgTwist.linear.y = 0;
73+
msgTwist.linear.z = 0;
74+
msgTwist.angular = new (rosnodejs.require('geometry_msgs').msg.Vector3)();
75+
msgTwist.angular.x = 0;
76+
msgTwist.angular.y = 0;
77+
msgTwist.angular.z = 0;
78+
// console.log("Twist", msgTwist);
79+
cmd_vel.publish(msgTwist);
80+
81+
// cmd_vel.on('connection', function(s) {
82+
// console.log("connected", s);
83+
// });
7784

7885

7986
// ---------------------------------------------------------
@@ -89,10 +96,10 @@ rosnodejs.initNode('/my_node', {
8996
});
9097

9198
let shapeActionGoal = rosnodejs.require('turtle_actionlib').msg.ShapeActionGoal;
92-
console.log("shapeMsgGoal", shapeActionGoal);
93-
let now = Date.now();
94-
let secs = parseInt(now/1000);
95-
let nsecs = (now % 1000) * 1000;
99+
// console.log("shapeMsgGoal", shapeActionGoal);
100+
var now = Date.now();
101+
var secs = parseInt(now/1000);
102+
var nsecs = (now % 1000) * 1000;
96103
let shapeMsg = new shapeActionGoal({
97104
header: {
98105
seq: 0,
@@ -109,9 +116,25 @@ rosnodejs.initNode('/my_node', {
109116
}
110117
});
111118

112-
console.log("shapeMsg", shapeMsg);
119+
// console.log("shapeMsg", shapeMsg);
113120
pub_action.publish(shapeMsg);
114121

122+
123+
// ---- Same with ActionClient:
124+
// console.log("start");
125+
// let ac = new ActionClient({
126+
// type: "turtle_actionlib/ShapeAction",
127+
// actionServer: "turtle_shape"
128+
// });
129+
// // console.log(ac);
130+
// // ac.sendGoal(new shapeActionGoal({
131+
// // goal: {
132+
// // edges: 5,
133+
// // radius: 1
134+
// // }
135+
// // }));
136+
// ac.sendGoal(shapeMsg);
137+
115138
console.log("\n** done\n");
116139

117140

lib/ActionClient.js

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,37 +23,40 @@ let EventEmitter = require('events');
2323

2424
class ActionClient extends EventEmitter {
2525
constructor(options) {
26+
super();
27+
2628
this._actionType = options.type;
2729

2830
this._actionServer = options.actionServer;
2931

3032
const nh = rosnodejs.nh;
31-
33+
3234
// FIXME: support user options for these parameters
33-
this._goalPub = nh.advertise(this._actionServer + '/goal', this._actionType + 'Goal',
34-
{ queueSize: 1 });
35+
this._goalPub = nh.advertise(this._actionServer + '/goal',
36+
this._actionType + 'Goal',
37+
{ queueSize: 1 });
3538

36-
this._cancelPub = nh.advertise(this._actionServer + '/cancel', 'actionlib_msgs/GoalID',
37-
{ queueSize: 1 });
39+
this._cancelPub = nh.advertise(this._actionServer + '/cancel',
40+
'actionlib_msgs/GoalID',
41+
{ queueSize: 1 });
3842

39-
this._statusSub = nh.subscribe(this._actionServer + '/status', 'actionlib_msgs/GoalStatusArray',
40-
(msg) => { this._handleStatus(msg); },
41-
{ queueSize: 1 }
42-
);
43+
this._statusSub = nh.subscribe(this._actionServer + '/status',
44+
'actionlib_msgs/GoalStatusArray',
45+
(msg) => { this._handleStatus(msg); },
46+
{ queueSize: 1 } );
4347

44-
this._feedbackSub = nh.subscribe(this._actionServer + '/feedback', this._actionType + 'Feedback',
45-
(msg) => { this._handleFeedback(msg); },
46-
{ queueSize: 1 }
47-
);
48+
this._feedbackSub = nh.subscribe(this._actionServer + '/feedback',
49+
this._actionType + 'Feedback',
50+
(msg) => { this._handleFeedback(msg); },
51+
{ queueSize: 1 } );
4852

49-
this._statusSub = nh.subscribe(this._actionServer + '/result', this._actionType + 'Result',
50-
(msg) => { this._handleResult(msg); },
51-
{ queueSize: 1 }
52-
);
53+
this._statusSub = nh.subscribe(this._actionServer + '/result',
54+
this._actionType + 'Result',
55+
(msg) => { this._handleResult(msg); },
56+
{ queueSize: 1 } );
5357

5458
this._goals = {};
5559
this._goalCallbacks = {};
56-
5760
this._goalSeqNum = 0;
5861
}
5962

@@ -99,8 +102,10 @@ class ActionClient extends EventEmitter {
99102
_generateGoalId() {
100103
let id = this._actionType + '.';
101104
id += 'xxxxxxxx'.replace(/[x]/g, function(c) {
102-
return = (Math.random()*16).toString(16);
105+
return (Math.random()*16).toString(16);
103106
});
104107
return id;
105108
}
106109
};
110+
111+
module.exports = ActionClient;

utils/message_utils.js

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ let MessageUtils = {
141141
while ((matchData = finderCallRegex.exec(fileData)) !== null) {
142142
const matchStr = matchData[0];
143143
const msgPackage = matchData[1];
144-
const replaceStr = utils.format('let %s = require(\'../../%s/_index.js\');', msgPackage, msgPackage);
144+
const replaceStr =
145+
utils.format('let %s = require(\'../../%s/_index.js\');',
146+
msgPackage, msgPackage);
145147
fileData = fileData.replace(matchStr, replaceStr);
146148
}
147149
return fileData;
@@ -179,7 +181,8 @@ let MessageUtils = {
179181
flatten_local(packageName, dir, 'msg', messageDirectory);
180182
flatten_local(packageName, dir, 'srv', messageDirectory);
181183
// copy the index
182-
copyFile(messagePackagePath, path.join(messageDirectory, packageName, '_index.js'));
184+
copyFile(messagePackagePath,
185+
path.join(messageDirectory, packageName, '_index.js'));
183186
});
184187
},
185188

@@ -201,41 +204,42 @@ let MessageUtils = {
201204
},
202205

203206
getHandlerForMsgType(rosDataType) {
204-
let parts = rosDataType.split('/');
205-
let msgPackage = parts[0];
206-
let messagePackage = this.getPackage(msgPackage);
207-
if (messagePackage) {
208-
let type = parts[1];
209-
return messagePackage.msg[type];
207+
let type = messages.getFromRegistry(rosDataType, ["msg"]);
208+
if (type) {
209+
return new type();
210210
} else {
211-
let type = messages.getFromRegistry(rosDataType, ["msg"]);
212-
if (type) {
213-
return new type();
211+
let parts = rosDataType.split('/');
212+
let msgPackage = parts[0];
213+
let messagePackage = this.getPackage(msgPackage);
214+
if (messagePackage) {
215+
let type = parts[1];
216+
return messagePackage.msg[type];
214217
} else {
215218
throw new Error('Unable to find message package ' + msgPackage);
216219
}
217220
}
218221
},
219222

220223
getHandlerForSrvType(rosDataType) {
221-
let parts = rosDataType.split('/');
222-
let msgPackage = parts[0];
223-
let messagePackage = this.getPackage(msgPackage);
224-
if (messagePackage) {
225-
let type = parts[1];
226-
return messagePackage.srv[type];
224+
let request =
225+
messages.getFromRegistry(rosDataType, ["srv", "Request"]);
226+
let response =
227+
messages.getFromRegistry(rosDataType, ["srv", "Response"]);
228+
if (request && response) {
229+
return {
230+
Request: request,
231+
Response: response
232+
};
227233
} else {
228-
let request =
229-
messages.getFromRegistry(rosDataType, ["srv", "Request"]);
230-
let response =
231-
messages.getFromRegistry(rosDataType, ["srv", "Response"]);
232-
if (request && response) {
233-
return {
234-
Request: request,
235-
Response: response
236-
};
234+
let parts = rosDataType.split('/');
235+
let msgPackage = parts[0];
236+
let messagePackage = this.getPackage(msgPackage);
237+
if (messagePackage) {
238+
let type = parts[1];
239+
return messagePackage.srv[type];
237240
} else {
238-
throw new Error('Unable to find service package ' + msgPackage + '. Request: ' + !!request + ', Response: ' + !!response);
241+
throw new Error('Unable to find service package ' + msgPackage
242+
+ '. Request: ' + !!request + ', Response: ' + !!response);
239243
}
240244
}
241245
}

utils/messages.js

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,9 @@ function buildValidator (details) {
433433
* use with ROS, incl. serialization, deserialization, and md5sum. */
434434
function buildMessageClass(details) {
435435
function Message(values) {
436+
// console.log("buildMessageClass, new", details, values);
436437
if (!(this instanceof Message)) {
437-
return new Message(init);
438+
return new Message(values);
438439
}
439440

440441
var that = this;
@@ -444,23 +445,17 @@ function buildMessageClass(details) {
444445
that[field.name] = field.value || null;
445446
});
446447
}
447-
if (details.fields) {
448-
details.fields.forEach(function(field) {
449-
that[field.name] = field.value || null;
450-
});
451-
}
452448

453-
if (values) {
454-
Object.keys(values).forEach(function(name) {
455-
var type = details.fields.find(function(field) {
456-
return field.name == name;
457-
});
458-
console.log("Message", name, type);
459-
if (type.messageType) {
460-
console.log("Message", name, type.messageType);
461-
that[name] = new (type.messageType)(values[name]);
449+
if (details.fields) {
450+
details.fields.forEach(function(field) {
451+
// console.log("buildMessageClass", details, field, values);
452+
if (field.messageType) {
453+
// sub-message class
454+
that[field.name] =
455+
new (field.messageType)(values ? values[field.name] : undefined);
462456
} else {
463-
that[name] = values[name];
457+
// simple value
458+
that[field.name] = values ? values[field.name] : (field.value || null);
464459
}
465460
});
466461
}
@@ -473,7 +468,8 @@ function buildMessageClass(details) {
473468
Message.md5sum = Message.prototype.md5sum = function() {
474469
return this.md5;
475470
};
476-
Message.constants = Message.prototype.constants = details.constants;
471+
Message.Constants = Message.constants
472+
= Message.prototype.constants = details.constants;
477473
Message.fields = Message.prototype.fields = details.fields;
478474
Message.serialize = Message.prototype.serialize =
479475
function(obj, bufferInfo) {

0 commit comments

Comments
 (0)