Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions moveit_commander/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ catkin_package()

install(PROGRAMS bin/${PROJECT_NAME}_cmdline.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

add_subdirectory(test)
4 changes: 2 additions & 2 deletions moveit_commander/src/moveit_commander/move_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ class MoveGroupCommander(object):
Execution of simple commands for a particular group
"""

def __init__(self, name, robot_description="robot_description"):
def __init__(self, name, robot_description="robot_description", ns=""):
""" Specify the group name for which to construct this commander instance. Throws an exception if there is an initialization error. """
self._g = _moveit_move_group_interface.MoveGroupInterface(name, robot_description)
self._g = _moveit_move_group_interface.MoveGroupInterface(name, robot_description, ns)

def get_name(self):
""" Get the name of the group this instance was initialized for """
Expand Down
7 changes: 4 additions & 3 deletions moveit_commander/src/moveit_commander/robot.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,10 @@ def pose(self):
"""
return conversions.list_to_pose_stamped(self._robot._r.get_link_pose(self._name), self._robot.get_planning_frame())

def __init__(self, robot_description="robot_description"):
def __init__(self, robot_description="robot_description", ns=""):
self._robot_description = robot_description
self._r = _moveit_robot_interface.RobotInterface(robot_description)
self._ns = ns
self._r = _moveit_robot_interface.RobotInterface(robot_description, ns)
self._groups = {}
self._joint_owner_groups = {}

Expand Down Expand Up @@ -236,7 +237,7 @@ def get_group(self, name):
if not self._groups.has_key(name):
if not self.has_group(name):
raise MoveItCommanderException("There is no group named %s" % name)
self._groups[name] = MoveGroupCommander(name, self._robot_description)
self._groups[name] = MoveGroupCommander(name, self._robot_description, self._ns)
return self._groups[name]

def has_group(self, name):
Expand Down
15 changes: 15 additions & 0 deletions moveit_commander/test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
if (CATKIN_ENABLE_TESTING)
find_package(moveit_resources)
find_package(rostest)

add_rostest(python_moveit_commander.test)
add_rostest(python_moveit_commander_ns.test)
endif()

install(PROGRAMS python_moveit_commander.py
python_moveit_commander_ns.py
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/test)

install(FILES python_moveit_commander.test
python_moveit_commander_ns.test
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/test)
102 changes: 102 additions & 0 deletions moveit_commander/test/python_moveit_commander.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#!/usr/bin/env python

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add standard BSD license with your name and short description

# Software License Agreement (BSD License)
#
# Copyright (c) 2012, Willow Garage, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of Willow Garage, Inc. nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Author: William Baker

import unittest
import numpy as np
import rospy
import rostest
import os

from moveit_commander import RobotCommander


class PythonMoveitCommanderTest(unittest.TestCase):
PLANNING_GROUP = "manipulator"

@classmethod
def setUpClass(self):
self.commander = RobotCommander("robot_description")
self.group = self.commander.get_group(self.PLANNING_GROUP)

@classmethod
def tearDown(self):
pass

def check_target_setting(self, expect, *args):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rename something like test__group__set_joint_value_target to make it easier to for future devs to understand what this test does

if len(args) == 0:
args = [expect]
self.group.set_joint_value_target(*args)
res = self.group.get_joint_value_target()
self.assertTrue(np.all(np.asarray(res) == np.asarray(expect)),
"Setting failed for %s, values: %s" % (type(args[0]), res))

def test_target_setting(self):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I understand this test but it took me a few minutes to parse what you are doing here. You are testing all the different ways to assign joint values correct? Changing test_target_setting to something like test__group__set_joint_value_target__methods will go a long way helping future devs debug issues if these tests ever break

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've just copy and pasta'd the tests from here:
https://github.com/ros-planning/moveit/blob/kinetic-devel/moveit_ros/planning_interface/test/python_move_group.py
to test basic functionality.. its definitely more duplicated testing than intended.

n = self.group.get_variable_count()
self.check_target_setting([0.1] * n)
self.check_target_setting((0.2,) * n)
self.check_target_setting(np.zeros(n))
self.check_target_setting([0.3] * n, {name: 0.3 for name in self.group.get_active_joints()})
self.check_target_setting([0.5] + [0.3]*(n-1), "joint_1", 0.5)

def plan(self, target):
self.group.set_joint_value_target(target)
return self.group.plan()

def test_validation(self):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rename something like test__group__execute_path_validation to make it easier to understand what this test does

current = np.asarray(self.group.get_current_joint_values())

plan1 = self.plan(current + 0.2)
plan2 = self.plan(current + 0.2)

# first plan should execute
self.assertTrue(self.group.execute(plan1))

# second plan should be invalid now (due to modified start point) and rejected
self.assertFalse(self.group.execute(plan2))

# newly planned trajectory should execute again
plan3 = self.plan(current)
self.assertTrue(self.group.execute(plan3))


if __name__ == '__main__':
PKGNAME = 'moveit_ros_planning_interface'
NODENAME = 'moveit_test_python_moveit_commander'
rospy.init_node(NODENAME)
rostest.rosrun(PKGNAME, NODENAME, PythonMoveitCommanderTest)

# suppress cleanup segfault
os._exit(0)
5 changes: 5 additions & 0 deletions moveit_commander/test/python_moveit_commander.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<launch>
<include file="$(find moveit_resources)/fanuc_moveit_config/launch/test_environment.launch"/>
<test pkg="moveit_commander" type="python_moveit_commander.py" test-name="python_moveit_commander"
time-limit="300" args=""/>
</launch>
106 changes: 106 additions & 0 deletions moveit_commander/test/python_moveit_commander_ns.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
#!/usr/bin/env python

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add standard BSD license with your name and short description

# Software License Agreement (BSD License)
#
# Copyright (c) 2012, Willow Garage, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of Willow Garage, Inc. nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Author: William Baker
#
# This test is used to ensure planning with a RobotCommander is
# possbile if the robot's move_group node is in a different namespace

import unittest
import numpy as np
import rospy
import rostest
import os

from moveit_commander import RobotCommander


class PythonMoveitCommanderNsTest(unittest.TestCase):
PLANNING_GROUP = "manipulator"
PLANNING_NS = "test_ns/"

@classmethod
def setUpClass(self):
self.commander = RobotCommander("%srobot_description"%self.PLANNING_NS, self.PLANNING_NS)
self.group = self.commander.get_group(self.PLANNING_GROUP)

@classmethod
def tearDown(self):
pass

def check_target_setting(self, expect, *args):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rename something like test__group__set_joint_value_target to make it easier to understand what this test does

if len(args) == 0:
args = [expect]
self.group.set_joint_value_target(*args)
res = self.group.get_joint_value_target()
self.assertTrue(np.all(np.asarray(res) == np.asarray(expect)),
"Setting failed for %s, values: %s" % (type(args[0]), res))

def test_target_setting(self):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rename something like test__group__set_joint_value_target__methods to make it easier to understand what this test does

n = self.group.get_variable_count()
self.check_target_setting([0.1] * n)
self.check_target_setting((0.2,) * n)
self.check_target_setting(np.zeros(n))
self.check_target_setting([0.3] * n, {name: 0.3 for name in self.group.get_active_joints()})
self.check_target_setting([0.5] + [0.3]*(n-1), "joint_1", 0.5)

def plan(self, target):
self.group.set_joint_value_target(target)
return self.group.plan()

def test_validation(self):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above

current = np.asarray(self.group.get_current_joint_values())

plan1 = self.plan(current + 0.2)
plan2 = self.plan(current + 0.2)

# first plan should execute
self.assertTrue(self.group.execute(plan1))

# second plan should be invalid now (due to modified start point) and rejected
self.assertFalse(self.group.execute(plan2))

# newly planned trajectory should execute again
plan3 = self.plan(current)
self.assertTrue(self.group.execute(plan3))


if __name__ == '__main__':
PKGNAME = 'moveit_ros_planning_interface'
NODENAME = 'moveit_test_python_moveit_commander_ns'
rospy.init_node(NODENAME)
rostest.rosrun(PKGNAME, NODENAME, PythonMoveitCommanderNsTest)

# suppress cleanup segfault
os._exit(0)
5 changes: 5 additions & 0 deletions moveit_commander/test/python_moveit_commander_ns.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<launch>
<include ns="test_ns" file="$(find moveit_resources)/fanuc_moveit_config/launch/test_environment.launch"/>
<test pkg="moveit_commander" type="python_moveit_commander_ns.py" test-name="python_moveit_commander_ns"
time-limit="300" args=""/>
</launch>
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@

<!-- We do not have a robot connected, so publish fake joint states -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
<param name="/use_gui" value="$(arg use_gui)"/>
<rosparam param="/source_list">[/move_group/fake_controller_joint_states]</rosparam>
<param name="use_gui" value="$(arg use_gui)"/>
<rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
</node>

<!-- Given the published joint states, publish tf for the robot links -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

<!-- We do not have a robot connected, so publish fake joint states -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
<param name="/use_gui" value="false"/>
<rosparam param="/source_list">[/move_group/fake_controller_joint_states]</rosparam>
<param name="use_gui" value="false"/>
<rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam>
</node>

<!-- Given the published joint states, publish tf for the robot links -->
Expand Down
Loading