description |
---|
How to package. |
Use package format 2.0, which removes the distinction between <run_depend>
and <build_depend>
and makes this more compact.
Use spaces, 2-wide as indentation.
Example:
<?xml version="1.0"?>
<package format="2">
<name>mav_local_planner</name>
<version>0.0.0</version>
<description>
Local planner with multiple configurable components for planning
straight-line paths to waypoints, checking global plans for collisions,
and doing local obstacle avoidance.
</description>
<maintainer email="[email protected]">Helen Oleynikova</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<buildtool_depend>catkin_simple</buildtool_depend>
<depend>mav_msgs</depend>
<depend>mav_planning_utils</depend>
<depend>planner_ompl</depend>
<depend>planner_base</depend>
<depend>planning_msgs</depend>
<depend>roscpp</depend>
<depend>tf</depend>
</package>
You should use catkin_simple rather than the old-style catkin lists, since they make everything easier. Use spaces, 2-wide as indentation.
A few tips:
-
catkin_simple(ALL_DEPS_REQUIRED)
will make sure that all dependencies in the package.xml above are found on the system and loaded. - Make a library called
${PROJECT_NAME}
and link any executables against it. - If you're outputting messages, this is done automatically by catkin simple. However, if you have executables and messages in the same package (prefer not to do this, just have a whatever_msgs package instead), you need to add this to after your executable/library so that things are built in the right order:
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS})
See the documentation at the link above, and this example:
cmake_minimum_required(VERSION 2.8.3)
project(mav_local_planner)
find_package(catkin_simple REQUIRED)
catkin_simple(ALL_DEPS_REQUIRED)
add_definitions(-std=c++11)
#############
# LIBRARIES #
#############
cs_add_library(${PROJECT_NAME}
src/trajectory_sampler.cpp
)
############
# BINARIES #
############
cs_add_executable(local_planner_node
src/local_planner_node.cpp
)
target_link_libraries(local_planner_node ${PROJECT_NAME})
##########
# EXPORT #
##########
cs_install()
cs_export()
Your package should look something like the example below. See the ROS Package Documentation for more details.
Keep in mind:
- Your headers should be in include/PACKAGE_NAME/header.h
- Your source files should be in the src/ folder.
- Ideally, if you have ROS parameters in your node, you should have the default values and descriptions in a .yaml file in the cfg folder.
mav_local_planner
├── CMakeLists.txt
├── cfg
│ └── default_local_planner_params.yaml
├── include
│ └── mav_local_planner
│ └── trajectory_sampler.h
├── package.xml
└── src
├── local_planner_node.cpp
└── trajectory_sampler.cpp
Example default_local_planner_params.yaml. Always have units when available!
# This file is meant as an example and explanation of the planning params.
# Everything in the base is for the local planner.
local_planning_horizon: 3 # [sec], how far forward to sample trajectories
trajectory_sampling_dt: 0.01 # [sec], how often to sample the trajectory for the controller.
collision_sampling_dt: 0.1 # [sec], how often to check for collisions along the path.
command_publishing_dt: 1.0 # [sec], how often to publish new commands to position controller.
mpc_prediction_horizon: 30 # [timesteps], how many timesteps ahead to publish in addition to the rate
# What kind of planners, obstacle avoidance, etc. to use.
use_obstacle_avoidance: false
# Whether to publish any new trajectories immediately or wait for start
# service call.
autostart: true