rosruby 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/bin/rubyroscore +5 -0
  2. data/lib/ros.rb +25 -0
  3. data/lib/ros/duration.rb +63 -0
  4. data/lib/ros/graph_manager.rb +408 -0
  5. data/lib/ros/log.rb +72 -0
  6. data/lib/ros/master.rb +408 -0
  7. data/lib/ros/master_proxy.rb +256 -0
  8. data/lib/ros/message.rb +65 -0
  9. data/lib/ros/name.rb +88 -0
  10. data/lib/ros/node.rb +442 -0
  11. data/lib/ros/package.rb +144 -0
  12. data/lib/ros/parameter_manager.rb +127 -0
  13. data/lib/ros/parameter_subscriber.rb +47 -0
  14. data/lib/ros/publisher.rb +96 -0
  15. data/lib/ros/rate.rb +41 -0
  16. data/lib/ros/ros.rb +10 -0
  17. data/lib/ros/roscore.rb +29 -0
  18. data/lib/ros/service.rb +37 -0
  19. data/lib/ros/service_client.rb +83 -0
  20. data/lib/ros/service_server.rb +92 -0
  21. data/lib/ros/slave_proxy.rb +153 -0
  22. data/lib/ros/subscriber.rb +119 -0
  23. data/lib/ros/tcpros/client.rb +108 -0
  24. data/lib/ros/tcpros/header.rb +89 -0
  25. data/lib/ros/tcpros/message.rb +74 -0
  26. data/lib/ros/tcpros/server.rb +137 -0
  27. data/lib/ros/tcpros/service_client.rb +104 -0
  28. data/lib/ros/tcpros/service_server.rb +132 -0
  29. data/lib/ros/time.rb +109 -0
  30. data/lib/ros/topic.rb +47 -0
  31. data/lib/ros/xmlrpcserver.rb +40 -0
  32. data/samples/add_two_ints_client.rb +25 -0
  33. data/samples/add_two_ints_server.rb +20 -0
  34. data/samples/gui.rb +126 -0
  35. data/samples/sample_log.rb +16 -0
  36. data/samples/sample_param.rb +20 -0
  37. data/samples/sample_publisher.rb +20 -0
  38. data/samples/sample_subscriber.rb +19 -0
  39. data/scripts/genmsg_ruby.py +1135 -0
  40. data/scripts/genmsg_ruby.pyc +0 -0
  41. data/scripts/gensrv_ruby.py +105 -0
  42. data/scripts/gensrv_ruby.pyc +0 -0
  43. data/scripts/rosruby_genmsg.py +67 -0
  44. data/scripts/run-test.rb +21 -0
  45. data/test/test_header.rb +36 -0
  46. data/test/test_log.rb +45 -0
  47. data/test/test_master_proxy.rb +73 -0
  48. data/test/test_message.rb +13 -0
  49. data/test/test_node.rb +166 -0
  50. data/test/test_package.rb +10 -0
  51. data/test/test_param.rb +27 -0
  52. data/test/test_pubsub.rb +154 -0
  53. data/test/test_rate.rb +16 -0
  54. data/test/test_service.rb +34 -0
  55. data/test/test_slave_proxy.rb +49 -0
  56. data/test/test_time.rb +39 -0
  57. metadata +170 -0
