Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • gsaurel/dynamic_graph_bridge
  • stack-of-tasks/dynamic_graph_bridge
2 results
Show changes
Commits on Source (149)
Showing
with 257 additions and 481 deletions
# format (Guilhem Saurel, 2022-09-06)
426c21a7f4e5b445d17825235f983e2f8e1a86ec
# Please don't edit this file, and use the version generated at include: http://rainboard.laas.fr/project/dynamic_graph_bridge/.gitlab-ci.yml
# http://rainboard.laas.fr/project/dynamic_graph_bridge/.gitlab-ci.yml
variables:
GIT_SUBMODULE_STRATEGY: "recursive"
CCACHE_BASEDIR: "${CI_PROJECT_DIR}"
CCACHE_DIR: "${CI_PROJECT_DIR}/ccache"
cache:
paths:
- ccache
.robotpkg-py-dynamic-graph-bridge-v3: &robotpkg-py-dynamic-graph-bridge-v3
except:
- gh-pages
script:
- mkdir -p ccache
- cd /root/robotpkg/wip
- git pull
- cd py-dynamic-graph-bridge-v3
- make checkout MASTER_REPOSITORY="dir ${CI_PROJECT_DIR}"
- make install
- cd work.$(hostname)/$(make show-var VARNAME=DISTNAME)
- make test
robotpkg-py-dynamic-graph-bridge-v3-14.04-release:
<<: *robotpkg-py-dynamic-graph-bridge-v3
image: eur0c.laas.fr:5000/stack-of-tasks/dynamic_graph_bridge/py-dynamic-graph-bridge-v3:14.04
robotpkg-py-dynamic-graph-bridge-v3-16.04-release:
<<: *robotpkg-py-dynamic-graph-bridge-v3
image: eur0c.laas.fr:5000/stack-of-tasks/dynamic_graph_bridge/py-dynamic-graph-bridge-v3:16.04
robotpkg-py-dynamic-graph-bridge-v3-18.04-release:
<<: *robotpkg-py-dynamic-graph-bridge-v3
image: eur0c.laas.fr:5000/stack-of-tasks/dynamic_graph_bridge/py-dynamic-graph-bridge-v3:18.04
doc-coverage:
<<: *robotpkg-py-dynamic-graph-bridge-v3
image: eur0c.laas.fr:5000/stack-of-tasks/dynamic_graph_bridge/py-dynamic-graph-bridge-v3:16.04
before_script:
- echo -e 'CXXFLAGS+= --coverage\nLDFLAGS+= --coverage\nPKG_DEFAULT_OPTIONS= debug' >> /opt/openrobots/etc/robotpkg.conf
after_script:
- cd /root/robotpkg/wip/py-dynamic-graph-bridge-v3
- cd work.$(hostname)/$(make show-var VARNAME=DISTNAME)
- make doc
- mv doc/doxygen-html ${CI_PROJECT_DIR}
- mkdir -p ${CI_PROJECT_DIR}/coverage/
- gcovr -r .
- gcovr -r . --html --html-details -o ${CI_PROJECT_DIR}/coverage/index.html
artifacts:
expire_in: 1 day
paths:
- doxygen-html/
- coverage/
[submodule "cmake"] [submodule "cmake"]
path = cmake path = cmake
url = git://github.com/jrl-umi3218/jrl-cmakemodules.git url = https://github.com/jrl-umi3218/jrl-cmakemodules.git
ci:
autoupdate_branch: 'devel'
repos:
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v14.0.6
hooks:
- id: clang-format
args: [--style=Google]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
hooks:
- id: check-added-large-files
- id: check-ast
- id: check-executables-have-shebangs
- id: check-json
- id: check-merge-conflict
- id: check-symlinks
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: destroyed-symlinks
- id: detect-private-key
- id: end-of-file-fixer
- id: fix-byte-order-marker
- id: mixed-line-ending
- id: trailing-whitespace
- repo: https://github.com/psf/black
rev: 22.8.0
hooks:
- id: black
- repo: https://github.com/PyCQA/flake8
rev: 5.0.4
hooks:
- id: flake8
- repo: https://github.com/cheshirekow/cmake-format-precommit
rev: v0.6.13
hooks:
- id: cmake-format
sudo: required
services:
- docker
before_install:
- docker build -t dyngb-trusty -f ./travis_custom/Dockerfile .
- docker run -t -d --name dyngb-trusty-test dyngb-trusty
- docker exec dyngb-trusty-test sudo mkdir -p /catkin_ws_dyngb/src
- docker exec dyngb-trusty-test sudo sh -c "cd /catkin_ws_dyngb/src;. /opt/ros/indigo/setup.sh;catkin_init_workspace"
- docker exec dyngb-trusty-test sudo git clone --recursive https://github.com/stack-of-tasks/dynamic_graph_bridge.git /catkin_ws_dyngb/src/dynamic_graph_bridge
script:
- docker exec dyngb-trusty-test sudo sh -c "cd /catkin_ws_dyngb;. /opt/ros/indigo/setup.sh;. /home/docker/setup-opt-robotpkg.sh;catkin_make"
# Copyright (C) 2008-2013 LAAS-CNRS, JRL AIST-CNRS. # Copyright (C) 2008-2020 LAAS-CNRS, JRL AIST-CNRS.
# #
# Author: Florent Lamiraux, Nirmal Giftsun # Author: Florent Lamiraux, Nirmal Giftsun, Guilhem Saurel
# #
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Catkin part
cmake_minimum_required(VERSION 2.4.6)
if(COMMAND cmake_policy) cmake_minimum_required(VERSION 3.1)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
SET(PROJECT_ORG stack-of-tasks) # Project properties
set(PROJECT_DESCRIPTION "Dynamic graph bridge library") set(PROJECT_ORG stack-of-tasks)
set(PROJECT_NAME dynamic_graph_bridge) set(PROJECT_NAME dynamic_graph_bridge)
set(PROJECT_URL "https://github.com/stack-of-tasks/dynamic_graph_bridge") set(PROJECT_DESCRIPTION "Dynamic graph bridge library")
set(PROJECT_SUFFIX "-v3") set(PROJECT_URL "https://github.com/${PROJECT_ORG}/${PROJECT_NAME}")
# Export CMake Target
SET(PROJECT_USE_CMAKE_EXPORT TRUE)
# Disable failing compilation when a compilation error appears # Project options
set(CXX_DISABLE_WERROR False) option(BUILD_PYTHON_INTERFACE "Build the python bindings" ON)
# Make sure that every header is generated in dynamic-graph # Project configuration
SET(CUSTOM_HEADER_DIR ${PROJECT_NAME}) set(PROJECT_USE_CMAKE_EXPORT TRUE)
set(CUSTOM_HEADER_DIR ${PROJECT_NAME})
set(CXX_DISABLE_WERROR FALSE)
set(DOXYGEN_USE_MATHJAX YES)
set(CATKIN_ENABLE_TESTING OFF)
# JRL-cmakemodule setup
include(cmake/base.cmake) include(cmake/base.cmake)
include(cmake/boost.cmake)
# Specify the project.
cmake_policy(SET CMP0048 NEW)
PROJECT(${PROJECT_NAME}
LANGUAGES
CXX
VERSION
${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}
)
INCLUDE(cmake/boost.cmake)
INCLUDE(cmake/eigen.cmake)
include(cmake/ros.cmake) include(cmake/ros.cmake)
include(cmake/GNUInstallDirs.cmake)
include(cmake/python.cmake)
include(cmake/test.cmake)
SET(CATKIN_REQUIRED_COMPONENTS
roscpp std_msgs message_generation std_srvs geometry_msgs sensor_msgs
tf tf2_bullet)
SET(CATKIN_DEPENDS_LIBRARIES ros_bridge sot_loader)
## LAAS cmake submodule part
SET(DOXYGEN_USE_MATHJAX YES) # Project definition
compute_project_args(PROJECT_ARGS LANGUAGES CXX)
# Add option build python interface project(${PROJECT_NAME} ${PROJECT_ARGS})
OPTION (BUILD_PYTHON_INTERFACE "Build the python binding" ON)
# Project dependencies
set(CUSTOM_HEADER_DIR dynamic_graph_bridge) set(CATKIN_REQUIRED_COMPONENTS
roscpp
std_msgs
message_generation
std_srvs
geometry_msgs
sensor_msgs
tf2_ros
realtime_tools)
if(BUILD_PYTHON_INTERFACE)
add_project_dependency(dynamic-graph-python 4.0.0 REQUIRED)
string(REGEX REPLACE "-" "_" PY_NAME ${PROJECT_NAME})
set(CATKIN_REQUIRED_COMPONENTS ${CATKIN_REQUIRED_COMPONENTS} rospy)
endif(BUILD_PYTHON_INTERFACE)
add_project_dependency(Boost REQUIRED COMPONENTS program_options)
add_project_dependency(dynamic_graph_bridge_msgs 0.3.0 REQUIRED)
add_project_dependency(sot-core REQUIRED)
if(Boost_VERSION GREATER 107299 OR Boost_VERSION_MACRO GREATER 107299)
# Silence a warning about a deprecated use of boost bind by boost >= 1.73
# without dropping support for boost < 1.73
add_definitions(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)
endif()
find_package(catkin REQUIRED COMPONENTS ${CATKIN_REQUIRED_COMPONENTS})
# Main Library
set(${PROJECT_NAME}_HEADERS set(${PROJECT_NAME}_HEADERS
include/dynamic_graph_bridge/ros_init.hh include/${PROJECT_NAME}/fwd.hh
include/dynamic_graph_bridge/sot_loader.hh include/${PROJECT_NAME}/ros_init.hh
include/dynamic_graph_bridge/sot_loader_basic.hh include/${PROJECT_NAME}/sot_loader.hh
) include/${PROJECT_NAME}/sot_loader_basic.hh
include/${PROJECT_NAME}/ros_interpreter.hh
IF(BUILD_PYTHON_INTERFACE) src/converter.hh
set(${PROJECT_NAME}_HEADERS ${${PROJECT_NAME}_HEADERS} src/sot_to_ros.hh)
include/dynamic_graph_bridge/ros_interpreter.hh )
ENDIF(BUILD_PYTHON_INTERFACE) set(${PROJECT_NAME}_SOURCES src/ros_init.cpp src/sot_to_ros.cpp
src/ros_parameter.cpp)
IF(BUILD_PYTHON_INTERFACE)
FINDPYTHON() add_library(ros_bridge SHARED ${${PROJECT_NAME}_SOURCES}
STRING(REGEX REPLACE "-" "_" PY_NAME ${PROJECT_NAME}) ${${PROJECT_NAME}_HEADERS})
target_include_directories(ros_bridge SYSTEM PUBLIC ${catkin_INCLUDE_DIRS})
ADD_PROJECT_DEPENDENCY(dynamic-graph-python REQUIRED ) target_include_directories(ros_bridge PUBLIC $<INSTALL_INTERFACE:include>)
SET(CATKIN_REQUIRED_COMPONENTS ${CATKIN_REQUIRED_COMPONENTS} rospy) target_link_libraries(
SET(CATKIN_DEPENDS_LIBRARIES ${CATKIN_DEPENDS_LIBRARIES} ros_interpreter) ros_bridge ${catkin_LIBRARIES} sot-core::sot-core pinocchio::pinocchio
ENDIF(BUILD_PYTHON_INTERFACE) dynamic_graph_bridge_msgs::dynamic_graph_bridge_msgs)
SET(CATKIN_ENABLE_TESTING OFF) if(SUFFIX_SO_VERSION)
set_target_properties(ros_bridge PROPERTIES SOVERSION ${PROJECT_VERSION})
MESSAGE(STATUS "CATKIN_REQUIRED_COMPONENTS: ${CATKIN_REQUIRED_COMPONENTS}") endif(SUFFIX_SO_VERSION)
# Add catkin components
find_package(catkin REQUIRED if(NOT INSTALL_PYTHON_INTERFACE_ONLY)
COMPONENTS ${CATKIN_REQUIRED_COMPONENTS}) install(
find_package(realtime_tools) TARGETS ros_bridge
EXPORT ${TARGETS_EXPORT_NAME}
DESTINATION lib)
SEARCH_FOR_EIGEN() endif(NOT INSTALL_PYTHON_INTERFACE_ONLY)
SEARCH_FOR_BOOST()
SETUP_PROJECT_PACKAGE_FINALIZE()
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_INSTALL_RPATH "${LIBRARY_OUTPUT_PATH}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${LIBRARY_OUTPUT_PATH}")
set(PKG_CONFIG_ADDITIONAL_VARIABLES
${PKG_CONFIG_ADDITIONAL_VARIABLES}
plugindirname
plugindir
)
# Add dependency to SoT specific packages.
SET(SOT_PKGNAMES
dynamic_graph_bridge_msgs)
#add_project_dependency(realtime_tools 1.8 REQUIRED)
ADD_PROJECT_DEPENDENCY(dynamic-graph 3.0.0 REQUIRED)
ADD_PROJECT_DEPENDENCY(sot-core REQUIRED)
ADD_PROJECT_dependency(dynamic_graph_bridge_msgs)
foreach(sot_pkgname ${SOT_PKGNAMES})
add_required_dependency(${sot_pkgname})
pkg_check_modules(SOT_${sot_pkgname} REQUIRED ${sot_pkgname})
endforeach(sot_pkgname)
# Build ros_bridge library
add_library(ros_bridge
src/converter.hh
include/dynamic_graph_bridge/ros_init.hh src/ros_init.cpp
src/sot_to_ros.hh src/sot_to_ros.cpp
)
MESSAGE(STATUS "catkin_INCLUDE_DIRS: ${catkin_INCLUDE_DIRS}")
include_directories(${catkin_INCLUDE_DIRS})
target_include_directories(ros_bridge
PUBLIC
$<BUILD_INTERFACE:${CMAKE_BUILD_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
$<BUILD_INTERFACE:${EIGEN3_INCLUDE_DIR}>
$<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>
INTERFACE ${EIGEN3_INCLUDE_DIR}
$<INSTALL_INTERFACE:include>
)
#target_link_libraries(ros_bridge tf2_bullet)
target_link_libraries(ros_bridge
dynamic-graph::dynamic-graph)
target_link_libraries(ros_bridge
dynamic-graph::dynamic-graph)
MESSAGE(STATUS "catkin_LIBRARIES: ${catkin_LIBRARIES}")
target_link_libraries(ros_bridge
${catkin_LIBRARIES} )
install(TARGETS ros_bridge
EXPORT ${TARGETS_EXPORT_NAME}
DESTINATION lib)
# Add ros_bridge in the dynamic-graph-bridge pkg-config file.
# Make sure rpath are preserved during the install as ROS dependencies
# are not installed.
set_target_properties(ros_bridge PROPERTIES BUILD_WITH_INSTALL_RPATH True
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
macro(compile_plugin NAME)
message(lib path ${LIBRARY_OUTPUT_PATH})
file(MAKE_DIRECTORY "${LIBRARY_OUTPUT_PATH}/dynamic_graph/ros/${NAME}")
add_library(${NAME} SHARED src/${NAME}.cpp src/${NAME}.hh)
# Headers
target_include_directories(${NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_BUILD_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
$<BUILD_INTERFACE:${EIGEN3_INCLUDE_DIR}>
$<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>
INTERFACE ${EIGEN3_INCLUDE_DIR}
$<INSTALL_INTERFACE:include>
)
# Libraries
target_link_libraries(${NAME} dynamic-graph::dynamic-graph)
target_link_libraries(${NAME} sot-core::sot-core)
target_link_libraries(${NAME} ${CATKIN_DEPENDS_LIBRARIES})
add_dependencies(${NAME} ros_bridge)
target_link_libraries(${NAME} ros_bridge)
set_target_properties(${NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH True)
set_target_properties(${NAME} PROPERTIES PREFIX "")
install(TARGETS ${NAME} DESTINATION lib/plugin)
endmacro()
# Build Sot Entities
set(listplugins
ros_publish ros_subscribe ros_queued_subscribe ros_tf_listener ros_time)
foreach(aplugin ${listplugins})
compile_plugin(${aplugin})
endforeach()
target_link_libraries(ros_publish ros_bridge)
IF(BUILD_PYTHON_INTERFACE)
foreach(NAME ${listplugins})
dynamic_graph_python_module("ros/${NAME}"
${NAME}
ros/${NAME}/wrap
)
#PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap realtime_tools)
#PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap dynamic_graph)
#PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap sot-core)
PKG_CONFIG_USE_DEPENDENCY(ros/${NAME}/wrap dynamic_graph_bridge_msgs)
endforeach()
# ros_interperter library.
add_library(ros_interpreter src/ros_interpreter.cpp)
#pkg_config_use_dependency(ros_interpreter dynamic-graph)
#pkg_config_use_dependency(ros_interpreter sot-core)
#pkg_config_use_dependency(ros_interpreter roscpp)
pkg_config_use_dependency(ros_interpreter dynamic_graph_bridge_msgs)
#pkg_config_use_dependency(ros_interpreter dynamic-graph-python)
add_dependencies(ros_interpreter ros_bridge)
target_link_libraries(ros_interpreter roscpp)
target_link_libraries(ros_interpreter
dynamic-graph::dynamic-graph)
target_link_libraries(ros_interpreter sot-core::sot-core)
target_link_libraries(ros_interpreter
dynamic-graph-python::dynamic-graph-python)
target_link_libraries(ros_interpreter realtime_tools)
target_link_libraries(ros_interpreter ros_bridge)
set_target_properties(ros_interpreter PROPERTIES BUILD_WITH_INSTALL_RPATH True
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
message(cmakeinstalllibdir " is ${CMAKE_INSTALL_LIBDIR} ")
install(TARGETS ros_interpreter DESTINATION lib)
ENDIF(BUILD_PYTHON_INTERFACE)
MESSAGE(STATUS "CATKIN_DEPENDS_LIBRARIES: ${CATKIN_DEPENDS_LIBRARIES}")
# Stand alone embedded intepreter with a robot controller.
add_executable(geometric_simu src/geometric_simu.cpp
src/sot_loader.cpp src/sot_loader_basic.cpp)
target_link_libraries(geometric_simu dynamic-graph::dynamic-graph)
target_link_libraries(geometric_simu ros_bridge tf ${Boost_LIBRARIES}
${CMAKE_DL_LIBS})
target_link_libraries(geometric_simu ${CATKIN_DEPENDS_LIBRARIES})
# Sot loader library
add_library(sot_loader src/sot_loader.cpp src/sot_loader_basic.cpp)
target_link_libraries(sot_loader dynamic-graph::dynamic-graph)
target_link_libraries(sot_loader sot-core::sot-core)
target_link_libraries(sot_loader ${Boost_LIBRARIES} )
install(TARGETS sot_loader DESTINATION lib)
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(tests) add_subdirectory(tests)
# Deal with the ROS part. # install ros executables
add_service_files( FILES RunPythonFile.srv ) install(PROGRAMS scripts/robot_pose_publisher scripts/run_command
generate_messages( DEPENDENCIES std_msgs ) scripts/tf_publisher DESTINATION share/${PROJECT_NAME})
# This is necessary so that the pc file generated by catking is similar to
# the on done directly by jrl-cmake-modules
catkin_package(INCLUDE_DIRS include
CATKIN_DEPENDS
message_runtime roscpp realtime_tools tf2_bullet ${SOT_PKGNAMES} tf
LIBRARIES ${CATKIN_DEPENDS_LIBRARIES}
)
# Add libraries in pc file generated by cmake submodule
PKG_CONFIG_APPEND_LIBS(ros_bridge sot_loader)
# In the python interface needs to be build.
IF(BUILD_PYTHON_INTERFACE)
PKG_CONFIG_APPEND_LIBS(ros_interpreter)
#install ros executables
install(PROGRAMS
${CMAKE_SOURCE_DIR}/scripts/robot_pose_publisher
${CMAKE_SOURCE_DIR}/scripts/run_command
${CMAKE_SOURCE_DIR}/scripts/tf_publisher
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
# Service file.
install(FILES ./srv/RunPythonFile.srv
DESTINATION
${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/srv)
ENDIF(BUILD_PYTHON_INTERFACE)
message(cmake_install_bindir " is ${CMAKE_INSTALL_BINDIR} ")
# Install the geometrical simulation node
install(TARGETS geometric_simu
EXPORT ${TARGETS_EXPORT_NAME}
DESTINATION
${CATKIN_PACKAGE_SHARE_DESTINATION})
# Install package information # Install package information
install(FILES manifest.xml install(FILES manifest.xml package.xml DESTINATION share/${PROJECT_NAME})
DESTINATION
${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/)
SETUP_PROJECT_PACKAGE_FINALIZE()
dynamic-graph bindings # Dynamic Graph bindings
======================
[![Building Status](https://travis-ci.org/stack-of-tasks/dynamic_graph_bridge.svg?branch=master)](https://travis-ci.org/stack-of-tasks/dynamic_graph_bridge) [![Pipeline status](https://gitlab.laas.fr/stack-of-tasks/dynamic_graph_bridge/badges/master/pipeline.svg)](https://gitlab.laas.fr/stack-of-tasks/dynamic_graph_bridge/commits/master)
[![Pipeline status](https://gepgitlab.laas.fr/stack-of-tasks/dynamic_graph_bridge/badges/master/pipeline.svg)](https://gepgitlab.laas.fr/stack-of-tasks/dynamic_graph_bridge/commits/master) [![Coverage report](https://gitlab.laas.fr/stack-of-tasks/dynamic_graph_bridge/badges/master/coverage.svg?job=doc-coverage)](https://gepettoweb.laas.fr/doc/stack-of-tasks/dynamic_graph_bridge/master/coverage/)
[![Coverage report](https://gepgitlab.laas.fr/stack-of-tasks/dynamic_graph_bridge/badges/master/coverage.svg?job=doc-coverage)](http://projects.laas.fr/gepetto/doc/stack-of-tasks/dynamic_graph_bridge/master/coverage/) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/stack-of-tasks/dynamic_graph_bridge/master.svg)](https://results.pre-commit.ci/latest/github/stack-of-tasks/dynamic_graph_bridge)
This ROS package binds together the ROS framework with the This ROS package binds together the ROS framework with the
dynamic-graph real-time control architecture. dynamic-graph real-time control architecture.
Subproject commit 046c3be5553c4ea340eb672d0289627f0c07b1a4 Subproject commit 57c46b2d7b26bb0c25f8f98cfc2a9868e03be603
INPUT = @PROJECT_SOURCE_DIR@/include \ INPUT = @PROJECT_SOURCE_DIR@/include \
@PROJECT_SOURCE_DIR@/doc @PROJECT_SOURCE_DIR@/doc
/*
* Copyright CNRS 2021
*
* Author: Florent Lamiraux
*
* This file is part of sot-core.
*/
#ifndef DYNAMIC_GRAPH_BRIDGE_FWD_HH
#define DYNAMIC_GRAPH_BRIDGE_FWD_HH
#include <dynamic-graph/fwd.hh>
namespace dynamicgraph {
// classes defined in sot-core
class Interpreter;
typedef std::shared_ptr<Interpreter> InterpreterPtr_t;
} // namespace dynamicgraph
#endif // DYNAMIC_GRAPH_PYTHON_FWD_HH
#ifndef ROS_INIT_HH #ifndef ROS_INIT_HH
#define ROS_INIT_HH #define ROS_INIT_HH
#pragma GCC diagnostic push
#pragma GCC system_header
#include <ros/ros.h> #include <ros/ros.h>
#pragma GCC diagnostic pop
namespace dynamicgraph { namespace dynamicgraph {
ros::NodeHandle& rosInit(bool createAsyncSpinner = false, ros::NodeHandle& rosInit(bool createAsyncSpinner = false,
......
#ifndef DYNAMIC_GRAPH_BRIDGE_INTERPRETER_HH #ifndef DYNAMIC_GRAPH_BRIDGE_INTERPRETER_HH
#define DYNAMIC_GRAPH_BRIDGE_INTERPRETER_HH #define DYNAMIC_GRAPH_BRIDGE_INTERPRETER_HH
#pragma GCC diagnostic push
#pragma GCC system_header
#include <ros/ros.h> #include <ros/ros.h>
#pragma GCC diagnostic pop
#include <dynamic_graph_bridge_msgs/RunCommand.h> #include <dynamic_graph_bridge_msgs/RunCommand.h>
#include <dynamic_graph_bridge_msgs/RunPythonFile.h> #include <dynamic_graph_bridge_msgs/RunPythonFile.h>
#include <dynamic-graph/python/interpreter.hh> #include <dynamic-graph/python/interpreter.hh>
#include <dynamic_graph_bridge/fwd.hh>
namespace dynamicgraph { namespace dynamicgraph {
/// \brief This class wraps the implementation of the runCommand /// \brief This class wraps the implementation of the runCommand
......
#ifndef _ROS_DYNAMIC_GRAPH_PARAMETER_
#define _ROS_DYNAMIC_GRAPH_PARAMETER_
namespace dynamicgraph {
bool parameter_server_read_robot_description();
}
#endif /* _ROS_DYNAMIC_GRAPH_PARAMETER_ */
...@@ -4,17 +4,6 @@ ...@@ -4,17 +4,6 @@
* *
* CNRS * CNRS
* *
* This file is part of dynamic-graph-bridge.
* dynamic-graph-bridge is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
* dynamic-graph-bridge is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. You should
* have received a copy of the GNU Lesser General Public License along
* with dynamic-graph-bridge. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* --- INCLUDES ------------------------------------------------------------- */ /* --- INCLUDES ------------------------------------------------------------- */
...@@ -29,25 +18,25 @@ ...@@ -29,25 +18,25 @@
// STL includes // STL includes
#include <map> #include <map>
// Pinocchio includes
#include <pinocchio/fwd.hpp>
// Boost includes // Boost includes
#include <boost/program_options.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/program_options.hpp>
#include <boost/thread/thread.hpp> #include <boost/thread/thread.hpp>
// ROS includes // ROS includes
#pragma GCC diagnostic push #include <sensor_msgs/JointState.h>
#pragma GCC system_header #include <tf2_ros/transform_broadcaster.h>
#include "ros/ros.h"
#pragma GCC diagnostic pop
#include "ros/ros.h"
#include "std_srvs/Empty.h" #include "std_srvs/Empty.h"
#include <sensor_msgs/JointState.h>
#include <tf/transform_broadcaster.h>
// Sot Framework includes // Sot Framework includes
#include <sot/core/debug.hh>
#include <sot/core/abstract-sot-external-interface.hh> #include <sot/core/abstract-sot-external-interface.hh>
#include <sot/core/debug.hh>
// Dynamic-graph-bridge includes. // Dynamic-graph-bridge includes.
#include <dynamic_graph_bridge/sot_loader_basic.hh> #include <dynamic_graph_bridge/sot_loader_basic.hh>
...@@ -87,8 +76,8 @@ class SotLoader : public SotLoaderBasic { ...@@ -87,8 +76,8 @@ class SotLoader : public SotLoaderBasic {
virtual void startControlLoop(); virtual void startControlLoop();
// Robot Pose Publisher // Robot Pose Publisher
tf::TransformBroadcaster freeFlyerPublisher_; tf2_ros::TransformBroadcaster freeFlyerPublisher_;
tf::Transform freeFlyerPose_; geometry_msgs::TransformStamped freeFlyerPose_;
public: public:
SotLoader(); SotLoader();
......
...@@ -4,17 +4,6 @@ ...@@ -4,17 +4,6 @@
* *
* CNRS * CNRS
* *
* This file is part of dynamic_graph_bridge.
* dynamic_graph_bridge is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
* dynamic_graph_bridge is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. You should
* have received a copy of the GNU Lesser General Public License along
* with sot-core. If not, see <http://www.gnu.org/licenses/>.
*/ */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* --- INCLUDES ------------------------------------------------------------- */ /* --- INCLUDES ------------------------------------------------------------- */
...@@ -29,19 +18,23 @@ ...@@ -29,19 +18,23 @@
// STL includes // STL includes
#include <map> #include <map>
// Pinocchio includes
#include <pinocchio/fwd.hpp>
// Boost includes // Boost includes
#include <boost/program_options.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/program_options.hpp>
// ROS includes // ROS includes
#include <sensor_msgs/JointState.h>
#include "ros/ros.h" #include "ros/ros.h"
#include "std_srvs/Empty.h" #include "std_srvs/Empty.h"
#include <sensor_msgs/JointState.h>
// Sot Framework includes // Sot Framework includes
#include <sot/core/debug.hh>
#include <sot/core/abstract-sot-external-interface.hh> #include <sot/core/abstract-sot-external-interface.hh>
#include <sot/core/debug.hh>
namespace po = boost::program_options; namespace po = boost::program_options;
namespace dgs = dynamicgraph::sot; namespace dgs = dynamicgraph::sot;
......
<package format="2"> <package format="2">
<name>dynamic_graph_bridge</name> <name>dynamic_graph_bridge</name>
<version>3.0.8</version> <version>3.4.5</version>
<description> <description>
ROS bindings for dynamic graph. ROS bindings for dynamic graph.
</description> </description>
<maintainer email="hpp@laas.fr">hpp@laas.fr</maintainer> <maintainer email="guilhem.saurel@laas.fr">guilhem.saurel@laas.fr</maintainer>
<author email="hpp@laas.fr">hpp@laas.fr</author> <author email="hpp@laas.fr">hpp@laas.fr</author>
<license>LGPL</license> <license>LGPL</license>
...@@ -16,21 +16,20 @@ ...@@ -16,21 +16,20 @@
<rosdoc config="rosdoc.yaml" /> <rosdoc config="rosdoc.yaml" />
</export> </export>
<buildtool_depend>catkin</buildtool_depend> <buildtool_depend>catkin</buildtool_depend>
<build_depend>std_msgs</build_depend> <build_depend>std_msgs</build_depend>
<build_depend>std_srvs</build_depend> <build_depend>std_srvs</build_depend>
<build_depend>roscpp</build_depend> <build_depend>roscpp</build_depend>
<build_depend>geometry_msgs</build_depend> <build_depend>geometry_msgs</build_depend>
<build_depend>sensor_msgs</build_depend> <build_depend>sensor_msgs</build_depend>
<build_depend>tf</build_depend> <build_depend>tf2_ros</build_depend>
<build_depend>realtime_tools</build_depend> <build_depend>realtime_tools</build_depend>
<build_depend>message_generation</build_depend> <build_depend>message_generation</build_depend>
<build_depend>message_runtime</build_depend> <build_depend>message_runtime</build_depend>
<build_depend>tf2_bullet</build_depend> <build_depend>dynamic-graph</build_depend>
<build_depend>dynamic_graph</build_depend> <build_depend>dynamic-graph-python</build_depend>
<build_depend>dynamic_graph_python</build_depend> <build_depend>sot-core</build_depend>
<build_depend>sot_core</build_depend>
<build_depend>sot-dynamic-pinocchio</build_depend> <build_depend>sot-dynamic-pinocchio</build_depend>
<build_depend>dynamic_graph_bridge_msgs</build_depend> <build_depend>dynamic_graph_bridge_msgs</build_depend>
...@@ -39,13 +38,12 @@ ...@@ -39,13 +38,12 @@
<exec_depend>roscpp</exec_depend> <exec_depend>roscpp</exec_depend>
<exec_depend>geometry_msgs</exec_depend> <exec_depend>geometry_msgs</exec_depend>
<exec_depend>sensor_msgs</exec_depend> <exec_depend>sensor_msgs</exec_depend>
<exec_depend>tf</exec_depend> <exec_depend>tf2_ros</exec_depend>
<exec_depend>realtime_tools</exec_depend> <exec_depend>realtime_tools</exec_depend>
<exec_depend>message_generation</exec_depend> <exec_depend>message_generation</exec_depend>
<exec_depend>message_runtime</exec_depend> <exec_depend>message_runtime</exec_depend>
<exec_depend>tf2_bullet</exec_depend> <exec_depend>dynamic-graph</exec_depend>
<exec_depend>dynamic_graph</exec_depend> <exec_depend>dynamic-graph-python</exec_depend>
<exec_depend>dynamic_graph_python</exec_depend>
<exec_depend>sot-core</exec_depend> <exec_depend>sot-core</exec_depend>
<exec_depend>sot-dynamic-pinocchio</exec_depend> <exec_depend>sot-dynamic-pinocchio</exec_depend>
<exec_depend>dynamic_graph_bridge_msgs</exec_depend> <exec_depend>dynamic_graph_bridge_msgs</exec_depend>
......
[tool.black]
exclude = "cmake"
...@@ -8,23 +8,26 @@ import rospy ...@@ -8,23 +8,26 @@ import rospy
import tf import tf
import sensor_msgs.msg import sensor_msgs.msg
frame = '' frame = ""
childFrame = '' childFrame = ""
#DEPRECATED. Robot Pose is already being published
def pose_broadcaster(msg): def pose_broadcaster(msg):
translation = msg.position[0:3]; # DEPRECATED. Robot Pose is already being published
rotation = tf.transformations.quaternion_from_euler(msg.position[3], msg.position[4], msg.position[5]) translation = msg.position[0:3]
rotation = tf.transformations.quaternion_from_euler(
msg.position[3], msg.position[4], msg.position[5]
)
tfbr = tf.TransformBroadcaster() tfbr = tf.TransformBroadcaster()
tfbr.sendTransform(translation, rotation, tfbr.sendTransform(translation, rotation, rospy.Time.now(), childFrame, frame)
rospy.Time.now(), childFrame, frame)
if __name__ == "__main__":
rospy.init_node("robot_pose_publisher", anonymous=True)
if __name__ == '__main__': frame = rospy.get_param("~frame", "odom")
rospy.init_node('robot_pose_publisher', anonymous=True) childFrame = rospy.get_param("~child_frame", "base_link")
topic = rospy.get_param("~topic", "joint_states")
frame = rospy.get_param('~frame', 'odom')
childFrame = rospy.get_param('~child_frame', 'base_link')
topic = rospy.get_param('~topic', 'joint_states')
rospy.Subscriber(topic, sensor_msgs.msg.JointState, pose_broadcaster) rospy.Subscriber(topic, sensor_msgs.msg.JointState, pose_broadcaster)
rospy.spin() rospy.spin()
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import rospy import rospy
import dynamic_graph import dynamic_graph # noqa: F401
import dynamic_graph_bridge_msgs.srv import dynamic_graph_bridge_msgs.srv
import sys import sys
import code import code
...@@ -18,7 +18,8 @@ except ImportError: ...@@ -18,7 +18,8 @@ except ImportError:
print("Module readline not available.") print("Module readline not available.")
# Enable a History # Enable a History
HISTFILE="%s/.pyhistory" % os.environ["HOME"] HISTFILE = "%s/.pyhistory" % os.environ["HOME"]
def savehist(): def savehist():
readline.write_history_file(HISTFILE) readline.write_history_file(HISTFILE)
...@@ -29,30 +30,31 @@ class RosShell(InteractiveConsole): ...@@ -29,30 +30,31 @@ class RosShell(InteractiveConsole):
self.cache = "" self.cache = ""
InteractiveConsole.__init__(self) InteractiveConsole.__init__(self)
rospy.loginfo('waiting for service...') rospy.loginfo("waiting for service...")
rospy.wait_for_service('run_command') rospy.wait_for_service("run_command")
self.client = rospy.ServiceProxy( self.client = rospy.ServiceProxy(
'run_command', dynamic_graph_bridge_msgs.srv.RunCommand, True) "run_command", dynamic_graph_bridge_msgs.srv.RunCommand, True
rospy.wait_for_service('run_script') )
rospy.wait_for_service("run_script")
self.scriptClient = rospy.ServiceProxy( self.scriptClient = rospy.ServiceProxy(
'run_script', dynamic_graph_bridge_msgs.srv.RunPythonFile, True) "run_script", dynamic_graph_bridge_msgs.srv.RunPythonFile, True
)
readline.set_completer(DGCompleter(self.client).complete) readline.set_completer(DGCompleter(self.client).complete)
readline.parse_and_bind("tab: complete") readline.parse_and_bind("tab: complete")
# Read the existing history if there is one # Read the existing history if there is one
if os.path.exists(HISTFILE): if os.path.exists(HISTFILE):
readline.read_history_file(HISTFILE) readline.read_history_file(HISTFILE)
# Set maximum number of items that will be written to the history file # Set maximum number of items that will be written to the history file
readline.set_history_length(300) readline.set_history_length(300)
import atexit import atexit
atexit.register(savehist)
atexit.register(savehist)
def runcode(self, code, retry = True): def runcode(self, code, retry=True):
source = self.cache[:-1] source = self.cache[:-1]
self.cache = "" self.cache = ""
if source != "": if source != "":
...@@ -60,50 +62,53 @@ class RosShell(InteractiveConsole): ...@@ -60,50 +62,53 @@ class RosShell(InteractiveConsole):
if not self.client: if not self.client:
print("Connection to remote server lost. Reconnecting...") print("Connection to remote server lost. Reconnecting...")
self.client = rospy.ServiceProxy( self.client = rospy.ServiceProxy(
'run_command', dynamic_graph_bridge_msgs.srv.RunCommand, True) "run_command", dynamic_graph_bridge_msgs.srv.RunCommand, True
)
if retry: if retry:
print("Retrying previous command...") print("Retrying previous command...")
self.cache = source self.cache = source
return self.runcode(code, False) return self.runcode(code, False)
response = self.client(str(source)) response = self.client(str(source))
if response.standardoutput != "": if response.standardoutput != "":
print response.standardoutput[:-1] print(response.standardoutput[:-1])
if response.standarderror != "": if response.standarderror != "":
print response.standarderror[:-1] print(response.standarderror[:-1])
elif response.result != "None": elif response.result != "None":
print response.result print(response.result)
except rospy.ServiceException, e: except rospy.ServiceException:
print("Connection to remote server lost. Reconnecting...") print("Connection to remote server lost. Reconnecting...")
self.client = rospy.ServiceProxy( self.client = rospy.ServiceProxy(
'run_command', dynamic_graph_bridge_msgs.srv.RunCommand, True) "run_command", dynamic_graph_bridge_msgs.srv.RunCommand, True
)
if retry: if retry:
print("Retrying previous command...") print("Retrying previous command...")
self.cache = source self.cache = source
self.runcode(code, False) self.runcode(code, False)
def runsource(self, source, filename = '<input>', symbol = 'single'): def runsource(self, source, filename="<input>", symbol="single"):
try: try:
c = code.compile_command(source, filename, symbol) c = code.compile_command(source, filename, symbol)
if c: if c:
return self.runcode(c) return self.runcode(c)
else: else:
return True return True
except SyntaxError, OverflowError: except (SyntaxError, OverflowError):
self.showsyntaxerror() self.showsyntaxerror()
self.cache = "" self.cache = ""
return False return False
def push(self,line): def push(self, line):
self.cache += line + "\n" self.cache += line + "\n"
return InteractiveConsole.push(self,line) return InteractiveConsole.push(self, line)
if __name__ == '__main__':
if __name__ == "__main__":
import optparse import optparse
import os.path import os.path
rospy.init_node('run_command', argv=sys.argv)
rospy.init_node("run_command", argv=sys.argv)
sys.argv = rospy.myargv(argv=None) sys.argv = rospy.myargv(argv=None)
parser = optparse.OptionParser( parser = optparse.OptionParser(usage="\n\t%prog [options]")
usage='\n\t%prog [options]')
(options, args) = parser.parse_args(sys.argv[1:]) (options, args) = parser.parse_args(sys.argv[1:])
sh = RosShell() sh = RosShell()
...@@ -118,6 +123,6 @@ if __name__ == '__main__': ...@@ -118,6 +123,6 @@ if __name__ == '__main__':
if not response: if not response:
print("Error while file parsing ") print("Error while file parsing ")
else: else:
print("Provided file does not exist: %s"%(infile)) print("Provided file does not exist: %s" % (infile))
else: else:
sh.interact("Interacting with remote server.") sh.interact("Interacting with remote server.")
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
# through dynamic_graph_bridge. # through dynamic_graph_bridge.
# #
import logging
import rospy import rospy
import tf import tf
...@@ -13,15 +15,15 @@ import geometry_msgs.msg ...@@ -13,15 +15,15 @@ import geometry_msgs.msg
def main(): def main():
rospy.init_node('tf_publisher', anonymous=True) rospy.init_node("tf_publisher", anonymous=True)
frame = rospy.get_param('~frame', '') frame = rospy.get_param("~frame", "")
childFrame = rospy.get_param('~child_frame', '') childFrame = rospy.get_param("~child_frame", "")
topic = rospy.get_param('~topic', '') topic = rospy.get_param("~topic", "")
rateSeconds = rospy.get_param('~rate', 5) rateSeconds = rospy.get_param("~rate", 5)
if not frame or not childFrame or not topic: if not frame or not childFrame or not topic:
logpy.error("frame, childFrame and topic are required parameters") logging.error("frame, childFrame and topic are required parameters")
return return
rate = rospy.Rate(rateSeconds) rate = rospy.Rate(rateSeconds)
...@@ -35,11 +37,10 @@ def main(): ...@@ -35,11 +37,10 @@ def main():
ok = False ok = False
while not rospy.is_shutdown() and not ok: while not rospy.is_shutdown() and not ok:
try: try:
tl.waitForTransform(childFrame, frame, tl.waitForTransform(childFrame, frame, rospy.Time(), rospy.Duration(0.1))
rospy.Time(), rospy.Duration(0.1))
ok = True ok = True
except tf.Exception, e: except tf.Exception:
rospy.logwarn("waiting for tf transform") logging.warning("waiting for tf transform")
ok = False ok = False
while not rospy.is_shutdown(): while not rospy.is_shutdown():
...@@ -60,4 +61,5 @@ def main(): ...@@ -60,4 +61,5 @@ def main():
pub.publish(transform) pub.publish(transform)
rate.sleep() rate.sleep()
main() main()