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.
- data/bin/rubyroscore +5 -0
- data/lib/ros.rb +25 -0
- data/lib/ros/duration.rb +63 -0
- data/lib/ros/graph_manager.rb +408 -0
- data/lib/ros/log.rb +72 -0
- data/lib/ros/master.rb +408 -0
- data/lib/ros/master_proxy.rb +256 -0
- data/lib/ros/message.rb +65 -0
- data/lib/ros/name.rb +88 -0
- data/lib/ros/node.rb +442 -0
- data/lib/ros/package.rb +144 -0
- data/lib/ros/parameter_manager.rb +127 -0
- data/lib/ros/parameter_subscriber.rb +47 -0
- data/lib/ros/publisher.rb +96 -0
- data/lib/ros/rate.rb +41 -0
- data/lib/ros/ros.rb +10 -0
- data/lib/ros/roscore.rb +29 -0
- data/lib/ros/service.rb +37 -0
- data/lib/ros/service_client.rb +83 -0
- data/lib/ros/service_server.rb +92 -0
- data/lib/ros/slave_proxy.rb +153 -0
- data/lib/ros/subscriber.rb +119 -0
- data/lib/ros/tcpros/client.rb +108 -0
- data/lib/ros/tcpros/header.rb +89 -0
- data/lib/ros/tcpros/message.rb +74 -0
- data/lib/ros/tcpros/server.rb +137 -0
- data/lib/ros/tcpros/service_client.rb +104 -0
- data/lib/ros/tcpros/service_server.rb +132 -0
- data/lib/ros/time.rb +109 -0
- data/lib/ros/topic.rb +47 -0
- data/lib/ros/xmlrpcserver.rb +40 -0
- data/samples/add_two_ints_client.rb +25 -0
- data/samples/add_two_ints_server.rb +20 -0
- data/samples/gui.rb +126 -0
- data/samples/sample_log.rb +16 -0
- data/samples/sample_param.rb +20 -0
- data/samples/sample_publisher.rb +20 -0
- data/samples/sample_subscriber.rb +19 -0
- data/scripts/genmsg_ruby.py +1135 -0
- data/scripts/genmsg_ruby.pyc +0 -0
- data/scripts/gensrv_ruby.py +105 -0
- data/scripts/gensrv_ruby.pyc +0 -0
- data/scripts/rosruby_genmsg.py +67 -0
- data/scripts/run-test.rb +21 -0
- data/test/test_header.rb +36 -0
- data/test/test_log.rb +45 -0
- data/test/test_master_proxy.rb +73 -0
- data/test/test_message.rb +13 -0
- data/test/test_node.rb +166 -0
- data/test/test_package.rb +10 -0
- data/test/test_param.rb +27 -0
- data/test/test_pubsub.rb +154 -0
- data/test/test_rate.rb +16 -0
- data/test/test_service.rb +34 -0
- data/test/test_slave_proxy.rb +49 -0
- data/test/test_time.rb +39 -0
- 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)
|
data/scripts/run-test.rb
ADDED
@@ -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
|
data/test/test_header.rb
ADDED
@@ -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
|
data/test/test_log.rb
ADDED
@@ -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
|
data/test/test_node.rb
ADDED
@@ -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
|