Binary file
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env python
2
+ # Software License Agreement (BSD License)
3
+ #
4
+ # Copyright (c) 2012, Takashi Ogura
5
+ #
6
+ # based on
7
+ #
8
+ # Copyright (c) 2008, Willow Garage, Inc.
9
+ # All rights reserved.
10
+ #
11
+ # Redistribution and use in source and binary forms, with or without
12
+ # modification, are permitted provided that the following conditions
13
+ # are met:
14
+ #
15
+ # * Redistributions of source code must retain the above copyright
16
+ # notice, this list of conditions and the following disclaimer.
17
+ # * Redistributions in binary form must reproduce the above
18
+ # copyright notice, this list of conditions and the following
19
+ # disclaimer in the documentation and/or other materials provided
20
+ # with the distribution.
21
+ # * Neither the name of Willow Garage, Inc. nor the names of its
22
+ # contributors may be used to endorse or promote products derived
23
+ # from this software without specific prior written permission.
24
+ #
25
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28
+ # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29
+ # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34
+ # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35
+ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36
+ # POSSIBILITY OF SUCH DAMAGE.
37
+ #
38
+ # Revision $Id:$
39
+
40
+
41
+ """
42
+ ROS message source code generation for rospy.
43
+
44
+ Converts ROS .srv files into Python source code implementations.
45
+ """
46
+ import roslib
47
+
48
+ import roslib.srvs
49
+
50
+ import genmsg_ruby
51
+
52
+ REQUEST ='Request'
53
+ RESPONSE='Response'
54
+
55
+ import sys
56
+ import os
57
+
58
+ def srv_generator(package, name, spec):
59
+ req, resp = ["%s%s"%(name, suff) for suff in [REQUEST, RESPONSE]]
60
+
61
+ fulltype = '%s%s%s'%(package, roslib.srvs.SEP, name)
62
+
63
+ gendeps_dict = roslib.gentools.get_dependencies(spec, package)
64
+ md5 = roslib.gentools.compute_md5(gendeps_dict)
65
+ yield "module %s\n"%package.capitalize()
66
+ yield "class %s\n"%name
67
+ yield """ def self.type
68
+ '%s'
69
+ end
70
+ """%fulltype
71
+ yield """ def self.md5sum
72
+ '%s'
73
+ end
74
+ """%md5
75
+ yield """ def self.request_class
76
+ %s
77
+ end
78
+ """%req
79
+ yield """ def self.response_class
80
+ %s
81
+ end
82
+ end
83
+ end"""%resp
84
+
85
+ def gen_srv(path, output_dir_prefix=None):
86
+ f = os.path.abspath(path)
87
+ (package_dir, package) = roslib.packages.get_dir_pkg(f)
88
+ (name, spec) = roslib.srvs.load_from_file(f, package)
89
+ base_name = roslib.names.resource_name_base(name)
90
+ if not output_dir_prefix:
91
+ output_dir_prefix = '%s/srv_gen/ruby'%package_dir
92
+ output_dir = '%s/%s'%(output_dir_prefix, package)
93
+ if not os.path.exists(output_dir):
94
+ os.makedirs(output_dir)
95
+ out = open('%s/%s.rb'%(output_dir, base_name), 'w')
96
+ for mspec, suffix in ((spec.request, REQUEST), (spec.response, RESPONSE)):
97
+ out.write(genmsg_ruby.msg_generator(package, base_name+suffix, mspec))
98
+ for l in srv_generator(package, base_name, spec):
99
+ out.write(l)
100
+ out.close()
101
+
102
+ if __name__ == "__main__":
103
+ for arg in sys.argv[1:]:
104
+ gen_srv(arg)
105
+
Binary file
@@ -0,0 +1,67 @@
1
+ #! /usr/bin/env python
2
+
3
+ # msg/srv generator for precompiled system
4
+ # It is useful if you are using precompiled ROS system,
5
+ # because it needs root access and there are ROS_NOBUILD file in the packages.
6
+ # This script generates *.rb files in the rosruby dir.
7
+
8
+ import genmsg_ruby
9
+ import gensrv_ruby
10
+ from roslib.packages import get_pkg_dir
11
+
12
+ # for electirc
13
+ try:
14
+ from roslib.packages import ROSPackages
15
+ def get_all_deps(packages):
16
+ rp = ROSPackages()
17
+ depends = rp.depends(packages)
18
+ all_deps = set()
19
+ for packs in depends.values():
20
+ for pack in packs:
21
+ all_deps.add(pack)
22
+ for pack in packages:
23
+ all_deps.add(pack)
24
+ return all_deps
25
+ # for fuerte
26
+ except ImportError:
27
+ from rospkg import RosPack
28
+ def get_all_deps(packages):
29
+ rp = RosPack()
30
+ all_deps = set()
31
+ for pack in packages:
32
+ depends = rp.get_depends(pack)
33
+ for dep in depends:
34
+ all_deps.add(dep)
35
+ for pack in packages:
36
+ all_deps.add(pack)
37
+ return all_deps
38
+ import sys
39
+ import os
40
+
41
+
42
+
43
+ if __name__ == "__main__":
44
+ if len(sys.argv) == 1:
45
+ packages = ['std_msgs', 'rosgraph_msgs', 'roscpp_tutorials']
46
+ else:
47
+ packages = sys.argv[1:]
48
+
49
+ for pack in get_all_deps(packages):
50
+ msg_dir = "%s/msg/"%get_pkg_dir(pack)
51
+ base_dir = os.environ.get("HOME") + "/.ros/rosruby"
52
+ msg_output_prefix = "%s/msg_gen/ruby"%base_dir
53
+ if os.path.exists(msg_dir):
54
+ for file in os.listdir(msg_dir):
55
+ base, ext = os.path.splitext(file)
56
+ if ext == '.msg':
57
+ print "generating " + file
58
+ genmsg_ruby.gen_msg(msg_dir+file, msg_output_prefix)
59
+
60
+ srv_dir = "%s/srv/"%get_pkg_dir(pack)
61
+ srv_output_prefix = "%s/srv_gen/ruby"%base_dir
62
+ if os.path.exists(srv_dir):
63
+ for file in os.listdir(srv_dir):
64
+ base, ext = os.path.splitext(file)
65
+ if ext == '.srv':
66
+ print "generating " + file
67
+ gensrv_ruby.gen_srv(srv_dir+file, srv_output_prefix)
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+
5
+ test_file = "test/test_*.rb"
6
+
7
+ $:.push("#{File.dirname(__FILE__)}/..")
8
+ $:.unshift(File.join(File.expand_path("."), "lib"))
9
+ $:.unshift(File.join(File.expand_path("."), "test"))
10
+
11
+ require 'rubygems'
12
+ gem 'simplecov', :require => false, :group => :test
13
+
14
+ require 'simplecov'
15
+ SimpleCov.start do
16
+ add_filter "/test/"
17
+ end
18
+
19
+ Dir.glob(test_file) do |file|
20
+ require file.sub(/\.rb$/, '')
21
+ end
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+ require 'ros/tcpros/header'
6
+
7
+ class TestParam_Normal < Test::Unit::TestCase
8
+ def test_serialize
9
+ header = ROS::TCPROS::Header.new
10
+ header['aa'] = '5'
11
+ assert_equal('5', header['aa'])
12
+ sio = StringIO.new
13
+ header.serialize(sio)
14
+ sio.rewind
15
+ data = sio.read
16
+ assert_equal("\b\000\000\000\004\000\000\000aa=5", data)
17
+
18
+ header2 = ROS::TCPROS::Header.new
19
+ assert_equal(header2, header2.deserialize("\b\000\000\000\004\000\000\000aa=5"[4..-1]))
20
+ assert_equal('5', header2['aa'])
21
+
22
+ header3 = ROS::TCPROS::Header.new
23
+ header3['hoge'] = '1'
24
+
25
+ # wild_card
26
+ assert(header3.valid?('hoge', '*'))
27
+ end
28
+
29
+ def test_check_string
30
+ header = ROS::TCPROS::Header.new
31
+ assert_raise(ArgumentError) { header['aa'] = 1}
32
+ assert_raise(ArgumentError) { header[5] = '1'}
33
+ assert_raise(ArgumentError) { header[:symbol] = '1'}
34
+ assert_raise(ArgumentError) { header[String] = '1'}
35
+ end
36
+ end
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ros'
4
+ require 'test/unit'
5
+
6
+ class TestLog < Test::Unit::TestCase
7
+ def test_output
8
+ node1 = ROS::Node.new('/test_log')
9
+ check_msg = nil
10
+ sub = node1.subscribe('/rosout', Rosgraph_msgs::Log) do |msg|
11
+ check_msg = msg
12
+ end
13
+ node1.loginfo('msg1')
14
+ sleep(0.5)
15
+ node1.spin_once
16
+ assert_equal('msg1', check_msg.msg)
17
+ assert_equal(Rosgraph_msgs::Log::INFO, check_msg.level)
18
+
19
+ node1.logerror('msg2')
20
+ sleep(0.1)
21
+ node1.spin_once
22
+ assert_equal('msg2', check_msg.msg)
23
+ assert_equal(Rosgraph_msgs::Log::ERROR, check_msg.level)
24
+
25
+ node1.logfatal('msg3')
26
+ sleep(0.1)
27
+ node1.spin_once
28
+ assert_equal('msg3', check_msg.msg)
29
+ assert_equal(Rosgraph_msgs::Log::FATAL, check_msg.level)
30
+
31
+ node1.logfatal('msg4')
32
+ sleep(0.1)
33
+ node1.spin_once
34
+ assert_equal('msg4', check_msg.msg)
35
+ assert_equal(Rosgraph_msgs::Log::FATAL, check_msg.level)
36
+
37
+ node1.logwarn('msg5')
38
+ sleep(0.1)
39
+ node1.spin_once
40
+ assert_equal('msg5', check_msg.msg)
41
+ assert_equal(Rosgraph_msgs::Log::WARN, check_msg.level)
42
+
43
+ node1.shutdown
44
+ end
45
+ end
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ros/master_proxy'
4
+ require 'test/unit'
5
+
6
+ class TestRegister < Test::Unit::TestCase
7
+ DUMMY_SERVICE_URI = 'rosrpc://dummy:1234'
8
+ DUMMY_SERVICE_NAME = '/dummy_service'
9
+
10
+ DUMMY_TOPIC_NAME = '/dummy_service'
11
+
12
+ def test_service
13
+ proxy = ROS::MasterProxy.new('/test_node', ENV['ROS_MASTER_URI'], 'http://dummy:11111')
14
+ proxy.register_service(DUMMY_SERVICE_NAME, DUMMY_SERVICE_URI)
15
+ uri = proxy.lookup_service(DUMMY_SERVICE_NAME)
16
+ assert_equal(DUMMY_SERVICE_URI, uri)
17
+ proxy.unregister_service(DUMMY_SERVICE_NAME, DUMMY_SERVICE_URI)
18
+ result = proxy.lookup_service(DUMMY_SERVICE_NAME)
19
+ assert(!result)
20
+ end
21
+
22
+ def test_subscriber
23
+ proxy = ROS::MasterProxy.new('/test_node2', ENV['ROS_MASTER_URI'], 'http://dummy:11111')
24
+ pub = proxy.register_subscriber('/rosout_agg', 'rosgraph_msgs/Log')
25
+ assert(pub.length > 0)
26
+ proxy.unregister_subscriber('/rosout_agg')
27
+ end
28
+
29
+ def test_publisher
30
+ proxy = ROS::MasterProxy.new('/test_node3', ENV['ROS_MASTER_URI'], 'http://dummy:11111')
31
+ sub = proxy.register_publisher('/rosout', 'rosgraph_msgs/Log')
32
+ assert(sub.length > 0)
33
+ num = proxy.unregister_publisher('/rosout')
34
+ assert_equal(1, num)
35
+ end
36
+
37
+ def test_param_subscriber
38
+ proxy = ROS::MasterProxy.new('/test_node4', ENV['ROS_MASTER_URI'], 'http://dummy:11111')
39
+ assert(proxy.subscribe_param('/rosversion'))
40
+ assert(proxy.unsubscribe_param('/rosversion'))
41
+ end
42
+ end
43
+
44
+
45
+ class TestSystem < Test::Unit::TestCase
46
+
47
+ def test_lookup
48
+ proxy = ROS::MasterProxy.new('/test_node', ENV['ROS_MASTER_URI'], 'http://dummy:11111')
49
+ uri = proxy.lookup_node('/rosout')
50
+ assert(/^http:.*:[0-9]+/ =~ uri)
51
+ assert(!proxy.lookup_node('/THIS_NODE_DOES_NOT_EXIST'))
52
+ assert(proxy.get_published_topics('').length > 0)
53
+ assert(proxy.get_published_topics('/NO_EXIST_NS').length == 0)
54
+ pub, sub, ser = proxy.get_system_state
55
+ assert_equal(1, pub.length)
56
+ assert_equal(1, sub.length)
57
+ # assert_equal(2, ser.length) # ruby logger has no service
58
+ assert(/^http:.*:11311/ =~ proxy.get_uri)
59
+ end
60
+
61
+ def test_accessor
62
+ proxy = ROS::MasterProxy.new('/test_node', ENV['ROS_MASTER_URI'], 'http://dummy:11111')
63
+ assert_equal(ENV['ROS_MASTER_URI'], proxy.master_uri)
64
+ assert_equal('http://dummy:11111', proxy.slave_uri)
65
+ proxy.slave_uri = 'http://dummy2:12345'
66
+ assert_equal('http://dummy2:12345', proxy.slave_uri)
67
+ proxy.master_uri = 'http://fail'
68
+ assert_equal('/test_node', proxy.caller_id)
69
+ proxy.caller_id = '/changed'
70
+ assert_equal('/changed', proxy.caller_id)
71
+ assert_raise(SocketError) {proxy.get_uri}
72
+ end
73
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ros/message'
4
+ require 'test/unit'
5
+
6
+ class TestMessage < Test::Unit::TestCase
7
+ def test_message
8
+ s = ROS::Struct.new('V')
9
+ packed = s.pack(4)
10
+ assert_equal("\004\000\000\000", packed)
11
+ assert_equal(4, s.unpack(packed)[0])
12
+ end
13
+ end
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ros'
4
+ require 'test/unit'
5
+
6
+ class TestNode < Test::Unit::TestCase
7
+ def test_up_down
8
+ node1 = ROS::Node.new('/test_up_down')
9
+ assert_equal('/test_up_down', node1.node_name)
10
+ assert(node1.ok?)
11
+ node1.shutdown
12
+ assert(!node1.ok?)
13
+ node2 = ROS::Node.new('/test2')
14
+ assert(node2.ok?)
15
+ node2.shutdown
16
+ assert(!node2.ok?)
17
+ end
18
+
19
+ def test_multi_up_down
20
+ node1 = ROS::Node.new('/test_multi_1')
21
+ node2 = ROS::Node.new('/test_multi_2')
22
+ assert(node1.ok?)
23
+ assert(node2.ok?)
24
+ node1.shutdown
25
+ node2.shutdown
26
+ assert(!node1.ok?)
27
+ assert(!node2.ok?)
28
+ end
29
+
30
+ def test_anonymous
31
+ node1 = ROS::Node.new('/test_anonymous1', :anonymous=>true)
32
+ assert_not_equal('/test_anonymous1', node1.node_name)
33
+ node2 = ROS::Node.new('/test_anonymous1', :anonymous=>true)
34
+ assert_not_equal('/test_anonymous1', node2.node_name)
35
+ sleep(0.5)
36
+ assert(node1.ok?)
37
+ assert(node2.ok?)
38
+ node1.shutdown
39
+ node2.shutdown
40
+ assert(!node1.ok?)
41
+ assert(!node2.ok?)
42
+ end
43
+
44
+ def test_not_anonymous
45
+ node1 = ROS::Node.new('/test_not_anonymous1')
46
+ node2 = ROS::Node.new('/test_not_anonymous1')
47
+ sleep(0.5)
48
+ assert(!node1.ok?) # killed by master
49
+ assert(node2.ok?)
50
+ node1.shutdown
51
+ node2.shutdown
52
+ assert(!node2.ok?)
53
+ end
54
+
55
+ def test_signal
56
+ node1 = ROS::Node.new('/test_signal1')
57
+ Process.kill("INT", Process.pid)
58
+ sleep(0.5)
59
+ assert(!node1.ok?)
60
+ end
61
+
62
+ def test_master_uri
63
+ node1 = ROS::Node.new('/test_master_uri1')
64
+ assert_equal(node1.master_uri, ENV['ROS_MASTER_URI'])
65
+
66
+ node1.shutdown
67
+ end
68
+
69
+ def test_ros_env
70
+ # check ROS_IP
71
+ ENV['ROS_IP']='127.0.0.1'
72
+ node1 = ROS::Node.new('/test_ros_env')
73
+ assert_equal('127.0.0.1', node1.host)
74
+ node1.shutdown
75
+ ENV.delete('ROS_IP')
76
+
77
+ # check ROS_HOSTNAME
78
+ ENV['ROS_HOSTNAME']='localhost'
79
+ node2 = ROS::Node.new('/test_ros_env2')
80
+ assert_equal('localhost', node2.host)
81
+ node2.shutdown
82
+
83
+ ENV['ROS_HOSTNAME']='127.0.0.1'
84
+ node2 = ROS::Node.new('/test_ros_env2')
85
+ assert_equal('127.0.0.1', node2.host)
86
+ node2.shutdown
87
+ ENV.delete('ROS_HOSTNAME')
88
+ end
89
+
90
+ def test_param_set_get
91
+ node = ROS::Node.new('hoge')
92
+ # integer
93
+ assert(node.set_param('/test1', 1))
94
+ assert_equal(1, node.get_param('/test1'))
95
+ # float
96
+ assert(node.set_param('/test_f', 0.1))
97
+ assert_equal(0.1, node.get_param('/test_f'))
98
+ assert(node.delete_param('/test_f'))
99
+ # list
100
+ assert(node.set_param('/test2', [1,2,3]))
101
+ assert_equal([1,2,3], node.get_param('/test2'))
102
+ # string
103
+ assert(node.set_param('/test_s', 'hoge'))
104
+ assert_equal('hoge', node.get_param('/test_s'))
105
+
106
+ # default param
107
+ assert_equal('hoge', node.get_param('/test_xxxx', 'hoge'))
108
+
109
+ # delete not exist
110
+ assert(!node.delete_param('/xxxxx'))
111
+
112
+ assert(node.has_param('/test_s'))
113
+ assert(node.delete_param('/test_s'))
114
+ assert(!node.has_param('/test_s'))
115
+
116
+ # clean
117
+ assert(node.delete_param('/test1'))
118
+ assert(node.delete_param('/test2'))
119
+
120
+ node.shutdown
121
+ end
122
+
123
+ def test_param_private
124
+ node = ROS::Node.new('/hoge')
125
+ node.set_param('/hoge/param1', 100)
126
+ assert_equal(100, node.get_param('~param1'))
127
+
128
+ node.set_param('~param2', 10)
129
+ assert_equal(10, node.get_param('/hoge/param2'))
130
+ assert(node.delete_param('~param2'))
131
+ node.shutdown
132
+ end
133
+
134
+ def test_fail
135
+ node = ROS::Node.new('hoge')
136
+ assert(!node.get_param('/test_no_exists'))
137
+ node.shutdown
138
+ end
139
+
140
+ def test_resolve_name
141
+ node = ROS::Node.new('hoge')
142
+
143
+ assert_equal('/aaa', node.resolve_name('aaa'))
144
+ assert_equal('/aaa/b/c', node.resolve_name('aaa/b////c'))
145
+ assert_equal('/hoge/private', node.resolve_name('~private'))
146
+ node.shutdown
147
+ end
148
+
149
+ def test_param_subscribe
150
+ node = ROS::Node.new('/test_param_sub')
151
+ called = false
152
+ subscriber = node.subscribe_parameter('/test_param1') do |param|
153
+ called = param
154
+ end
155
+ node.set_param('/test_param1', 1)
156
+ sleep(0.5)
157
+ assert_equal(1, called)
158
+ subscriber.shutdown
159
+ node.set_param('/test_param1', 2)
160
+ sleep(0.5)
161
+ assert_equal(1, called)
162
+ assert(node.delete_param('/test_param1'))
163
+
164
+ node.shutdown
165
+ end
166
+ end