Design and Implementation
Design and Implementation
Design and Implementation
net/publication/220062534
CITATIONS READS
13 897
3 authors, including:
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Vilas Kumar Chitrakaran on 19 May 2015.
Corresponding Author:
Markus Loffler
Department of Electrical and Computer Engineering
Clemson University
Clemson, SC 29634
Phone: (864) 656-7218
Fax: (864) 656-7220
E-Mail: loffler@ces.clemson.edu
Abstract
The diversity of robotic research areas along with the complex requirements of hardware and
software for robotic systems have always presented a challenge for system developers. Many
past robot control platforms were complex, expensive, and not very user friendly. Even though
several of the previous platforms were designed to provide an open architecture system, very few
of the previous platforms have been reused. To address previous disadvantages, this paper
describes the design and implementation of the Robotic Platform, an object-oriented development
platform for robotic applications. The Robotic Platform includes hardware interfacing, servo
control, trajectory generation, 3D simulation, a graphical user interface, and a math library. As
opposed to distributed solutions, the Robotic Platform implements all these components in a
homogenous architecture that utilizes a single hardware platform (a standard PC), a single
programming language (C++), and a single operating system (the QNX Real-Time Platform) while
guaranteeing deterministic real-time performance. This design leads to an open architecture that
is less complex, easier to use, and easier to extend. Particularly, the area of multiple cooperating
robots benefits from this kind of architecture, since the Robotic Platform achieves a high
integration of its components and provides a simple and flexible means of communication. The
architecture of the Robotic Platform builds on the following state-of-the-art technologies and
general purpose components to further increase simplicity and reliability: i) PC technology, ii) the
QNX Real-Time Platform, iii) the Open Inventor library, iv) object-oriented design, and v) the
QMotor control environment.
Keywords:
Robot Control, PC, Real-Time, Object-Oriented, QNX
Design and Implementation of the Robotic Platform
Abstract
The diversity of robotic research areas along with the complex requirements of hardware and software for
robotic systems have always presented a challenge for system developers. Many past robot control
platforms were complex, expensive, and not very user friendly. Even though several of the previous
platforms were designed to provide an open architecture system, very few of the previous platforms have
been reused. To address previous disadvantages, this paper describes the design and implementation of
the Robotic Platform, an object-oriented development platform for robotic applications. The Robotic Platform
includes hardware interfacing, servo control, trajectory generation, 3D simulation, a graphical user interface,
and a math library. As opposed to distributed solutions, the Robotic Platform implements all these
components in a homogenous architecture that utilizes a single hardware platform (a standard PC), a single
programming language (C++), and a single operating system (the QNX Real-Time Platform) while
guaranteeing deterministic real-time performance. This design leads to an open architecture that is less
complex, easier to use, and easier to extend. Particularly, the area of multiple cooperating robots benefits
from this kind of architecture, since the Robotic Platform achieves a high integration of its components and
provides a simple and flexible means of communication. The architecture of the Robotic Platform builds on
the following state-of-the-art technologies and general purpose components to further increase simplicity
and reliability: i) PC technology, ii) the QNX Real-Time Platform, iii) the Open Inventor library, iv) object-
oriented design, and v) the QMotor control environment.
1 Introduction
Robot control systems are very demanding with regard to software and hardware performance
because their building blocks cover a wide range of disciplines found in robotics and software
development (see Figure 1). Hence, it is desirable to create a common generic platform that can
be reused by researchers for different applications. Considering the variety of robotic applications
and research areas, this is a challenging task. Due to the lack of flexibility and performance of
proprietary vendor-supplied robot control languages, previous research focused on building robot
control libraries on top of a commonly used programming language (e.g., “C”) that was executed
on a Unix workstation. RCCL [1] and ARCL [2] are examples of such libraries. Even though a new
level of flexibility and performance was achieved by using a common programming language,
many robot control platforms developed in the 80’s and early 90’s were inherently complex due to
the limitations of software packages and hardware components of that time. That is, most
operating systems did not support real-time programming (fostering projects like RCI [3] and
Chimera [4]). In addition, procedural programming languages like “C” tend to reach their limits
with regard to reusability for complex projects; furthermore, the limited performance of hardware
components forced system developers to utilize distributed architectures that integrated a mix of
proprietary hardware and software.
Over the last ten years, many innovations in the computing area have occurred. Specifically, the
advent of object-oriented software design [5] facilitated the management of more complex
projects while also fostering code reuse and flexibility. For example, the robot control libraries
RIPE [6], MMROC+ [7], OSCAR [8], and ZERO++ [9] utilized object-oriented techniques in robot
programming. We have also witnessed the proliferation of real-time Unix-like operating systems
for the PC [10], which facilitate the replacement of proprietary hardware components for real-time
control [11]. In the hardware sector, we have witnessed the advent of high-speed low-cost PCs,
fast 3D graphics video boards, and inexpensive motion control cards. Consequently, the PC
platform now provides versatile functionality, and hence, makes complex software architectures
and proprietary hardware components superfluous in most cases. The QMotor Robotic Toolkit
3
(QMotor RTK) [12], for example, integrates real-time manipulator control and the graphical user
interface (GUI) all on a single PC platform.
Hardware-Accelerated
Graphical User Interface Programming Interface
3D Computer Graphics
Despite the extensive functionality of the PC platform, much of the research in robot control
software utilizes distributed and inhomogeneous architectures [6][8][9]. Besides the obvious
advantages of distributed systems (e.g., greater extensibility and more computational power),
there are several disadvantages. Specifically, a distributed architecture requires a sophisticated
communication framework, which increases the complexity of the software significantly.
Additionally, deterministic real-time communication over network connections often requires
expensive proprietary software and hardware. Specifically, the integration of multiple cooperating
robots presents a challenge to distributed architectures. For example, it is often desired to modify
the trajectory of one manipulator depending on certain signals of a cooperating manipulator (e.g.,
the feedback of a force/torque sensor). In a distributed architecture, an additional effort must be
spent on passing these signals between the components. Passing these signals and
guaranteeing the required deadlines might even be impossible, depending on the flexibility of the
system’s components and the communication infrastructure.
Generally, the overall hardware cost of distributed systems is higher and users have to familiarize
themselves with different hardware architectures and operating systems. Even though many
platforms developed in the last couple of years attempted to be flexible, reconfigurable, and open,
these platforms are seldom used and extended. Apparently, engineers consider it faster and
easier to develop their applications from scratch. Indeed, from our own experience, the learning
curve of installing, learning, and modifying robot control platforms of the past is steep.
Given the above remarks, the Robotic Platform is the first platform that has been designed to
integrate servo control loops, trajectory generation, task level programs, GUI programs, and 3D
simulation in a homogeneous software architecture. That is, only one hardware platform (the PC),
only one operating system (the QNX Real-Time Platform [10]), and only one programming
language (C++ [13]) are used. This type of architecture has the following advantages:
Simplicity. A homogeneous non-distributed architecture is much smaller and simpler than a
distributed inhomogeneous architecture. It is easier to configure, easier to understand, and easier
to extend. Simplicity is critical with regard to motivating code reuse of the platform for different
applications.
Flexibility at all Levels. All components of the platform are open for extensions and
modifications. Many past platforms have utilized an open architecture at some levels, but other
levels had been implemented on proprietary hardware such that they could not be modified.
High Integration. Since all components run on the same platform, a high integration is achieved,
which allows for a simpler and more efficient cooperation between components. That is,
communication between the components has little overhead and is often implemented by just a
function call. Also, GUI components and 3D simulation are integrated with functional components.
4
2 Powerful Tools And Technologies – The Basis for the Robotic
Platform
To reduce development effort and complexity, the Robotic Platform is based on general-purpose
tools and technologies.
PC Technology. While in the past only expensive UNIX workstations provided the processing
power necessary to control robotic systems, the PC has caught up or even exceeded the
performance of workstations [11]. Compared to UNIX workstations, a PC based system allows for
a greater variety of hardware and software components. Additionally, these components and the
PC itself are usually cheaper than their UNIX counterparts.
The QNX Real-Time Platform. The QNX Real-Time Platform (RTP) by QSSL [10] consists of the
QNX6/Neutrino operating system and additional components for development and multimedia.
QNX6 is an advanced real-time operating system that provides a modern microkernel-based
architecture, a POSIX compliant programming interface, self-hosted development, 3D graphics
capabilities and an easy device driver architecture. The RTP is also very cost-effective as it is
free for non-commercial use and runs on low-cost standard PCs.
Object-Oriented Programming in C++. With regard to developing robot control software, object-
oriented programming has several benefits over procedural programming. First, it provides
language constructs that allow for a much easier programming interface. For example, a matrix
multiplication can be expressed by a simple “*”, similar to MATLAB programming. Second,
object-oriented programming allows for a system architecture that is very flexible but yet simple.
That is, the components (classes) of the system can have a built-in default behavior and default
settings. The programmer can utilize this default behavior to reduce the code size or override it
for specific applications. Finally, object-oriented programming supports generic programming,
which facilitates the development of components that are independent from a specific
implementation (e.g., a generic class “Manipulator” that works with different manipulator
types). All of the above benefits are based on the general concepts of object-oriented
programming: i) abstraction, ii) encapsulation, iii) polymorphism, and iv) inheritance [5, 12]. The
language of choice is C++, as it provides the whole spectrum of object-oriented concepts while
maintaining high performance [13].
Open Inventor. Open Inventor [14], developed by Silicon Graphics, is an object-oriented C++
library for creating and animating 3D graphics. Open Inventor minimizes development effort, as it
is able to load 3D models that are created in the Virtual Reality Modeling Language (VRML)
format. A variety of software packages are available that facilitate the construction of 3D VRML
models that represent robotic components. The Robotic Platform also utilizes the functionality of
Open Inventor to animate these components.
The QMotor System. Implementation of control strategies requires the capability to establish a
deterministic real-time control loop, to log data, to tune control parameters, and to plot signals.
For this purpose, the graphical control environment QMotor [15] is used for the Robotic Platform.
5
the system. To extend the system, the user creates new classes. Usually, new classes will be
derived from one of the already existing classes to minimize coding effort. The classes of the
Robotic Platform include GUI components and a 3D model for graphical simulation. These types
of components were traditionally found in separate programs (e.g., see the RCCL robot simulator
[1]). However, by including them in the same class, we can achieve a tight integration of the user
interface, 3D modeling, and other functional parts. Additionally, object-oriented concepts for
system extensions can also be used for GUI components and 3D modeling.
To illustrate how classes are derived from each other, class hierarchy diagrams are used. The
main class hierarchy diagram of the Robotic Platform is shown in Figure 2. Each arrow is drawn
from the derived class (the more specific class) to the parent class (the more generic class). The
classes of the Robotic Platform can be separated into the following categories:
Core Classes. The classes RoboticObject, FunctionalObject, and PhysicalObject
build the basis of all robotic objects. The classes RoboticPlatform and ObjectManager
contain functionality for overall management of robot control programs.
Generic Robotic Classes. Derived from the core classes are a number of generic robotic
classes. These classes cannot be instantiated. Rather, these classes serve as base classes that
implement common functionality while also presenting a generic interface to the programmer (i.e.,
these classes can be used to create programs that are independent from the specific hardware or
the specific algorithm).
Specific Robotic Classes. Derived from the generic robotic classes are classes that implement
a specific piece of hardware (e.g., the class Puma560 implements the Puma 560 robot) or a
specific functional component (e.g., the class DefaultPositionControl implements a
proportional integral derivative (PID) position control).
The ControlProgram Class. This class is part of the QMotor system. All Classes that require a
real-time control loop are derived from the ControlProgram class.
Queue
Trajectory
Trajectory DefaultTrajectoryGenerator
Generator
Generator
FunctionalObject
ServoControl DefaultPositionControl
Puma560
Default
Manipulator
RoboticObject Manipulator BarrettBase
WAM BarrettArm
PhysicalObject
OnOffTool
ObjectManager
BarrettHand
Gripper
DefaultGripper
QMotor
ControlProgram ToolChanger DefaultToolChanger
6
In addition to the classes shown in Figure 2, the Robotic Platform provides the classes of the
math library, the manipulator model classes, and several utility classes. These classes and their
class hierarchy will be described later in this paper.
In a robot control program, the user instantiates objects from classes. When instantiating an
object, memory for the object is reserved, and the object initializes itself. The user can create as
many objects as desired from the same class. For example, it is straightforward to operate two
Puma robots by simply creating two objects of the class Puma560. As soon as objects are
created, the user can employ their functionality. The object manager maintains a list of all
currently existing objects. With the object manager, it is possible to initiate functionality on
multiple objects (e.g., to shutdown all objects). The Scene Viewer is the default GUI of the
Robotic Platform. It contains windows to view the 3D scene of the robotic work cell and a list of all
objects. The overall run-time architecture is shown in Figure 3.
In a robotic system, different components are related to each other. To reflect this fact, object
relationships are established between objects. For example, objects can specify their physical
connection to each other. Object relationships are implemented by C++ pointers to the related
object. The object relationships in an example scenario are shown in Figure 4.
User
Robot
Control
Program
7
the shutdown of the object. To summarize, the following generic functionality is defined in the
class RoboticObject (see also Figure 5):
Error Handling. Every object must indicate its error status.
Interactive Commands. Each object can define a set of interactive commands (e.g., “Open
Gripper”) that the user can select in the object pop-up menu of the Scene Viewer.
Configuration Management. Each object can use the global configuration file to set itself up.
Shutdown Behavior. Each object is able to shutdown itself.
GUI Control Panel. Each object is able to create a control panel.
Message Handler. Each object has a message handler that can interpret custom messages.
Thread Management. Each object indicates if additional threads are required for its operation
and provides functions that execute those additional threads.
Note that the actual functionality is usually implemented in the derived class. However, the class
RoboticObject also implements simple default functionality. This feature supports code reuse
and simplicity by giving all classes derived from the class RoboticObject the choice to either
take over this default functionality and/or implement new functionality.
The class PhysicalObject is derived from the class RoboticObject. It is the base class for
all classes that represent physical objects (e.g., manipulators, sensors, grippers, etc.). It defines a
generic interface for these classes as illustrated in Figure 6. Specifically, the following generic
functionality is defined in PhysicalObject:
3D Visualization. Every physical object can create its Open Inventor 3D model. The Scene
Viewer loops through all physical objects to create the entire 3D scene.
Object Connections. A physical object can specify another object as a mounting location. By
using this object relationship, the Scene Viewer draws objects at the right location (e.g., the
gripper being mounted on the end-effector of the manipulator).
Position and Orientation. The position and orientation specify the absolute location of the object
in the scene (or the mounting location, if an object connection is specified).
Simulation Mode. Every physical object can be locked into simulation mode. That is, the object
does not perform any hardware I/O, instead, its behavior is simulated.
8
The class FunctionalObject currently does not contain any functionality. It is only added as a
symmetric counterpart to the class PhysicalObject. Functional robotic classes like the class
TrajectoryGenerator are derived from the class FunctionalObject.
ManipulatorModel Kinematics
Jacobian
Dynamics
PumaModel BarrettArmModel WAMModel Configurations
9
that are connected to the manipulator object. Figure 8 illustrates this relationship in an example
scenario.
Figure 8. Object Setup for the Servo Control and the Trajectory Generation of a Manipulator
[leader]
class Puma560
qmotorConfig leader.cfg
[secondrobot]
class WAM
position 300 0 0
simulationMode on
display solid
[gripper]
class BarrettHand
port /dev/ser1
10
Name of Setting Description Equivalent Member Functions
class <className>
Specifies the class name of -
the object
qmotorConfig Specifies a specific QMotor -
<configFileName> configuration file.
position <x,y,z> Specifies the position and PhysicalObject::setTransform()
orientation <r,p,y> orientation of the object
simulationMode on If “on” is specified, use PhysicalObject::setSimulationModeOn()
simulationMode off simulation mode for this object PhysicalObject::setSimulationModeOff()
display off Specifies if and how the object PhysicalObject::setDisplayOff()
display solid is displayed in the Scene PhysicalObject::setDisplaySolid()
display wireframe Viewer PhysicalObject::setDisplayWireframe()
manipulator = om.createDerivedObject<Manipulator>(“leader”);
// Creates either a Puma or a WAM object, depending on
// what is specified in the global configuration file under the name “leader”
The above code first calls the function createDerivedObject() to create an object of the
classes Puma560, BarrettArm, or WAM. Then, it operates this object via a pointer to the generic
base class (i.e., Manipulator *). In order to create the desired object, the
createDerivedObject() function looks for the object name in the global configuration file
(see Figure 9). Then, it reads the class name of the object from the configuration file and creates
11
1
an object of this class . Hence, to switch to a different manipulator type, only the class name in
the global configuration file has to be changed when using a generic program.
Puma560
BarrettArm
Default
Manipulator BarrettBase
Manipulator
WAM
IMI
Figure 10. The Generic Class Manipulator and its Derived Classes
User program
create new
thread
Initialize the
Robotic Platform
create new
thread
Create a new
Scene Viewer
manipulator
1
To be able to create an object dynamically from its name, the framework of the Robotic Platform
creates a type database, which contains list of all classes defined in the robot control program.
12
Since threads access the same global address space, this address space can be used for
communication between the threads. However, it is important to synchronize the access to avoid
corruption of data structures. To allow for synchronized communication between the threads,
message passing (as provided by the classes Client and Server) and standard thread
synchronization mechanisms are used (as implemented in the classes Barrier and
ReaderWriterLock).
13
To utilize QMotor for the Robotic Platform, classes that require a real-time control loop (e.g., the
class DefaultManipulator) are derived from the class ControlProgram. Hence, these
classes inherit the functionality of a control program (i.e., real-time execution, data logging, and
communication with the QMotor GUI). If a class is derived from the class ControlProgram, the
base class RoboticObject automatically creates a new thread of execution that runs the
control loop in the background.
HighpassFilter<T>
Matrix<rows, columns, T>
Integrator<T>
Differentiator<T>
ColumnVector<size, T> RowVector<size, T> Transform
The math library also provides the classes LowpassFilter and HighpassFilter for numeric
filtering, and the classes Differentiator and Integrator for numeric differentiation and
integration. These classes are parameterized with the data type ( i.e., they work with scalars,
vectors, and matrices). The class MathExeception is utilized to detect error conditions in the
math library.
14
Matrix Functions Vector Functions Transformation Functions
Multiplication/division Length (2-norm) Translation matrix
Addition/difference Cross-product Rotation matrix about x, y, or z axis
Transpose Dot-product Rotation matrix about an arbitrary
Getting/setting elements Element-by-element vector
Unit/Zero matrix
Input/output from/to streams
3.11 Documentation
Critical for a high acceptance and a frequent reuse of a library is extensive documentation. The
Robotic Platform has been developed by first creating manuals of all components and then using
these manuals as requirement documents to guide the implementation. Documentation includes
tutorials, external documentation and inline documentation. Example programs are frequently
added, as they are essential for quick understanding of functionality. Doxygen [17] is an
automatic documentation generator, which creates a reference manual from the inline
documentation by processing the source files. Doxygen eliminates the redundancy of inline and
external documentation. Doxygen is very versatile, as it creates the documentation in html format
(for web publishing), latex format, and Microsoft Word rich text format (RTF).
15
• The Scene Viewer is the default supervising GUI, which is opened automatically at startup of
every Robotic Platform program.
• Additionally, each robotic class can have its own control panel. The control panels are opened
from the Scene Viewer.
• Finally, the Robotic Platform includes several utility programs (e.g., the Joint Move program
and the Teachpendant), which have a GUI.
The GUI is further explained in the next section.
Figure 16. The Scene Viewer and the Object List Window
Each object has an individual pop-up menu (see Figure 17). This pop-up menu appears if the
user either: i) right clicks on the object in the Scene Viewer rendering area, or ii) right clicks on an
16
entry in the Object List window. The pop-up menu has options to hide the object in the rendering
area or to select between wire frame and solid display. Additionally, the pop-up menu displays
interactive commands that are defined in the specific class of the object. For example, a gripper
object has additional menu items to open, close, and relax the gripper. Finally, the user can open
the control panel from the object pop-up menu. Each class can have an individual control panel.
Figure 18 shows the control panel of the WAM as an example.
The Teachpendant (see Figure 20) uses the zero gravity mode of the manipulator to allow the
user to push the manipulator around in the workspace. Once the user has moved the manipulator
to a desired target position, this position can be added to a list of points. The Teachpendant also
utilizes the trajectory generator to move the manipulator back to stored positions. It is also
possible to cycle the manipulator through all or some of the stored positions.
17
Figure 20. The Teachpendant
18
// Simple pick and place operation
#include “RoboticPlatform.hpp”
Figure 21. A Simple Pick and Place Program for the Robotic Platform
5 Programming Examples
n
w x = 0; w =
d0
where n is the normal vector of the plane, and d 0 is the distance from the origin. If x EndEffector is
the current end-effector position, then
19
Using the control law
#include “RoboticPlatform.hpp”
Vector<4> d_wallCoefficients;
double d_kf;
};
puma.setGravityCompensationOn(); (3)
puma.setServoControl(wallControl);
}
20
5.2 Comparison of Simulation and Implementation
A very interesting option is to forward the set points created by a trajectory generator to two
manipulators. In this way, the motion of two manipulators with the same kinematics can be
compared, or the behavior of a real manipulator can be compared with a dynamic simulation. The
latter application is implemented in the robot program in Figure 23. First, two objects of the class
Puma560 are created, and one of them is set into the simulation mode. Then, both objects are
connected to the same trajectory generator to receive the same set points.
#include “RoboticPlatform.hpp”
Vector<6> target;
Figure 23. Example Program that Forwards the Same Trajectory to Two Robots
Conclusions
The Robotic Platform is a software framework to support the implementation of a wide range of
robotic applications. As opposed to past distributed architecture-based robot control platforms,
the Robotic Platform presents a homogeneous, non-distributed object-oriented architecture. That
is, based on PC technology and the QNX RTP, all non real-time and real-time components are
integrated in a single C++ library. The architecture of the Robotic Platform provides efficient
integration and extensibility of devices, control strategies, trajectory generation, and GUI
components. Additionally, systems implemented with the Robotic Platform are inexpensive and
offer high performance. The Robotic Platform is built on the QMotor control environment for data
logging, control parameter tuning, and real-time plotting. A new, real-time math library simplifies
operations and allow for an easy-to-use programming interface. Built-in GUI components like the
Scene Viewer and the control panels provide for a comfortable operation of the Robotic Platform
and a quick ramp-up-time for users that are inexperienced in C++ programming.
21
References
[1] J. Lloyd, M. Parker and R. McClain, “Extending the RCCL Programming Environment to
Multiple Robots and Processors”, Proc. IEEE Int. Conf. Robotics & Automation, 1988, pp.
465 – 469.
[2] P. Corke and R. Kirkham, “The ARCL Robot Programming System”, Proc. Int. Conf. Robots
for Competitive Industries, Brisbane, Australia, pp. 484-493.
[3] J. Lloyd, M. Parker and G. Holder, “Real Time Control Under UNIX for RCCL”, Proceedings
of the 3rd International Symposium on Robotics and Manufacturing (ISRAM ’90).
[4] D.B. Stewart, D.E. Schmitz, and P.K. Khosla, “CHIMERA II: A Real-Time UNIX-Compatible
Multiprocessor Operating System for Sensor-based Control Applications”, tech. report CMU-
RI-TR-89-24, Robotics Institute, Carnegie Mellon University, September, 1989.
[5] B. Stroustrup, “What is ‘Object-Oriented Programming’?“, Proc. 1st European Software
Festival. February, 1991.
[6] D. J. Miller and R. C. Lennox, “An Object-Oriented Environment for Robot System
Architectures”, IEEE Control Systems February 1991, pp. 14-23.
[7] & =LHOL VNL ³2EMHFW-oriented robot programming”, 1997, Robotica volume 15, Cambridge
University Press, pp. 41-48.
[8] Chetan Kapoor, “A Reusable Operational Software Architecture for Advanced Robotics”,
Ph.D. thesis, University of Texas at Austin, December 1996.
[9] C. Pelich & F. M. Wahl, “A Programming Environment for a Multiprocessor-Net Based Robot
Control Unit”, Proc. 10th Int. Conf. on High Performance Computing, Ottawa, Canada, 1996.
[10] QSSL, Corporate Headquarters, 175 Terence Matthews Crescent, Kanata, Ontario K2M
1W8 Canada, Tel: +1 800-676-0566 or +1 613-591-0931, Fax: +1 613-591-3579, Email:
info@qnx.com, http://qnx.com.
[11] N. Costescu, D. M. Dawson, and M. Loffler, “QMotor 2.0 - A PC Based Real-Time
Multitasking Graphical Control Environment”, June 1999 IEEE Control Systems Magazine,
Vol. 19 Number 3, pp. 68 - 76.
[12] M. Loffler, D. Dawson, E. Zergeroglu, N. Costescu, “Object-Oriented Techniques in Robot
Manipulator Control Software Development”, Proc. of the American Control Conference,
Arlington, VA, June 2001, to appear.
[13] B. Stroustrup, “An Overview of the C++ Programming Language”, Handbook of Object
Technology, CRC Press. 1998. ISBN 0-8493-3135-8.
[14] Josie Wernecke, “The Inventor Mentor”, Addison-Wesley, ISBN 0-201-62495-8.
[15] N. Costescu, M. Loffler, M. Feemster, and D. Dawson, “QMotor 3.0 – An Object Oriented
System for PC Control Program Implementation and Tuning”, Proc. of the American Control
Conference, Arlington, VA, June 2001, to appear.
[16] Barrett Technologies, 139 Main St, Kendall Square, Cambridge, MA 02142,
http://www.barretttechnology.com/robot.
[17] Doxygen homepage, http://www.stack.nl/~dimitri/doxygen/
[18] Quality Real-Time Systems, LLC., 6312 Seven Corners Center, Falls Church, VA 22044,
Website: http://qrts.com.
22