Compare commits

...

10 Commits

Author SHA1 Message Date
Bastian Hofmann
d874816b00 Visual fixes to lights and robot 2023-06-27 14:48:46 +00:00
Bastian Hofmann
313b6d09a1 Better Lighting 2023-06-27 14:02:18 +00:00
Bastian Hofmann
72a37287eb Hopefully last fixes to colors of robot and trees 2023-06-27 12:18:48 +00:00
Bastian Hofmann
88100990af Fixed build 2023-06-18 01:33:07 +00:00
Bastian Hofmann
a26d82f4fe WIP. 2023-06-17 15:51:48 +00:00
Bastian Hofmann
97db29a669 WIP. 2023-06-17 15:51:33 +00:00
Bastian Hofmann
8306673729 Actor now puts back what he picks up. 2023-04-30 09:33:47 +00:00
Bastian Hofmann
cbfe3f0400 Remaining changes to trees and visibility. 2023-04-30 09:28:34 +00:00
Bastian Hofmann
18031e0592 Cleanup and finishing touches 2023-04-30 07:43:08 +00:00
Bastian Hofmann
9d9af7fa6b Removed unused Groot node definitions. 2023-04-21 16:23:00 +00:00
53 changed files with 29861 additions and 936 deletions

6
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "src/Groot"]
path = src/Groot
url = https://github.com/BehaviorTree/Groot.git
[submodule "src/gz_ros2_control"]
path = src/gz_ros2_control
url = https://github.com/ros-controls/gz_ros2_control.git

21
README.md Normal file
View File

@@ -0,0 +1,21 @@
# Usage
`ros2 launch ign_world gazebo_controller_launch.py scene:=` and one of the following scene types: `Coex`, `Coop` and `Colab` appended to the beforementioned command.
Depending on your terminal configuration, adding the environment variable `DISPLAY=:0` may be required as a prefix to the command, as not all terminals load the predefined environment.
# Build
Building a package is handled by using the `build.sh` executable.
Many IDE's require a `compile_commands.json` file to offer syntax highlighting, which will be output when using the script. This also includes a symlink, in case your IDE does not search for it in the build directory.
Another addition of the script is the usage of `console_cohesion+` as event handler, which will format output by package, easing debugging in the noisy build output.
# Packages
package name|description
-|-
`btree` | the executable for the behavior trees and the used xml files
`controller_test` | a debugging tool for sending direct commands to the ros_control controller of the `iisy`
`gz_ros2_control` | the git version of that package, as the one in the repos was too outdated
`ign_actor_plugin` | the Gazebo Ignition plugin for controllable Actors
`ign_world` | the world for the simulation
`ros_actor_action_server` | second component of actor plugin, has to be started to enable control functionality
`ros_actor_action_server_msgs` | ros_action messages used by the actor plugin server
`ros_actor_message_queue_msgs` | internal messages of the actor plugin

View File

@@ -1,4 +1,4 @@
#!/bin/bash
pushd "$(dirname "$0")" || exit
colcon build --event-handlers console_cohesion+ --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja
colcon build --event-handlers console_cohesion+ --cmake-args -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja
popd || exit

Submodule src/Groot deleted from 05fe640172

View File

