@@ -13,7 +13,9 @@ ROS 2 services provide a request-response communication pattern where clients se
1313
1414## Service Examples
1515
16- ### Service Server (` service/service-example.js ` )
16+ ### AddTwoInts Service
17+
18+ #### Service Server (` service/service-example.js ` )
1719
1820** Purpose** : Demonstrates creating a service server that adds two integers.
1921
@@ -27,9 +29,9 @@ ROS 2 services provide a request-response communication pattern where clients se
2729- ** Features** :
2830 - Service introspection (ROS 2 Iron+) for monitoring service calls
2931 - Proper response handling using ` response.template ` and ` response.send() `
30- - ** Run Command** : ` node service/service-example.js `
32+ - ** Run Command** : ` node example/services/ service/service-example.js `
3133
32- ### Service Client (` client/client-example.js ` )
34+ #### Service Client (` client/client-example.js ` )
3335
3436** Purpose** : Demonstrates creating a service client that sends requests to the AddTwoInts service.
3537
@@ -44,19 +46,57 @@ ROS 2 services provide a request-response communication pattern where clients se
4446 - Service availability checking with ` waitForService() `
4547 - Service introspection configuration (ROS 2 Iron+)
4648 - Asynchronous request handling with callbacks
47- - ** Run Command** : ` node client/client-example.js `
49+ - ** Run Command** : ` node example/services/client/client-example.js `
50+
51+ ### GetMap Service
52+
53+ #### Service Server (` service/getmap-service-example.js ` )
54+
55+ ** Purpose** : Demonstrates creating a service server that provides occupancy grid map data.
56+
57+ - ** Service Type** : ` nav_msgs/srv/GetMap `
58+ - ** Service Name** : ` get_map `
59+ - ** Functionality** :
60+ - Provides a sample 10x10 occupancy grid map
61+ - Returns map metadata including resolution, origin, and frame_id
62+ - Includes realistic map data with free space and obstacles
63+ - Updates timestamp on each request
64+ - ** Features** :
65+ - Complex message types (OccupancyGrid with nested structures)
66+ - Realistic navigation map data for robotics applications
67+ - Service introspection support (ROS 2 Iron+)
68+ - Detailed logging of map properties
69+ - ** Run Command** : ` node example/services/service/getmap-service-example.js `
70+
71+ #### Service Client (` client/getmap-client-example.js ` )
72+
73+ ** Purpose** : Demonstrates creating a service client that requests map data from the GetMap service.
74+
75+ - ** Service Type** : ` nav_msgs/srv/GetMap `
76+ - ** Service Name** : ` get_map `
77+ - ** Functionality** :
78+ - Sends empty request (GetMap requests have no parameters)
79+ - Receives and analyzes occupancy grid map data
80+ - Displays comprehensive map information and statistics
81+ - Shows ASCII visualization for small maps
82+ - ** Features** :
83+ - Handling complex ROS 2 message types (OccupancyGrid)
84+ - Map data analysis (cell distribution, metadata extraction)
85+ - Educational output showing map properties
86+ - Visual representation of map data
87+ - ** Run Command** : ` node example/services/client/getmap-client-example.js `
4888
4989## How to Run the Examples
5090
51- ### Running the Complete Service Example
91+ ### Running the AddTwoInts Service Example
5292
53931 . ** Prerequisites** : Ensure ROS 2 is installed and sourced
5494
55952 . ** Start the Service Server** : In one terminal, run:
5696
5797 ``` bash
58- cd example/services
59- node service/service-example.js
98+ cd /path/to/rclnodejs
99+ node example/services/ service/service-example.js
60100 ```
61101
62102 You should see:
@@ -68,8 +108,8 @@ ROS 2 services provide a request-response communication pattern where clients se
681083 . ** Start the Client** : In another terminal, run:
69109
70110 ``` bash
71- cd example/services
72- node client/client-example.js
111+ cd /path/to/rclnodejs
112+ node example/services/ client/client-example.js
73113 ```
74114
751154 . ** Expected Output** :
@@ -89,6 +129,88 @@ ROS 2 services provide a request-response communication pattern where clients se
89129 Result: object { sum: 79n }
90130 ```
91131
132+ ### Running the GetMap Service Example
133+
134+ 1 . ** Prerequisites** : Ensure ROS 2 is installed and sourced
135+
136+ 2 . ** Start the GetMap Service Server** : In one terminal, run:
137+
138+ ``` bash
139+ cd /path/to/rclnodejs
140+ node example/services/service/getmap-service-example.js
141+ ```
142+
143+ You should see:
144+
145+ ```
146+ Introspection configured
147+ GetMap service is ready. Waiting for requests...
148+ Service provides a 10x10 occupancy grid map
149+ ```
150+
151+ 3 . ** Start the GetMap Client** : In another terminal, run:
152+
153+ ``` bash
154+ cd /path/to/rclnodejs
155+ node example/services/client/getmap-client-example.js
156+ ```
157+
158+ 4 . ** Expected Output** :
159+
160+ ** Service Server Terminal** :
161+
162+ ```
163+ Incoming GetMap request: object {}
164+ Sending map with dimensions: 10 x 10
165+ Map resolution: 0.05 meters/pixel
166+ Number of occupied cells: 3
167+ Sending response: object Map data size: 100
168+ --
169+ ```
170+
171+ ** Client Terminal** :
172+
173+ ```
174+ GetMap service found. Requesting map...
175+ Sending: object {}
176+ Response received: object
177+ Map metadata:
178+ Frame ID: map
179+ Timestamp: 1756479378.889000000
180+ Resolution: 0.05000000074505806 meters/pixel
181+ Dimensions: 10x10
182+ Origin position: x: -2.5 y: -2.5 z: 0
183+ Map data size: 100 cells
184+ Cell distribution:
185+ Free cells (0): 97
186+ Occupied cells (100): 3
187+ Unknown cells (-1): 0
188+
189+ ASCII Map Representation:
190+ . = free space, # = occupied, ? = unknown
191+ ..........
192+ ..........
193+ ..#.......
194+ ...#......
195+ ....#.....
196+ ..........
197+ ..........
198+ ..........
199+ ..........
200+ ..........
201+ ```
202+
203+ ### Quick Test Script
204+
205+ For convenience, you can test the GetMap examples using the provided test script from the project root:
206+
207+ ``` bash
208+ cd /path/to/rclnodejs
209+ ./test_getmap_examples.sh
210+ ```
211+
212+ This script automatically starts the service, tests the client, and cleans up.
213+
92214### Single Run vs Continuous Operation
93215
94216- ** Client** : Runs once, sends a request, receives response, then shuts down
@@ -101,32 +223,58 @@ ROS 2 services provide a request-response communication pattern where clients se
101223- ** Request-Response** : Synchronous communication where clients wait for responses
102224- ** Service Discovery** : Clients check if services are available before sending requests
103225- ** Error Handling** : Proper handling of service unavailability
226+ - ** Empty Requests** : Services like GetMap that don't require input parameters
227+ - ** Complex Responses** : Handling nested message structures like OccupancyGrid
104228
105229### ROS 2 Service Features
106230
107231- ** BigInt Support** : Using JavaScript BigInt for ROS 2 integer types
108232- ** Service Introspection** : Monitoring service calls and events (ROS 2 Iron+)
109233- ** Quality of Service** : Configurable QoS profiles for reliable communication
234+ - ** Complex Message Types** : Working with navigation messages (nav_msgs)
235+ - ** Nested Structures** : Handling messages with headers, metadata, and arrays
110236
111237### Programming Patterns
112238
113239- ** Async/Await** : Modern JavaScript patterns for asynchronous operations
114240- ** Callback Handling** : Response processing using callback functions
115241- ** Resource Management** : Proper node shutdown and cleanup
242+ - ** Data Analysis** : Processing and interpreting received data
243+ - ** Visualization** : Converting data to human-readable formats
244+
245+ ### Robotics Applications
246+
247+ - ** Navigation** : Map data retrieval for path planning and localization
248+ - ** Occupancy Grids** : Understanding spatial data representation
249+ - ** Coordinate Systems** : Working with map origins, resolutions, and frames
250+ - ** Sensor Data** : Processing grid-based sensor information
116251
117252## Service Introspection (ROS 2 Iron+)
118253
119- Both examples include service introspection capabilities for ROS 2 distributions newer than Humble:
254+ All examples include service introspection capabilities for ROS 2 distributions newer than Humble:
255+
256+ ### AddTwoInts Service
120257
121258- ** Service Server** : Configured with ` CONTENTS ` introspection to log full request/response data
122259- ** Client** : Configured with ` METADATA ` introspection to log service call metadata
123260
124- To monitor service events, use :
261+ To monitor AddTwoInts service events:
125262
126263``` bash
127264ros2 topic echo " /add_two_ints/_service_event"
128265```
129266
267+ ### GetMap Service
268+
269+ - ** Service Server** : Configured with ` CONTENTS ` introspection to log full request/response data
270+ - ** Client** : Configured with ` METADATA ` introspection to log service call metadata
271+
272+ To monitor GetMap service events:
273+
274+ ``` bash
275+ ros2 topic echo " /get_map/_service_event"
276+ ```
277+
130278## Message Types and Data Handling
131279
132280### AddTwoInts Service Definition
@@ -140,12 +288,44 @@ int64 b
140288int64 sum
141289```
142290
143- ### JavaScript Implementation Details
291+ ** JavaScript Implementation Details** :
144292
145293- ** BigInt Usage** : ROS 2 ` int64 ` maps to JavaScript ` BigInt ` type
146294- ** Response Template** : Use ` response.template ` to get the proper response structure
147295- ** Response Sending** : Call ` response.send(result) ` to send the response back
148296
297+ ### GetMap Service Definition
298+
299+ ```
300+ # Request
301+ # Empty - no parameters needed
302+ ---
303+ # Response
304+ nav_msgs/OccupancyGrid map
305+ ```
306+
307+ ** OccupancyGrid Structure** :
308+
309+ ```
310+ std_msgs/Header header
311+ builtin_interfaces/Time stamp
312+ string frame_id
313+ MapMetaData info
314+ builtin_interfaces/Time map_load_time
315+ float32 resolution
316+ uint32 width
317+ uint32 height
318+ geometry_msgs/Pose origin
319+ int8[] data
320+ ```
321+
322+ ** JavaScript Implementation Details** :
323+
324+ - ** Empty Requests** : GetMap requests are empty objects ` {} `
325+ - ** Complex Responses** : OccupancyGrid contains nested headers, metadata, and data arrays
326+ - ** Map Data** : Array of int8 values (0=free, 100=occupied, -1=unknown)
327+ - ** Coordinate Systems** : Origin defines the real-world position of the map's (0,0) cell
328+
149329## Troubleshooting
150330
151331### Common Issues
0 commit comments