rosruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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