-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a GenericRawToTwist Task #13
Open
planthaber
wants to merge
1
commit into
master
Choose a base branch
from
GenericRawToTwist
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* Generated from orogen/lib/orogen/templates/tasks/Task.cpp */ | ||
|
||
#include "GenericRawToTwist.hpp" | ||
#include <base/Twist.hpp> | ||
#include <base/Angle.hpp> | ||
|
||
|
||
#define WRITEAXIS(AXISNAME, TARGET) {\ | ||
int axis = _##AXISNAME.get(); \ | ||
if (axis >= 0) { \ | ||
double axisvalue = rcmd.axisValue[axis]; \ | ||
axisvalue = fabs(axisvalue) < _##AXISNAME##_deadzone ? 0 : axisvalue; \ | ||
axisvalue *= _invert_##AXISNAME ? -1 : 1; \ | ||
TARGET = axisvalue * _max_##AXISNAME; \ | ||
} else { \ | ||
TARGET = 0; \ | ||
} \ | ||
}; | ||
|
||
|
||
using namespace controldev; | ||
|
||
GenericRawToTwist::GenericRawToTwist(std::string const& name, TaskCore::TaskState initial_state) | ||
: GenericRawToTwistBase(name, initial_state) | ||
{ | ||
} | ||
|
||
GenericRawToTwist::~GenericRawToTwist() | ||
{ | ||
} | ||
|
||
|
||
|
||
/// The following lines are template definitions for the various state machine | ||
// hooks defined by Orocos::RTT. See GenericRawToTwist.hpp for more detailed | ||
// documentation about them. | ||
|
||
bool GenericRawToTwist::configureHook() | ||
{ | ||
if (! GenericRawToTwistBase::configureHook()) | ||
return false; | ||
return true; | ||
} | ||
bool GenericRawToTwist::startHook() | ||
{ | ||
if (! GenericRawToTwistBase::startHook()) | ||
return false; | ||
return true; | ||
} | ||
|
||
|
||
void GenericRawToTwist::updateHook() | ||
{ | ||
GenericRawToTwistBase::updateHook(); | ||
|
||
RawCommand rcmd; | ||
base::Twist mcmd; | ||
if (_raw_command.read(rcmd) == RTT::NewData) { | ||
// example code result by the WRITEAXIS macro | ||
// int axis = _linear_x_axis.get(); | ||
// if (axis >= 0) { | ||
// double axisvalue = rcmd.axisValue[axis]; | ||
// axisvalue = fabs(rot_raw) < _rotation_axis_deadzone ? 0 : rot_raw; | ||
// axisvalue *= _invert_linear_x_axis ? -1 : 1; | ||
// mcmd.linear.x() = axisvalue * _max_linear_x_axis; | ||
// } else { | ||
// mcmd.linear.x() = 0; | ||
// } | ||
|
||
WRITEAXIS(linear_x_axis, mcmd.linear.x()) | ||
WRITEAXIS(linear_y_axis, mcmd.linear.y()) | ||
WRITEAXIS(linear_z_axis, mcmd.linear.z()) | ||
WRITEAXIS(angular_x_axis, mcmd.angular.x()) | ||
WRITEAXIS(angular_y_axis, mcmd.angular.y()) | ||
WRITEAXIS(angular_z_axis, mcmd.angular.z()) | ||
_motion_command.write(mcmd); | ||
} | ||
} | ||
void GenericRawToTwist::errorHook() | ||
{ | ||
GenericRawToTwistBase::errorHook(); | ||
} | ||
void GenericRawToTwist::stopHook() | ||
{ | ||
GenericRawToTwistBase::stopHook(); | ||
} | ||
void GenericRawToTwist::cleanupHook() | ||
{ | ||
GenericRawToTwistBase::cleanupHook(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* Generated from orogen/lib/orogen/templates/tasks/Task.hpp */ | ||
|
||
#ifndef CONTROLDEV_GENERICRAWTOTWIST_TASK_HPP | ||
#define CONTROLDEV_GENERICRAWTOTWIST_TASK_HPP | ||
|
||
#include "controldev/GenericRawToTwistBase.hpp" | ||
|
||
namespace controldev{ | ||
|
||
/*! \class GenericRawToTwist | ||
* \brief The task context provides and requires services. It uses an ExecutionEngine to perform its functions. | ||
* Essential interfaces are operations, data flow ports and properties. These interfaces have been defined using the oroGen specification. | ||
* In order to modify the interfaces you should (re)use oroGen and rely on the associated workflow. | ||
* This task converts controldev/RawCommand to base/MotionCommand2D | ||
with configurable axes, ranges and deadzones | ||
* \details | ||
* The name of a TaskContext is primarily defined via: | ||
\verbatim | ||
deployment 'deployment_name' | ||
task('custom_task_name','controldev::GenericRawToTwist') | ||
end | ||
\endverbatim | ||
* It can be dynamically adapted when the deployment is called with a prefix argument. | ||
*/ | ||
class GenericRawToTwist : public GenericRawToTwistBase | ||
{ | ||
friend class GenericRawToTwistBase; | ||
protected: | ||
|
||
|
||
|
||
public: | ||
/** TaskContext constructor for GenericRawToTwist | ||
* \param name Name of the task. This name needs to be unique to make it identifiable via nameservices. | ||
* \param initial_state The initial TaskState of the TaskContext. Default is Stopped state. | ||
*/ | ||
GenericRawToTwist(std::string const& name = "controldev::GenericRawToTwist", TaskCore::TaskState initial_state = Stopped); | ||
|
||
/** Default deconstructor of GenericRawToTwist | ||
*/ | ||
~GenericRawToTwist(); | ||
|
||
/** This hook is called by Orocos when the state machine transitions | ||
* from PreOperational to Stopped. If it returns false, then the | ||
* component will stay in PreOperational. Otherwise, it goes into | ||
* Stopped. | ||
* | ||
* It is meaningful only if the #needs_configuration has been specified | ||
* in the task context definition with (for example): | ||
\verbatim | ||
task_context "TaskName" do | ||
needs_configuration | ||
... | ||
end | ||
\endverbatim | ||
*/ | ||
bool configureHook(); | ||
|
||
/** This hook is called by Orocos when the state machine transitions | ||
* from Stopped to Running. If it returns false, then the component will | ||
* stay in Stopped. Otherwise, it goes into Running and updateHook() | ||
* will be called. | ||
*/ | ||
bool startHook(); | ||
|
||
/** This hook is called by Orocos when the component is in the Running | ||
* state, at each activity step. Here, the activity gives the "ticks" | ||
* when the hook should be called. | ||
* | ||
* The error(), exception() and fatal() calls, when called in this hook, | ||
* allow to get into the associated RunTimeError, Exception and | ||
* FatalError states. | ||
* | ||
* In the first case, updateHook() is still called, and recover() allows | ||
* you to go back into the Running state. In the second case, the | ||
* errorHook() will be called instead of updateHook(). In Exception, the | ||
* component is stopped and recover() needs to be called before starting | ||
* it again. Finally, FatalError cannot be recovered. | ||
*/ | ||
void updateHook(); | ||
|
||
/** This hook is called by Orocos when the component is in the | ||
* RunTimeError state, at each activity step. See the discussion in | ||
* updateHook() about triggering options. | ||
* | ||
* Call recover() to go back in the Runtime state. | ||
*/ | ||
void errorHook(); | ||
|
||
/** This hook is called by Orocos when the state machine transitions | ||
* from Running to Stopped after stop() has been called. | ||
*/ | ||
void stopHook(); | ||
|
||
/** This hook is called by Orocos when the state machine transitions | ||
* from Stopped to PreOperational, requiring the call to configureHook() | ||
* before calling start() again. | ||
*/ | ||
void cleanupHook(); | ||
}; | ||
} | ||
|
||
#endif | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
max_*
intoscale_*
and then one can set a negative scale to get an inversion (no code change apart from the removal ofinvert_
)static inline
functions instead of macros. No need to set the target within the function, just return the value and set it from the updateHookThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The task was mainly copied from GenericRawToMotion2D (https://github.com/rock-drivers/drivers-orogen-controldev/blob/master/controldev.orogen#L55), including the documentation and property names, I kept the naming scheme for the properties instead of introducing new ones (for a similar task).
Using a static inline function would need to provide all used properties and parameters in the call, currently they are generated by the macro:
_##AXISNAME.get()
_##AXISNAME##_deadzone
invert##AXISNAME
max##AXISNAME
When adding more parameters to the function call, the code would imo become more confusing and more copy/paste error prone. But I don't have strong feelings about that.