@@ -2,11 +2,10 @@ cmake_minimum_required(VERSION 3.10.2 FATAL_ERROR)
project(btree)
add_compile_options(-Wall -Wextra -Wpedantic)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# find dependencies
set(DEPENDENCIES
@@ -36,7 +35,6 @@ endforeach()
set(CPP_FILES
src/Tree.cpp
src/Extensions.cpp
src/nodes/WeightedRandomNode.cpp
src/nodes/GenerateXYPose.cpp
src/nodes/RobotMove.cpp
@@ -49,8 +47,9 @@ set(CPP_FILES
src/nodes/ActorAnimation.cpp
src/nodes/ActorMovement.cpp
)
add_executable(tree ${CPP_FILES})
SET_SOURCE_FILES_PROPERTIES(src/Extensions.hpp PROPERTIES COMPILE_FLAGS -O0)
target_include_directories(tree PUBLIC /src /src/nodes)
set_property(TARGET tree PROPERTY CXX_STANDARD 17)
ament_target_dependencies(tree ${DEPENDENCIES})

View File

@@ -1,12 +1,14 @@
//
// Created by bastian on 28.02.22.
//
#ifndef BUILD_EXTENSIONS_H
#define BUILD_EXTENSIONS_H
#include "Area.h"
#include <geometry_msgs/msg/pose.hpp>
namespace BT {
template<>
template<> inline
std::shared_ptr<Position2D> convertFromString(StringView str) {
auto split = splitString(str, ',');
if (split.size() != 2) {
@@ -19,7 +21,7 @@ namespace BT {
return pos;
}
template<>
template<> inline
std::shared_ptr<Area> convertFromString(StringView str) {
auto parts = splitString(str, '|');
if (parts.size() < 3) {
@@ -35,7 +37,7 @@ namespace BT {
return output;
}
template<>
template<> inline
std::shared_ptr<geometry_msgs::msg::Pose> convertFromString(StringView str) {
auto parts = splitString(str, ',');
if (!(parts.size() == 3 || parts.size() == 7)) {
@@ -61,7 +63,7 @@ namespace BT {
return pose;
}
template<>
template<> inline
std::shared_ptr<geometry_msgs::msg::Point> convertFromString(StringView str) {
auto parts = splitString(str, ',');
if (parts.size() != 3) {
@@ -76,7 +78,7 @@ namespace BT {
return point;
}
template<>
template<> inline
std::shared_ptr<geometry_msgs::msg::Quaternion> convertFromString(StringView str) {
auto parts = splitString(str, ',');
if (parts.size() != 4) {
@@ -92,3 +94,5 @@ namespace BT {
return point;
}
}
#endif //BUILD_EXTENSIONS_H

View File

@@ -1,7 +1,10 @@
#include "Extensions.hpp"
#include "Area.h"
#include <behaviortree_cpp_v3/basic_types.h>
#include <behaviortree_cpp_v3/blackboard.h>
#include <behaviortree_cpp_v3/bt_factory.h>
#include <boost/exception/exception.hpp>
#include <geometry_msgs/msg/detail/pose__struct.hpp>
#include <rclcpp/logging.hpp>
#include <rclcpp/rclcpp.hpp>
#include <random>
@@ -20,10 +23,14 @@
#include <chrono>
#include <thread>
using namespace BT;
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
rclcpp::NodeOptions node_options;
convertFromString<std::shared_ptr<geometry_msgs::msg::Pose>>("0,0,0");
auto mainNode = rclcpp::Node::make_shared("tree_general_node", node_options);
mainNode -> declare_parameter("trees",std::vector<std::string>({}));
@@ -51,12 +58,12 @@ int main(int argc, char **argv) {
auto connection = std::make_shared<MoveConnection>(moveNode, "arm");
executor.add_node(moveNode);
factory.registerBuilder<RobotMove>("RobotMove", [&connection](const std::string &name, const NodeConfiguration &config) {
return std::make_unique<RobotMove>(name, config, &connection);
factory.registerBuilder<RobotMove>("RobotMove", [connection](const std::string &name, const NodeConfiguration &config) {
return std::make_unique<RobotMove>(name, config, connection);
});
factory.registerBuilder<SetRobotVelocity>("SetRobotVelocity", [&connection](const std::string &name, const NodeConfiguration &config) {
return std::make_unique<SetRobotVelocity>(name, config, &connection);
factory.registerBuilder<SetRobotVelocity>("SetRobotVelocity", [connection](const std::string &name, const NodeConfiguration &config) {
return std::make_unique<SetRobotVelocity>(name, config, connection);
});

View File

@@ -18,7 +18,7 @@ BT::PortsList ActorAnimation::providedPorts() {
}
BT::NodeStatus ActorAnimation::onStart() {
std::cout << "started animation" << std::endl;
std::cout << "started actor animation" << std::endl;
ros_actor_action_server_msgs::action::Animation::Goal goal;
@@ -37,8 +37,10 @@ BT::NodeStatus ActorAnimation::onStart() {
send_goal_options.result_callback = [=](const ClientGoalHandle<Animation>::WrappedResult & parameter) {
mutex.lock();
if(parameter.code == ResultCode::SUCCEEDED){
std::cout << "finished actor animation" << std::endl;
result = BT::NodeStatus::SUCCESS;
}else{
std::cout << "failed actor animation" << std::endl;
result = BT::NodeStatus::FAILURE;
}
mutex.unlock();
@@ -53,14 +55,12 @@ BT::NodeStatus ActorAnimation::onStart() {
BT::NodeStatus ActorAnimation::onRunning() {
mutex.lock();
auto status = result;
if(result != BT::NodeStatus::RUNNING){
result = BT::NodeStatus::IDLE;
}
mutex.unlock();
return status;
}
void ActorAnimation::onHalted() {
std::cout << "halted animation" << std::endl;
std::cout << "halted actor animation" << std::endl;
client->async_cancel_all_goals();
result = BT::NodeStatus::FAILURE;
}

View File

@@ -2,6 +2,7 @@
// Created by bastian on 26.03.22.
//
#include "../Extensions.hpp"
#include "ActorMovement.h"
#include <action_msgs/msg/detail/goal_status__struct.hpp>
#include <behaviortree_cpp_v3/basic_types.h>
@@ -22,7 +23,7 @@ BT::PortsList ActorMovement::providedPorts() {
}
BT::NodeStatus ActorMovement::onStart() {
std::cout << "started moving" << std::endl;
std::cout << "started actor movement" << std::endl;
ros_actor_action_server_msgs::action::Movement::Goal goal;
@@ -51,10 +52,10 @@ BT::NodeStatus ActorMovement::onStart() {
send_goal_options.result_callback = [&](ClientGoalHandle<Movement>::WrappedResult parameter) {
mutex.lock();
if(parameter.code == ResultCode::SUCCEEDED){
std::cout << "Success?" << std::endl;
std::cout << "finished actor movement" << std::endl;
result = BT::NodeStatus::SUCCESS;
}else{
std::cout << "Failure?" << std::endl;
std::cout << "failed actor movement" << std::endl;
result = BT::NodeStatus::FAILURE;
}
mutex.unlock();
@@ -81,15 +82,12 @@ BT::NodeStatus ActorMovement::onStart() {
BT::NodeStatus ActorMovement::onRunning() {
mutex.lock();
auto status = result;
if(result != BT::NodeStatus::RUNNING){
result = BT::NodeStatus::IDLE;
}
mutex.unlock();
return status;
}
void ActorMovement::onHalted() {
std::cout << "halted move" << std::endl;
std::cout << "halted actor movement" << std::endl;
client->async_cancel_all_goals();
result = BT::NodeStatus::IDLE;
result = BT::NodeStatus::FAILURE;
}

View File

@@ -83,7 +83,8 @@ BT::NodeStatus BT::GenerateXYPose::tick() {
randomPose->orientation.y = 0;
randomPose->orientation.z = 0;
printf("Generated Target: %f %f\n", pos.x, pos.y);
std::cout << "Generated Pose." << std::endl;
setOutput<std::shared_ptr<geometry_msgs::msg::Pose>>("pose", randomPose);
return NodeStatus::SUCCESS;
}

View File

@@ -3,6 +3,7 @@
//
#include "InAreaTest.h"
#include "../Extensions.hpp"
BT::PortsList BT::InAreaTest::providedPorts() {
return {

View File

@@ -15,23 +15,24 @@ void BT::InterruptableSequence::halt() {
BT::NodeStatus BT::InterruptableSequence::tick() {
auto result = children_nodes_[position]->executeTick();
setStatus(NodeStatus::RUNNING);
if(result==NodeStatus::FAILURE){
haltChildren();
resetChildren();
position=0;
setStatus(NodeStatus::FAILURE);
return NodeStatus::FAILURE;
}
if(result==NodeStatus::SUCCESS){
position++;
if(position>=children_nodes_.size()){
haltChildren();
resetChildren();
position=0;
setStatus(NodeStatus::SUCCESS);
return NodeStatus::SUCCESS;
}
}
setStatus(NodeStatus::RUNNING);
return NodeStatus::RUNNING;
}

View File

@@ -11,20 +11,19 @@ void MoveConnection::planAndExecute(const std::shared_ptr<geometry_msgs::msg::Po
std::cout<<"planAndExecute."<<std::endl;
lock.lock();
state = RUNNING;
std::cout<<"got lock."<<std::endl;
lastTarget = pose;
lastCallback = callback;
moveGroup.setMaxVelocityScalingFactor(currentSpeed);
moveGroup.setMaxAccelerationScalingFactor(1);
std::cout<<"Starting planning"<<std::endl;
std::thread([&](){
moveGroup.setPoseTarget(*lastTarget);
moveGroup.setGoalJointTolerance(0.01);
moveGroup.setGoalOrientationTolerance(0.01);
std::cout<<"Starting planning"<<std::endl;
std::thread([&](){
std::cout<<"Parameters set."<<std::endl;
auto finished = moveGroup.move() == moveit::core::MoveItErrorCode::SUCCESS;

View File

@@ -12,7 +12,7 @@
class MoveConnection {
private:
enum {IDLE,RUNNING,SPEED_CHANGE} state;
enum {IDLE,RUNNING,SPEED_CHANGE} state = IDLE;
moveit::planning_interface::MoveGroupInterface moveGroup;
std::shared_ptr<geometry_msgs::msg::Pose> lastTarget = nullptr;
std::function<void(bool)> lastCallback = [](__attribute__((unused))bool finished) {};

View File

@@ -2,6 +2,7 @@
// Created by bastian on 29.03.22.
//
#include "../Extensions.hpp"
#include "OffsetPose.h"
#include <geometry_msgs/msg/detail/pose__struct.hpp>
#include <memory>
@@ -23,6 +24,7 @@ BT::NodeStatus BT::OffsetPose::tick() {
std::shared_ptr<geometry_msgs::msg::Pose> pose;
if (!getInput("input", pose)) {
std::cout << "Missing {input} pose" << std::endl;
return NodeStatus::FAILURE;
}

View File

@@ -5,7 +5,7 @@
#include "RobotMove.h"
BT::RobotMove::RobotMove(const std::string &name, const BT::NodeConfiguration &config,
std::shared_ptr<MoveConnection> *connection)
std::shared_ptr<MoveConnection> connection)
: StatefulActionNode(name, config) {
this->connection = connection;
}
@@ -20,7 +20,7 @@ BT::NodeStatus BT::RobotMove::onStart() {
printf("X:%f Y:%f Z:%f\n",pose->position.x,pose->position.y,pose->position.z);
printf("W:%f X:%f Y:%f Z:%f\n",pose->orientation.w,pose->orientation.x,pose->orientation.y,pose->orientation.z);
asyncResult = NodeStatus::RUNNING;
connection->get()->planAndExecute(pose,[this](bool finished){
connection->planAndExecute(pose,[this](bool finished){
if(finished){
printf("Finished move.");
asyncResult = NodeStatus::SUCCESS;
@@ -42,7 +42,7 @@ BT::NodeStatus BT::RobotMove::onRunning() {
void BT::RobotMove::onHalted() {
std::cout << "Halting RobotMove" << std::endl;
connection->get()->stop();
connection->stop();
asyncResult=NodeStatus::FAILURE;
}

View File

@@ -16,12 +16,12 @@ namespace BT {
class RobotMove : public StatefulActionNode {
private:
std::shared_ptr<MoveConnection> *connection;
std::shared_ptr<MoveConnection> connection;
NodeStatus asyncResult = NodeStatus::FAILURE;
public:
RobotMove(const std::string &name, const BT::NodeConfiguration &config,
std::shared_ptr<MoveConnection> *connection);
std::shared_ptr<MoveConnection> connection);
NodeStatus onStart() override;

View File

@@ -11,7 +11,7 @@ BT::NodeStatus BT::SetRobotVelocity::tick() {
std::cout<<"No velocity given."<<std::endl;
return NodeStatus::FAILURE;
}
connection->get()->setSpeedMultiplier(velocity);
connection->setSpeedMultiplier(velocity);
return NodeStatus::SUCCESS;
}
@@ -21,7 +21,7 @@ BT::PortsList BT::SetRobotVelocity::providedPorts() {
};
}
BT::SetRobotVelocity::SetRobotVelocity(const std::string &name, const BT::NodeConfiguration &config, std::shared_ptr<MoveConnection> *connection) : SyncActionNode(
BT::SetRobotVelocity::SetRobotVelocity(const std::string &name, const BT::NodeConfiguration &config, std::shared_ptr<MoveConnection> connection) : SyncActionNode(
name, config) {
this->connection = connection;
}

View File

@@ -11,11 +11,11 @@
namespace BT {
class SetRobotVelocity: public SyncActionNode {
private:
std::shared_ptr<MoveConnection> *connection{};
std::shared_ptr<MoveConnection> connection;
public:
SetRobotVelocity(const std::string &name, const NodeConfiguration &config,
std::shared_ptr<MoveConnection> *connection);
std::shared_ptr<MoveConnection> connection);
static PortsList providedPorts();

View File

@@ -16,7 +16,7 @@ void WeightedRandomNode::halt() {
NodeStatus WeightedRandomNode::tick() {
if (select_next) {
const size_t children_count = children_nodes_.size();
size_t children_count = children_nodes_.size();
std::string weightString;
@@ -53,14 +53,18 @@ NodeStatus WeightedRandomNode::tick() {
}
selected_child_index = i;
std::cout<< "Selected child:" << selected_child_index <<std::endl;
select_next = false;
}
TreeNode *current_child_node = children_nodes_[selected_child_index];
const NodeStatus child_status = current_child_node->executeTick();
NodeStatus child_status = current_child_node->executeTick();
if (child_status != NodeStatus::RUNNING) {
select_next = true;
resetChildren();
}
return child_status;

View File

@@ -1,20 +1,43 @@
<?xml version="1.0"?>
<root main_tree_to_execute="actorTree">
<BehaviorTree ID="actorTree">
<Control ID="WeightedRandom" weights="95,5">
<WeightedRandom weights="95,5">
<Sequence>
<SubTree ID="WorkOnBench"/>
<SubTree ID="DepositToShelf"/>
</Sequence>
<Sequence>
<Action ID="GenerateXYPose" area="{unsafeArea}" pose="{actorTarget}"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="{actorTarget}"/>
</Sequence>
</WeightedRandom>
</BehaviorTree>
<BehaviorTree ID="DepositToShelf">
<Sequence>
<WeightedRandom weights="1,1,1">
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="5.5,0,0,0.707,0,0,-0.707"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="6.5,0,0,0.707,0,0,-0.707"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="7.5,0,0,0.707,0,0,-0.707"/>
</WeightedRandom>
<WeightedRandom weights="1,1">
<Sequence>
<Control ID="WeightedRandom" weights="95,5">
<Action ID="GenerateXYPose" area="{safeArea}" pose="{actorTarget}"/>
<Action ID="GenerateXYPose" area="{warningArea}" pose="{actorTarget}"/>
</Control>
<Action ID="ActorMovement" animation_name="walk" target="{actorTarget}"/>
<Action ID="ActorAnimation" animation_name="standing_extend_arm"/>
<Action ID="ActorAnimation" animation_name="standing_retract_arm"/>
</Sequence>
<Sequence>
<Action ID="GenerateXYPose" area="{unsafeArea}" pose="{actorTarget}"/>
<Action ID="ActorMovement" animation_name="walk" target="{actorTarget}"/>
<Action ID="ActorAnimation" animation_name="standing_to_low"/>
<Action ID="ActorAnimation" animation_name="low_inspect"/>
<Action ID="ActorAnimation" animation_name="low_put_back"/>
<Action ID="ActorAnimation" animation_name="low_to_standing"/>
</Sequence>
</WeightedRandom>
</Sequence>
</BehaviorTree>
<BehaviorTree ID="WorkOnBench">
<Sequence>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="6.5,6,0,0.707,0,0,0.707"/>
<Action ID="ActorAnimation" animation_name="standing_extend_arm"/>
<Action ID="ActorAnimation" animation_name="standing_retract_arm"/>
</Sequence>
</Control>
</BehaviorTree>
</root>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0"?>
<root main_tree_to_execute="actorTree">
<!-- ////////// -->
<BehaviorTree ID="actorTree">
<Fallback>
<ReactiveSequence>
@@ -9,65 +8,27 @@
</Inverter>
<Sequence>
<Control ID="WeightedRandom" weights="100,5,2">
<WeightedRandom weights="100,5,2">
<Action ID="GenerateXYPose" area="{safeArea}" pose="{actorTarget}"/>
<Action ID="GenerateXYPose" area="{warningArea}" pose="{actorTarget}"/>
<Action ID="GenerateXYPose" area="{unsafeArea}" pose="{actorTarget}"/>
</Control>
<Action ID="ActorMovement" animation_name="walk" target="{actorTarget}"/>
</WeightedRandom>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="{actorTarget}"/>
</Sequence>
</ReactiveSequence>
<Sequence>
<Action ID="GenerateXYPose" area="{unsafeArea}" pose="{actorTarget}"/>
<Action ID="ActorMovement" animation_name="walk" target="{actorTarget}"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="{actorTarget}"/>
<Action ID="ActorAnimation" animation_name="standing_to_low"/>
<Action ID="ActorAnimation" animation_name="low_inspect"/>
<Action ID="ActorAnimation" animation_name="low_grab"/>
<Action ID="ActorAnimation" animation_name="low_to_standing"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="1,0.5,0,0,0,0,1"/>
<Action ID="ActorAnimation" animation_name="standing_extend_arm"/>
<Action ID="ActorAnimation" animation_name="standing_retract_arm"/>
<Action ID="SetCalledTo" state="false"/>
</Sequence>
</Fallback>
</BehaviorTree>
<!-- ////////// -->
<TreeNodesModel>
<Action ID="ActorAnimation">
<input_port name="animation">Name of animation to play</input_port>
</Action>
<Action ID="ActorMovement">
<input_port name="animation">Name of animation to play</input_port>
<input_port name="target">Pose to move to</input_port>
</Action>
<Condition ID="IsCalled"/>
<Action ID="SetCalledTo">
<input_port name="state">state to set called to</input_port>
</Action>
<Action ID="GenerateXYPose">
<input_port name="area">Area to generate pose in</input_port>
<output_port name="pose">Generated pose in area</output_port>
</Action>
<Condition ID="InAreaTest">
<input_port name="area">Bounds to check in</input_port>
<input_port name="pose">Position of object</input_port>
</Condition>
<Action ID="MoveActorToTarget">
<input_port name="current">Current actor position</input_port>
<input_port name="target">Target to move actor to</input_port>
</Action>
<Action ID="PositionToPose">
<input_port name="offset">offset as a Point</input_port>
<input_port name="orientation">rotation of resulting pose as Quaternion</input_port>
<input_port name="output">generated new pose</input_port>
<input_port name="position">initial position as Position2D</input_port>
</Action>
<Action ID="SetRobotVelocity">
<input_port name="velocity">Target velocity of robot</input_port>
</Action>
<Action ID="RandomFailure">
<input_port name="failureChance">Chance to fail from 0 to 1</input_port>
</Action>
<Action ID="RobotMove">
<input_port name="target">Target pose of robot.</input_port>
</Action>
<Control ID="WeightedRandom">
<input_port name="weights">Weights for the children, separated by semicolon.</input_port>
</Control>
</TreeNodesModel>
<!-- ////////// -->
</root>

View File

@@ -1,73 +1,52 @@
<?xml version="1.0"?>
<root main_tree_to_execute="actorTree">
<!-- ////////// -->
<BehaviorTree ID="actorTree">
<Fallback>
<ReactiveSequence>
<Inverter>
<Condition ID="IsCalled"/>
</Inverter>
<Sequence>
<Control ID="WeightedRandom" weights="100,5,2">
<Action ID="GenerateXYPose" area="{safeArea}" pose="{actorTarget}"/>
<Action ID="GenerateXYPose" area="{warningArea}" pose="{actorTarget}"/>
<Action ID="GenerateXYPose" area="{unsafeArea}" pose="{actorTarget}"/>
</Control>
<Action ID="ActorMovement" animation_name="walk" target="{actorTarget}"/>
<Control ID="WeightedRandom" weights="95,5">
<Sequence>
<SubTree ID="WorkOnBench"/>
<SubTree ID="DepositToShelf"/>
</Sequence>
</ReactiveSequence>
<Sequence>
<Action ID="GenerateXYPose" area="{unsafeArea}" pose="{actorTarget}"/>
<Action ID="ActorMovement" animation_name="walk" target="{actorTarget}"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="{actorTarget}"/>
</Sequence>
</Control>
<Condition ID="IsCalled"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="1,0.5,0,0,0,0,1"/>
<Action ID="ActorAnimation" animation_name="standing_extend_arm"/>
<Action ID="ActorAnimation" animation_name="standing_retract_arm"/>
<Action ID="SetCalledTo" state="false"/>
<SubTree ID="DepositToShelf"/>
</Sequence>
</BehaviorTree>
<BehaviorTree ID="DepositToShelf">
<Sequence>
<WeightedRandom weights="1,1,1">
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="5.5,0,0,0.707,0,0,-0.707"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="6.5,0,0,0.707,0,0,-0.707"/>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="7.5,0,0,0.707,0,0,-0.707"/>
</WeightedRandom>
<WeightedRandom weights="1,1">
<Sequence>
<Action ID="ActorAnimation" animation_name="standing_extend_arm"/>
<Action ID="ActorAnimation" animation_name="standing_retract_arm"/>
</Sequence>
<Sequence>
<Action ID="ActorAnimation" animation_name="standing_to_low"/>
<Action ID="ActorAnimation" animation_name="low_inspect"/>
<Action ID="ActorAnimation" animation_name="low_put_back"/>
<Action ID="ActorAnimation" animation_name="low_to_standing"/>
</Sequence>
</WeightedRandom>
</Sequence>
</BehaviorTree>
<BehaviorTree ID="WorkOnBench">
<Sequence>
<Action ID="ActorMovement" animation_distance="1.5" animation_name="standing_walk" target="6.5,6,0,0.707,0,0,0.707"/>
<Action ID="ActorAnimation" animation_name="standing_extend_arm"/>
<Action ID="ActorAnimation" animation_name="standing_retract_arm"/>
</Sequence>
</Fallback>
</BehaviorTree>
<!-- ////////// -->
<TreeNodesModel>
<Action ID="ActorAnimation">
<input_port name="animation">Name of animation to play</input_port>
</Action>
<Action ID="ActorMovement">
<input_port name="animation">Name of animation to play</input_port>
<input_port name="target">Pose to move to</input_port>
</Action>
<Condition ID="IsCalled"/>
<Action ID="SetCalledTo">
<input_port name="state">state to set called to</input_port>
</Action>
<Action ID="GenerateXYPose">
<input_port name="area">Area to generate pose in</input_port>
<output_port name="pose">Generated pose in area</output_port>
</Action>
<Condition ID="InAreaTest">
<input_port name="area">Bounds to check in</input_port>
<input_port name="pose">Position of object</input_port>
</Condition>
<Action ID="MoveActorToTarget">
<input_port name="current">Current actor position</input_port>
<input_port name="target">Target to move actor to</input_port>
</Action>
<Action ID="PositionToPose">
<input_port name="offset">offset as a Point</input_port>
<input_port name="orientation">rotation of resulting pose as Quaternion</input_port>
<input_port name="output">generated new pose</input_port>
<input_port name="position">initial position as Position2D</input_port>
</Action>
<Action ID="SetRobotVelocity">
<input_port name="velocity">Target velocity of robot</input_port>
</Action>
<Action ID="RandomFailure">
<input_port name="failureChance">Chance to fail from 0 to 1</input_port>
</Action>
<Action ID="RobotMove">
<input_port name="target">Target pose of robot.</input_port>
</Action>
<Control ID="WeightedRandom">
<input_port name="weights">Weights for the children, separated by semicolon.</input_port>
</Control>
</TreeNodesModel>
<!-- ////////// -->
</root>

View File

@@ -10,7 +10,6 @@
<Action ID="SetRobotVelocity" velocity="0.1"/>
<Action ID="SetRobotVelocity" velocity="1"/>
</IfThenElse>
<Fallback>
<Control ID="InterruptableSequence">
<Action ID="GenerateXYPose" area="{negativeYTable}" pose="{target}"/>
<Action ID="OffsetPose" input="{target}" offset="0,0,1.1" orientation="0,0,1,0" output="{target}"/>
@@ -19,7 +18,6 @@
<Action ID="OffsetPose" input="{target}" offset="0,0,1.1" orientation="0,0,1,0" output="{target}"/>
<Action ID="RobotMove" target="{target}"/>
</Control>
</Fallback>
</ReactiveSequence>
</BehaviorTree>
</root>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0"?>
<root main_tree_to_execute="robotTree">
<!-- ////////// -->
<BehaviorTree ID="robotTree">
<ReactiveSequence>
<Inverter>
@@ -12,7 +11,7 @@
<Action ID="SetRobotVelocity" velocity="1"/>
</IfThenElse>
<Fallback>
<Control ID="InterruptableSequence">
<InterruptableSequence>
<Action ID="GenerateXYPose" area="{negativeYTable}" pose="{target}"/>
<Action ID="OffsetPose" input="{target}" offset="0,0,1.1" orientation="0,0,1,0" output="{target}"/>
<Action ID="RobotMove" target="{target}"/>
@@ -21,53 +20,10 @@
<Action ID="OffsetPose" input="{target}" offset="0,0,1.1" orientation="0,0,1,0" output="{target}"/>
<Action ID="RobotMove" target="{target}"/>
<Action ID="RandomFailure" failure_chance="0.05"/>
</Control>
</InterruptableSequence>
<Action ID="SetCalledTo" state="true"/>
</Fallback>
</ReactiveSequence>
</BehaviorTree>
<!-- ////////// -->
<TreeNodesModel>
<Action ID="ActorAnimation">
<input_port name="animation">Name of animation to play</input_port>
</Action>
<Action ID="ActorMovement">
<input_port name="animation">Name of animation to play</input_port>
<input_port name="target">Pose to move to</input_port>
</Action>
<Condition ID="IsCalled"/>
<Action ID="SetCalledTo">
<input_port name="state">state to set called to</input_port>
</Action>
<Action ID="GenerateXYPose">
<input_port name="area">Area to generate pose in</input_port>
<output_port name="pose">Generated pose in area</output_port>
</Action>
<Condition ID="InAreaTest">
<input_port name="area">Bounds to check in</input_port>
<input_port name="pose">Position of object</input_port>
</Condition>
<Action ID="OffsetPose">
<input_port name="input">initial position as Pose</input_port>
<input_port name="offset">offset as a Point</input_port>
<input_port name="orientation">rotation of resulting pose as Quaternion</input_port>
<output_port name="output">generated new pose</output_port>
</Action>
<Action ID="RandomFailure">
<input_port name="failureChance">Chance to fail from 0 to 1</input_port>
</Action>
<Action ID="RobotMove">
<input_port name="target">Target pose of robot.</input_port>
</Action>
<Action ID="SetRobotVelocity">
<input_port name="velocity">Target velocity of robot</input_port>
</Action>
<Control ID="WeightedRandom">
<input_port name="weights">Weights for the children, separated by semicolon.</input_port>
</Control>
<Control ID="InterruptableSequence">
</Control>
</TreeNodesModel>
<!-- ////////// -->
</root>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0"?>
<root main_tree_to_execute="robotTree">
<!-- ////////// -->
<BehaviorTree ID="robotTree">
<ReactiveSequence>
<Inverter>
@@ -30,48 +29,5 @@
</Control>
</ReactiveSequence>
</BehaviorTree>
<!-- ////////// -->
<TreeNodesModel>
<Action ID="ActorAnimation">
<input_port name="animation">Name of animation to play</input_port>
</Action>
<Action ID="ActorMovement">
<input_port name="animation">Name of animation to play</input_port>
<input_port name="target">Pose to move to</input_port>
</Action>
<Condition ID="IsCalled"/>
<Action ID="SetCalledTo">
<input_port name="state">state to set called to</input_port>
</Action>
<Action ID="GenerateXYPose">
<input_port name="area">Area to generate pose in</input_port>
<output_port name="pose">Generated pose in area</output_port>
</Action>
<Condition ID="InAreaTest">
<input_port name="area">Bounds to check in</input_port>
<input_port name="pose">Position of object</input_port>
</Condition>
<Action ID="OffsetPose">
<input_port name="input">initial position as Pose</input_port>
<input_port name="offset">offset as a Point</input_port>
<input_port name="orientation">rotation of resulting pose as Quaternion</input_port>
<output_port name="output">generated new pose</output_port>
</Action>
<Action ID="RandomFailure">
<input_port name="failureChance">Chance to fail from 0 to 1</input_port>
</Action>
<Action ID="RobotMove">
<input_port name="target">Target pose of robot.</input_port>
</Action>
<Action ID="SetRobotVelocity">
<input_port name="velocity">Target velocity of robot</input_port>
</Action>
<Control ID="WeightedRandom">
<input_port name="weights">Weights for the children, separated by semicolon.</input_port>
</Control>
<Control ID="InterruptableSequence">
</Control>
</TreeNodesModel>
<!-- ////////// -->
</root>

View File

@@ -12,10 +12,7 @@
std::shared_ptr<rclcpp::Node> node;
void common_goal_response(
const rclcpp_action::ClientGoalHandle
<control_msgs::action::FollowJointTrajectory>::SharedPtr& future)
{
void common_goal_response(const rclcpp_action::ClientGoalHandle<control_msgs::action::FollowJointTrajectory>::SharedPtr& future){
RCLCPP_DEBUG(
node->get_logger(), "common_goal_response time: %f",
rclcpp::Clock().now().seconds());
@@ -27,10 +24,7 @@ void common_goal_response(
}
}
void common_result_response(
const rclcpp_action::ClientGoalHandle
<control_msgs::action::FollowJointTrajectory>::WrappedResult & result)
{
void common_result_response(const rclcpp_action::ClientGoalHandle<control_msgs::action::FollowJointTrajectory>::WrappedResult & result){
printf("common_result_response time: %f\n", rclcpp::Clock().now().seconds());
switch (result.code) {
case rclcpp_action::ResultCode::SUCCEEDED:
@@ -48,10 +42,8 @@ void common_result_response(
}
}
void common_feedback(
const rclcpp_action::ClientGoalHandle<control_msgs::action::FollowJointTrajectory>::SharedPtr&,
const std::shared_ptr<const control_msgs::action::FollowJointTrajectory::Feedback>& feedback)
{
void common_feedback(const rclcpp_action::ClientGoalHandle<control_msgs::action::FollowJointTrajectory>::SharedPtr&,
const std::shared_ptr<const control_msgs::action::FollowJointTrajectory::Feedback>& feedback){
std::cout << "feedback->desired.positions :";
for (auto & x : feedback->desired.positions) {
std::cout << x << "\t";
@@ -64,8 +56,7 @@ void common_feedback(
std::cout << std::endl;
}
int main(int argc, char * argv[])
{
int main(int argc, char * argv[]){
rclcpp::init(argc, argv);
node = std::make_shared<rclcpp::Node>("trajectory_test_node");
@@ -78,10 +69,10 @@ int main(int argc, char * argv[])
node->get_node_graph_interface(),
node->get_node_logging_interface(),
node->get_node_waitables_interface(),
"/arm_controller/follow_joint_trajectory");
"/arm_controller/follow_joint_trajectory"
);
bool response =
action_client->wait_for_action_server(std::chrono::seconds(10));
bool response = action_client->wait_for_action_server(std::chrono::seconds(10));
if (!response) {
throw std::runtime_error("could not get action server");
}
@@ -169,16 +160,13 @@ int main(int argc, char * argv[])
auto goal_handle_future = action_client->async_send_goal(goal_msg, opt);
if (rclcpp::spin_until_future_complete(node, goal_handle_future) !=
rclcpp::FutureReturnCode::SUCCESS)
{
if (rclcpp::spin_until_future_complete(node, goal_handle_future) != rclcpp::FutureReturnCode::SUCCESS){
RCLCPP_ERROR(node->get_logger(), "send goal call failed :(");
return 1;
}
RCLCPP_ERROR(node->get_logger(), "send goal call ok :)");
const rclcpp_action::ClientGoalHandle<control_msgs::action::FollowJointTrajectory>::SharedPtr&
goal_handle = goal_handle_future.get();
const rclcpp_action::ClientGoalHandle<control_msgs::action::FollowJointTrajectory>::SharedPtr& goal_handle = goal_handle_future.get();
if (!goal_handle) {
RCLCPP_ERROR(node->get_logger(), "Goal was rejected by server");
return 1;
@@ -188,9 +176,7 @@ int main(int argc, char * argv[])
// Wait for the server to be done with the goal
auto result_future = action_client->async_get_result(goal_handle);
RCLCPP_INFO(node->get_logger(), "Waiting for result");
if (rclcpp::spin_until_future_complete(node, result_future) !=
rclcpp::FutureReturnCode::SUCCESS)
{
if (rclcpp::spin_until_future_complete(node, result_future) != rclcpp::FutureReturnCode::SUCCESS){
RCLCPP_ERROR(node->get_logger(), "get result call failed :(");
return 1;
}

View File

@@ -33,7 +33,8 @@ target_link_libraries(ign_actor_plugin
install(TARGETS
ign_actor_plugin
DESTINATION lib/${PROJECT_NAME}
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY animation DESTINATION share/${PROJECT_NAME})
ament_package()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -68,12 +68,8 @@ void ActorSystem::switchAnimation(EntityComponentManager &_ecm, char *animationN
}
double Angle(ignition::math::Quaterniond a,ignition::math::Quaterniond b){
auto dot = fmin(abs(a.Dot(b)),1.0);
if(dot > 0.999999){
return 0.0;
}else{
return acos(dot) * 2;
}
auto dot = fmin(abs(a.Normalized().Dot(b.Normalized())),1.0);
return acos(dot);
}
void ActorSystem::PreUpdate(const UpdateInfo &_info, EntityComponentManager &_ecm) {
@@ -184,6 +180,8 @@ void ActorSystem::PreUpdate(const UpdateInfo &_info, EntityComponentManager &_ec
}
movementDetails.rotateToEndDuration = Angle(movementDetails.targetDiff.Rot(),movementDetails.target.Rot()) / turnSpeed;
igndbg << movementDetails.rotateToTargetDuration << " " <<movementDetails.moveDuration << " " << movementDetails.rotateToEndDuration << std::endl;
}
movementDetails.time += deltaTimeSeconds;

View File

@@ -1,14 +1,28 @@
import os
from ament_index_python import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, ExecuteProcess, RegisterEventHandler
from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription, ExecuteProcess, RegisterEventHandler, TimerAction
from launch.event_handlers import OnProcessExit
from launch_ros.actions import Node, SetParameter
from launch.launch_description_sources import PythonLaunchDescriptionSource
from moveit_configs_utils import MoveItConfigsBuilder
from launch.substitutions import LaunchConfiguration, TextSubstitution
from launch.conditions import LaunchConfigurationEquals
import xacro
def generate_launch_description():
scene_launch_arg = DeclareLaunchArgument(
"scene", default_value=TextSubstitution(text="Coex")
)
worldFile = open('/tmp/gazebo_world.sdf', 'w')
worldFile.write(xacro.process(os.path.join(get_package_share_directory('ign_world'), 'world', 'world.sdf')))
worldFile.flush()
worldFile.close()
scene = LaunchConfiguration('scene')
moveit_config = MoveItConfigsBuilder("iisy", package_name="iisy_config").to_moveit_configs()
load_joint_state_broadcaster = ExecuteProcess(
@@ -39,8 +53,8 @@ def generate_launch_description():
parameters=[
{
"trees": [
get_package_share_directory('btree')+'/trees/actorTreeCoex.xml',
get_package_share_directory('btree')+'/trees/robotTreeCoex.xml'
[get_package_share_directory('btree'), '/trees/actorTree', scene, '.xml'],
[get_package_share_directory('btree'), '/trees/robotTree', scene, '.xml'],
],
"areas": [
"safeArea",
@@ -79,21 +93,24 @@ def generate_launch_description():
)
return LaunchDescription([
scene_launch_arg,
IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(get_package_share_directory('ros_gz_sim'), 'launch', 'gz_sim.launch.py')),
launch_arguments={'gz_args': '-v 4 -r '+get_package_share_directory('ign_world')+'/world/gaz_new_test.sdf'}.items(),
launch_arguments={'gz_args': '-v 4 -r /tmp/gazebo_world.sdf'}.items(),
),
Node(
package='ros_gz_sim',
executable='create',
arguments=[
'-name', 'office',
'-name', 'conveyor',
'-allow_renaming', 'true',
'-string', xacro.process(os.path.join(get_package_share_directory('ign_world'), 'world', 'conveyor.sdf')),
#'-file', 'https://fuel.ignitionrobotics.org/1.0/openrobotics/models/Gazebo',
# '-file', 'https://fuel.ignitionrobotics.org/1.0/openrobotics/models/Gazebo',
],
output='screen'
output='screen',
condition=LaunchConfigurationEquals('scene', 'Coop')
),
Node(
@@ -112,7 +129,12 @@ def generate_launch_description():
emulate_tty=True,
),
TimerAction(
period=10.0,
actions=[
btree,
]
),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(

View File

@@ -1,311 +0,0 @@
import os
import subprocess
import yaml
from launch import LaunchDescription
from launch_ros.actions import Node, SetParameter
from launch.actions import IncludeLaunchDescription, RegisterEventHandler, LogInfo, ExecuteProcess, ExecuteLocal, TimerAction
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import PathJoinSubstitution
from launch.launch_description_sources import PythonLaunchDescriptionSource
from ament_index_python.packages import get_package_share_directory
from launch.event_handlers import OnProcessExit
from launch.launch_description_entity import LaunchDescriptionEntity
from pathlib import Path
def load_file(package_name, file_path):
package_path = get_package_share_directory(package_name)
absolute_file_path = os.path.join(package_path, file_path)
try:
with open(absolute_file_path, 'r') as file:
print("Opened file")
return file.read()
except EnvironmentError: # parent of IOError, OSError *and* WindowsError where available
print("ERROR: load_file " + package_name + " | " + file_path + " -> " + absolute_file_path)
return None
def load_xacro(package_name, file_path):
package_path = get_package_share_directory(package_name)
absolute_file_path = os.path.join(package_path, file_path)
process = subprocess.run(["xacro", absolute_file_path], capture_output=True)
if process.returncode != 0:
print(process.stderr)
return process.stdout.decode("UTF-8")
def load_yaml(package_name, file_path):
package_path = get_package_share_directory(package_name)
absolute_file_path = os.path.join(package_path, file_path)
try:
with open(absolute_file_path, 'r') as file:
print("Opened file")
return yaml.safe_load(file)
except EnvironmentError: # parent of IOError, OSError *and* WindowsError where available
print("ERROR: load_yaml " + package_name + " | " + file_path + " -> " + absolute_file_path)
return None
def launch_chain(nodes: list[ExecuteLocal]):
generatedNodes: list[LaunchDescriptionEntity] = []
for index in range(1, len(nodes)):
generatedNodes.append(RegisterEventHandler(
OnProcessExit(
target_action=nodes[index-1],
on_exit=nodes[index]
)
))
generatedNodes.append(nodes[0])
return generatedNodes
def generate_launch_description():
robot_description_config = load_xacro('iisy_config', 'urdf/iisy.urdf')
robot_description = {'robot_description': robot_description_config}
robot_description_semantic_config = load_file('iisy_config', 'srdf/iisy.srdf')
robot_description_semantic = {'robot_description_semantic': robot_description_semantic_config}
kinematics_yaml = load_yaml('iisy_config', 'config/kinematics.yml')
robot_description_kinematics = {'robot_description_kinematics': kinematics_yaml}
controllers = {
"moveit_simple_controller_manager": load_yaml("iisy_config", "config/iisy_controllers.yml"),
"moveit_controller_manager": "moveit_ros_control_interface/Ros2ControlMultiManager",
}
ompl_planning_pipeline_config = {
'move_group': {
'planning_plugin': 'ompl_interface/OMPLPlanner',
'request_adapters': """default_planner_request_adapters/AddTimeOptimalParameterization default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints""",
'start_state_max_bounds_error': 0.1
}
}
ompl_planning_yaml = load_yaml('iisy_config', 'config/ompl_planning.yml')
ompl_planning_pipeline_config['move_group'].update(ompl_planning_yaml)
robot_description_planning = {
"robot_description_planning": PathJoinSubstitution(
[
FindPackageShare("iisy_config"),
"config/joint_limits.yml"
]
)
}
trajectory_execution = {
'moveit_manage_controllers': False,
'trajectory_execution.allowed_execution_duration_scaling': 1.2,
'trajectory_execution.allowed_goal_duration_margin': 0.5,
'trajectory_execution.allowed_start_tolerance': 0.01
}
planning_scene_monitor_parameters = {
"publish_planning_scene": True,
"publish_geometry_updates": True,
"publish_state_updates": True,
"publish_transforms_updates": True
}
planning = {
"move_group": {
"planning_plugin": "ompl_interface/OMPLPlanner",
"request_adapters": "default_planner_request_adapters/AddTimeParameterization default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints",
"start_state_max_bounds_error": 0.1
}
}
spawn_robot = Node(
package='ros_gz_sim',
executable='create',
arguments=['-world', 'default', '-string', robot_description_config],
output='screen'
)
rviz = Node(
package='rviz2',
executable='rviz2',
arguments=['-d', os.path.join(get_package_share_directory("ign_world"), 'rviz', 'iisy.rviz')],
parameters=[
robot_description,
robot_description_semantic,
robot_description_planning,
ompl_planning_pipeline_config,
robot_description_kinematics,
planning,
trajectory_execution,
controllers,
planning_scene_monitor_parameters,
],
)
controller_manager = Node(
package="controller_manager",
executable="ros2_control_node",
parameters=[
robot_description,
str(Path(get_package_share_directory("iisy_config")+"/config/iisy_controllers.yaml")),
],
)
load_joint_state_broadcaster = ExecuteProcess(
cmd=['ros2', 'control', 'load_controller', '--set-state', 'active',
'joint_state_broadcaster'],
output='both'
)
load_joint_trajectory_controller = ExecuteProcess(
cmd=['ros2', 'control', 'load_controller', '--set-state', 'active',
'joint_trajectory_controller'],
output='both'
)
move_group = Node(
package='moveit_ros_move_group',
executable='move_group',
# prefix='xterm -fs 10 -e gdb --ex run --args',
output='both',
parameters=[
robot_description,
robot_description_semantic,
robot_description_planning,
ompl_planning_pipeline_config,
robot_description_kinematics,
planning,
trajectory_execution,
controllers,
planning_scene_monitor_parameters,
# octomap_config,
# octomap_updater_config
]
)
test = Node(
package='moveit_test',
executable='move',
output='both',
parameters=[
robot_description,
robot_description_semantic,
robot_description_planning,
ompl_planning_pipeline_config,
robot_description_kinematics,
planning,
trajectory_execution,
controllers,
planning_scene_monitor_parameters,
# octomap_config,
# octomap_updater_config
],
)
# octomap_config = {'octomap_frame': 'camera_rgb_optical_frame',
# 'octomap_resolution': 0.05,
# 'max_range': 5.0}
# octomap_updater_config = load_yaml('moveit_tutorials', 'config/sensors_3d.yaml')
pkg_ros_gz_sim = get_package_share_directory('ros_gz_sim')
return LaunchDescription([
#IncludeLaunchDescription(
# PythonLaunchDescriptionSource(os.path.join(pkg_ros_gz_sim, 'launch', 'gz_sim.launch.py')),
# launch_arguments={'gz_args': '-r '+get_package_share_directory('ign_world')+'/world/gaz_new_test.sdf'}.items(),
#),
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=["/clock[rosgraph_msgs/msg/Clock@ignition.msgs.Clock"],
output='both',
),
SetParameter(name="use_sim_time", value=True),
move_group,
#RegisterEventHandler(
# OnProcessExit(
# target_action=spawn_robot,
# on_exit=[load_joint_state_broadcaster]
# )
#),
controller_manager,
RegisterEventHandler(
OnProcessExit(
target_action=load_joint_state_broadcaster,
on_exit=[load_joint_trajectory_controller]
)
),
RegisterEventHandler(
OnProcessExit(
target_action=load_joint_trajectory_controller,
on_exit=TimerAction(period=10.0,actions=[test])
)
),
#spawn_robot,
load_joint_state_broadcaster,
#load_joint_trajectory_controller,
rviz,
Node(
package='ros_actor_action_server',
executable='ros_actor_action_server'),
Node(
package='tf2_ros',
executable='static_transform_publisher',
name='lidar_1_broadcaster',
arguments=[
"--x", "1",
"--y", "-1.9",
"--z", "1",
"--roll", "1.5707963267949",
"--pitch", "0",
"--yaw", "0",
"--frame-id", "world",
"--child-frame-id", "lidar_1_link"]
),
Node(
package='tf2_ros',
executable='static_transform_publisher',
name='lidar_2_broadcaster',
arguments=[
"--x", "-1.9",
"--y", "1",
"--z", "1",
"--roll", "0",
"--pitch", "0",
"--yaw", "0",
"--frame-id", "world",
"--child-frame-id", "lidar_2_link"]
),
#Node(
# package='ros_gz_bridge',
# executable='parameter_bridge',
# arguments=["/world/default/model/iisy/joint_state[sensor_msgs/msg/JointState@ignition.msgs.Model"],
# output='both',
# remappings=[
# ('/world/default/model/iisy/joint_state', '/joint_states'),
# ]
#),
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
output='both',
parameters=[robot_description]
),
])

View File

@@ -1,55 +0,0 @@
import os
from ament_index_python import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch_ros.actions import Node, SetParameter
from launch.launch_description_sources import PythonLaunchDescriptionSource
from moveit_configs_utils import MoveItConfigsBuilder
from xacro import process as xacro_process
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("iisy", package_name="iisy_config").to_moveit_configs()
return LaunchDescription([
SetParameter(name="use_sim_time", value=True),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(get_package_share_directory('ros_gz_sim'), 'launch', 'gz_sim.launch.py')),
launch_arguments={'gz_args': '-v 4 -r '+get_package_share_directory('ign_world')+'/world/gaz_new_test.sdf'}.items(),
),
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=["/clock@rosgraph_msgs/msg/Clock[ignition.msgs.Clock"],
output='both',
),
#Node(
# package='ros_gz_bridge',
# executable='parameter_bridge',
# arguments=["/world/default/dynamic_pose/info@tf2_msgs/msg/TFMessage]ignition.msgs.Pose_V"],
# output='both',
# remappings=[
# ('/world/default/dynamic_pose/info', '/tf'),
# ]
#),
Node(
package='ros_actor_action_server',
executable='ros_actor_action_server'
),
#Node(
# package='ros_gz_sim',
# executable='create',
# arguments=['-world', 'default', '-string', xacro_process(os.path.join(get_package_share_directory('iisy_config'), 'config', 'iisy_xacro.urdf'))],
# output='screen'
#),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(
str(moveit_config.package_path / "launch/demo.launch.py")
),
),
])

Binary file not shown.

Binary file not shown.

View File

@@ -1,7 +1,7 @@
<sdf version="1.6">
<model name="office">
<model name="conveyor">
<static>true</static>
<link name="office">
<link name="conveyor">
<visual name="visual">
<geometry>
<mesh>

View File

@@ -1,75 +0,0 @@
<sdf version="1.6">
<world name="default">
<physics name="1ms" type="ignored">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
</physics>
<plugin name='ignition::gazebo::systems::Physics' filename='ignition-gazebo-physics-system'/>
<plugin name='ignition::gazebo::systems::UserCommands' filename='ignition-gazebo-user-commands-system'/>
<plugin name='ignition::gazebo::systems::SceneBroadcaster' filename='ignition-gazebo-scene-broadcaster-system'/>
<plugin name='ignition::gazebo::systems::Contact' filename='ignition-gazebo-contact-system'/>
<light type="directional" name="sun">
<cast_shadows>true</cast_shadows>
<pose>0 0 10 0 0 0</pose>
<diffuse>0.8 0.8 0.8 1</diffuse>
<specular>0.2 0.2 0.2 1</specular>
<attenuation>
<range>1000</range>
<constant>0.9</constant>
<linear>0.01</linear>
<quadratic>0.001</quadratic>
</attenuation>
<direction>-0.5 0.1 -0.9</direction>
</light>
<actor name="actor_walking">
<plugin name="ignition::gazebo::ActorSystem" filename="/home/ros/workspace/install/ign_actor_plugin/lib/ign_actor_plugin/libign_actor_plugin.so">
<x>2</x>
<y>2</y>
<rot>180</rot>
</plugin>
<skin>
<filename>/home/ros/walk.dae</filename>
<scale>1.0</scale>
</skin>
<animation name='walk'>
<filename>/home/ros/walk.dae</filename>
<interpolate_x>true</interpolate_x>
</animation>
<animation name='standing_extend_arm'>
<filename>/home/ros/standing_extend_arm.dae</filename>
</animation>
<animation name='standing_retract_arm'>
<filename>/home/ros/standing_retract_arm.dae</filename>
</animation>
</actor>
<model name="ground_plane">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
</collision>
<visual name="visual">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
<material>
<ambient>0.8 0.8 0.8 1</ambient>
<diffuse>0.8 0.8 0.8 1</diffuse>
<specular>0.8 0.8 0.8 1</specular>
</material>
</visual>
</link>
</model>
</world>
</sdf>

View File

@@ -0,0 +1,119 @@
<sdf version="1.6">
<world name="default">
<physics name="1ms" type="ignored">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
</physics>
<plugin name='ignition::gazebo::systems::Physics' filename='ignition-gazebo-physics-system'/>
<plugin name='ignition::gazebo::systems::UserCommands' filename='ignition-gazebo-user-commands-system'/>
<plugin name='ignition::gazebo::systems::SceneBroadcaster' filename='ignition-gazebo-scene-broadcaster-system'/>
<plugin name='ignition::gazebo::systems::Contact' filename='ignition-gazebo-contact-system'/>
<light type="point" name="point_light_1">
<cast_shadows>true</cast_shadows>
<pose>1 1 2.5 0 0 0</pose>
<visualize>false</visualize>
</light>
<light type="point" name="point_light_2">
<cast_shadows>true</cast_shadows>
<pose>5 1 2.5 0 0 0</pose>
<visualize>false</visualize>
</light>
<light type="point" name="point_light_3">
<cast_shadows>true</cast_shadows>
<pose>1 5 2.5 0 0 0</pose>
<visualize>false</visualize>
</light>
<light type="point" name="point_light_4">
<cast_shadows>true</cast_shadows>
<pose>5 5 2.5 0 0 0</pose>
<visualize>false</visualize>
</light>
<actor name="actor_walking">
<plugin name="ignition::gazebo::ActorSystem" filename="$(find ign_actor_plugin)/libign_actor_plugin.so">
<x>2</x>
<y>2</y>
<rot>180</rot>
</plugin>
<skin>
<filename>$(find ign_actor_plugin)/animation/standing_walk.dae</filename>
<scale>1.0</scale>
</skin>
<animation name='standing_walk'>
<filename>$(find ign_actor_plugin)/animation/standing_walk.dae</filename>
</animation>
<animation name='standing_extend_arm'>
<filename>$(find ign_actor_plugin)/animation/standing_extend_arm.dae</filename>
</animation>
<animation name='standing_retract_arm'>
<filename>$(find ign_actor_plugin)/animation/standing_retract_arm.dae</filename>
</animation>
<animation name='standing_to_low'>
<filename>$(find ign_actor_plugin)/animation/standing_to_low.dae</filename>
</animation>
<animation name='low_to_standing'>
<filename>$(find ign_actor_plugin)/animation/low_to_standing.dae</filename>
</animation>
<animation name='low_grab'>
<filename>$(find ign_actor_plugin)/animation/low_grab.dae</filename>
</animation>
<animation name='low_inspect'>
<filename>$(find ign_actor_plugin)/animation/low_inspect.dae</filename>
</animation>
<animation name='low_put_back'>
<filename>$(find ign_actor_plugin)/animation/low_put_back.dae</filename>
</animation>
</actor>
<model name="room">
<static>true</static>
<link name="room">
<visual name="visual">
<geometry>
<mesh>
<uri>file://$(find ign_world)/model/room.stl</uri>
</mesh>
</geometry>
<material>
<ambient>0.8 0.8 0.8 1</ambient>
<diffuse>0.8 0.8 0.8 1</diffuse>
<specular>0.8 0.8 0.8 1</specular>
</material>
</visual>
</link>
</model>
<model name="ground_plane">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
</collision>
<visual name="visual">
<geometry>
<plane>
<normal>0 0 1</normal>
<size>100 100</size>
</plane>
</geometry>
<material>
<ambient>0.8 0.8 0.8 1</ambient>
<diffuse>0.8 0.8 0.8 1</diffuse>
<specular>0.8 0.8 0.8 1</specular>
</material>
</visual>
</link>
</model>
</world>
</sdf>

View File

@@ -258,39 +258,76 @@
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<gazebo reference="table">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<visual>
<material>
<diffuse>0.8 0.8 0.8 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="base_bottom">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
<visual>
<material>
<diffuse>0.5 0.5 0.5 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="base_top">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
<visual>
<material>
<diffuse>1 0.35 0 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="link1_full">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
<visual>
<material>
<diffuse>1 0.35 0 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="link2_bottom">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
<visual>
<material>
<diffuse>1 0.35 0 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="link2_top">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
<visual>
<material>
<diffuse>1 0.35 0 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="link3_bottom">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Orange</material>
<visual>
<material>
<diffuse>1 0.35 0 1 </diffuse>
</material>
</visual>
</gazebo>
<gazebo reference="link3_top">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<material>Gazebo/Grey</material>
<visual>
<material>
<diffuse>0.5 0.5 0.5 1 </diffuse>
</material>
</visual>
</gazebo>
</robot>

View File

@@ -2,39 +2,39 @@
# For beginners, we downscale velocity and acceleration limits.
# You can always specify higher scaling factors (<= 1.0) in your motion requests. # Increase the values below to 1.0 to always move at maximum speed.
default_velocity_scaling_factor: 0.1
default_acceleration_scaling_factor: 0.1
default_velocity_scaling_factor: 1
default_acceleration_scaling_factor: 1
# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration]
# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]
joint_limits:
base_link1_joint:
has_velocity_limits: true
max_velocity: 1.7453292519943
max_velocity: 3.49065850399
has_acceleration_limits: false
max_acceleration: 0
base_rot:
has_velocity_limits: true
max_velocity: 1.7453292519943
max_velocity: 3.49065850399
has_acceleration_limits: false
max_acceleration: 0
link1_link2_joint:
has_velocity_limits: true
max_velocity: 1.7453292519943
max_velocity: 3.49065850399
has_acceleration_limits: false
max_acceleration: 0
link2_link3_joint:
has_velocity_limits: true
max_velocity: 1.7453292519943
max_velocity: 5.23598775598
has_acceleration_limits: false
max_acceleration: 0
link2_rot:
has_velocity_limits: true
max_velocity: 1.7453292519943
max_velocity: 5.23598775598
has_acceleration_limits: false
max_acceleration: 0
link3_rot:
has_velocity_limits: true
max_velocity: 1.7453292519943
max_velocity: 6.98131700798
has_acceleration_limits: false
max_acceleration: 0

View File

@@ -24,7 +24,7 @@ arm_controller:
state_interfaces:
- position
- velocity
open_loop_control: true
constraints:
stopped_velocity_tolerance: 0.01
goal_time: 0.0

BIN
src/iisy_config/stl/link_2_bottom_low.stl Executable file → Normal file

Binary file not shown.

View File

@@ -25,7 +25,9 @@ void sendAction(mqd_t queue, ActionMessage *message) {
void waitForState(FeedbackMessage *currentFeedback,ActorPluginState state){
std::unique_lock lock(feedbackMutex);
stateCondition.wait(lock,[&currentFeedback,state]{return currentFeedback->state==state;});
stateCondition.wait(lock,[&currentFeedback,state]{
return currentFeedback->state==state;
});
return;
}
@@ -99,10 +101,12 @@ int main(int argc, char **argv) {
}
if (newFeedback.state==IDLE) {
if(currentFeedback.state==ANIMATION && currentAnimationGoalPtr!=nullptr){
std::cout << "Finished Animation. " << std::endl;
currentAnimationGoalPtr->succeed(std::make_shared<ros_actor_action_server_msgs::action::Animation_Result>());
currentAnimationGoalPtr = nullptr;
}
if(currentFeedback.state==MOVEMENT && currentMovementGoalPtr!=nullptr){
std::cout << "Finished Movement. " << std::endl;
currentMovementGoalPtr->succeed(std::make_shared<ros_actor_action_server_msgs::action::Movement_Result>());
currentMovementGoalPtr = nullptr;
}
@@ -120,14 +124,14 @@ int main(int argc, char **argv) {
rosMutex.lock();
if (currentFeedback.state == IDLE) {
std::cout << "Accepting..." << std::endl;
std::cout << "Accepting Animation..." << std::endl;
currentAction.animationSpeed = animationGoal->animation_speed;
strcpy(currentAction.animationName, animationGoal->animation_name.data());
return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
} else {
std::cout << "Rejecting..." << std::endl;
std::cout << "Rejecting Animation..." << std::endl;
rosMutex.unlock();
return rclcpp_action::GoalResponse::REJECT;
}
@@ -137,9 +141,11 @@ int main(int argc, char **argv) {
return rclcpp_action::CancelResponse::REJECT;
} else {
rosMutex.lock();
std::cout << "Cancelling Animation..." << std::endl;
sendAction(actionQueue, &cancelAction);
waitForState(&currentFeedback, IDLE);
std::cout << "Cancelled Animation..." << std::endl;
rosMutex.unlock();
return rclcpp_action::CancelResponse::ACCEPT;
@@ -161,7 +167,7 @@ int main(int argc, char **argv) {
[&currentAction, &currentFeedback](__attribute__((unused)) const rclcpp_action::GoalUUID goalUuid, const MovementGoalPtr &movementGoal) {
rosMutex.lock();
if (currentFeedback.state == IDLE) {
std::cout << "Accepting..." << std::endl;
std::cout << "Accepting Movement..." << std::endl;
currentAction.target = movementGoal->target;
currentAction.animationSpeed = movementGoal->animation_distance;
@@ -169,7 +175,7 @@ int main(int argc, char **argv) {
return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
} else {
std::cout << "Rejecting..." << std::endl;
std::cout << "Rejecting Movement..." << std::endl;
rosMutex.unlock();
return rclcpp_action::GoalResponse::REJECT;
}
@@ -179,9 +185,11 @@ int main(int argc, char **argv) {
return rclcpp_action::CancelResponse::REJECT;
} else {
rosMutex.lock();
std::cout << "Cancelling Movement..." << std::endl;
sendAction(actionQueue, &cancelAction);
waitForState(&currentFeedback, IDLE);
std::cout << "Cancelled Movement..." << std::endl;
rosMutex.unlock();
return rclcpp_action::CancelResponse::ACCEPT;

View File

@@ -1,2 +1,2 @@
ros2 action send_goal /ActorPlugin/animation ign_actor_plugin_msgs/action/Animation "{animation_name: 'walk', animation_speed: 1.0}"
ros2 action send_goal /ActorPlugin/movement ros_actor_action_server_msgs/action/Movement '{animation_name: "walk", animation_speed: 1.0, animation_distance: 1.5, target: {orientation: {x: 0.0, y: 0.0, z: 0.0, w: 0.0}, position: {x: 2.0, y: 0.0, z: 0.0}}}'
ros2 action send_goal /ActorPlugin/animation ign_actor_plugin_msgs/action/Animation "{animation_name: 'standing_walk', animation_speed: 1.0}"
ros2 action send_goal /ActorPlugin/movement ros_actor_action_server_msgs/action/Movement '{animation_name: "standing_walk", animation_speed: 1.0, animation_distance: 1.5, target: {orientation: {x: 0.0, y: 0.0, z: 0.0, w: 0.0}, position: {x: 2.0, y: 0.0, z: 0.0}}}'