diff --git a/Makefile b/Makefile index 8a29457c2c..c4e9f7cc83 100644 --- a/Makefile +++ b/Makefile @@ -490,7 +490,7 @@ distclean: gazeboclean @rm -rf "$(SRC_DIR)/build" @git clean --force -X "$(SRC_DIR)/msg/" "$(SRC_DIR)/platforms/" "$(SRC_DIR)/posix-configs/" "$(SRC_DIR)/ROMFS/" "$(SRC_DIR)/src/" "$(SRC_DIR)/test/" "$(SRC_DIR)/Tools/" -# Help / Error +# Help / Error / Misc # -------------------------------------------------------------------- # All other targets are handled by PX4_MAKE. Add a rule here to avoid printing an error. @@ -524,3 +524,18 @@ check_px4: $(call make_list,nuttx,"px4") \ check_nxp: $(call make_list,nuttx,"nxp") \ sizes + +ifneq ($(ROS2_WS_DIR),) + ROS2_WS_DIR := $(basename ${ROS2_WS_DIR}) +else + ROS2_WS_DIR := ~/colcon_ws +endif + +update_ros2_bridge: + @Tools/update_px4_ros2_bridge.sh --ws_dir ${ROS2_WS_DIR} --all + +update_px4_ros_com: + @Tools/update_px4_ros2_bridge.sh --ws_dir ${ROS2_WS_DIR} --px4_ros_com + +update_px4_msgs: + @Tools/update_px4_ros2_bridge.sh --ws_dir ${ROS2_WS_DIR} --px4_msgs diff --git a/Tools/update_px4_ros2_bridge.sh b/Tools/update_px4_ros2_bridge.sh new file mode 100755 index 0000000000..58ebca5b7c --- /dev/null +++ b/Tools/update_px4_ros2_bridge.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +set -e + +agent_template_files_updated=0 +code_generator_files_updated=0 + +# parse help argument +if [[ $1 == "-h" ]] || [[ $1 == "--help" ]]; then + echo -e "Usage: update_px4_ros2_bridge.bash [options...] \t This script allows to update px4_ros_com and px4_msgs in a specified directory." >&2 + echo + echo -e "\t--ws_dir \t\t Location of the ament/colcon workspace. Default: $HOME/colcon_ws." + echo -e "\t--px4_ros_com \t\t Updates px4_ros_com microRTPS agent code generation and templates." + echo -e "\t--px4_msgs \t\t Updates px4_msgs messages definition files." + echo -e "\t--all \t\t Updates both px4_ros_com and px4_msgs." + echo + exit 0 +fi + +# parse the arguments +while [ $# -gt 0 ]; do + if [[ $1 == *"--"* ]]; then + v="${1/--/}" + if [ ! -z $2 ]; then + declare $v="$2" + else + declare $v=1 + fi + fi + shift +done + +# get script directory +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# get PX4-Autopilot directory +PX4_DIR=$(cd "$(dirname "$SCRIPT_DIR")" && pwd) + +function compare_and_update () { + cmp -s "$1" "$2" + if [ $? -eq 1 ]; then + cp "$1" "$2" + return 0 + fi + + return 1; +} + +# update microRTPS agent code generators / helpers +function update_agent_code { + declare -a templates=( \ + "microRTPS_agent.cpp.em" \ + "microRTPS_timesync.cpp.em" \ + "microRTPS_timesync.h.em" \ + "microRTPS_transport.cpp" \ + "microRTPS_transport.h" \ + "Publisher.cpp.em" \ + "Publisher.h.em" \ + "Subscriber.cpp.em" \ + "Subscriber.h.em" \ + "RtpsTopics.cpp.em" \ + "RtpsTopics.h.em" \ + ) + + for file in ${templates[@]}; do + compare_and_update "$PX4_DIR/msg/templates/urtps/$file" "$ws_dir/src/px4_ros_com/templates/$file" \ + && echo -e "--\t\t- '$ws_dir/src/px4_ros_com/templates/$file' updated" && ((agent_template_files_updated+=1)) + done + if [ $agent_template_files_updated -eq 0 ]; then + echo -e "--\t\t- No template files updated" + elif [ $agent_template_files_updated -eq 1 ]; then + echo -e "--\t\t - 1 template file updated" + else + echo -e "--\t\t - $agent_template_files_updated template files updated" + fi +} + +# update microRTPS agent code templates +function update_agent_templates { + declare -a code_generators=( \ + "uorb_rtps_classifier.py" \ + "generate_microRTPS_bridge.py" \ + "px_generate_uorb_topic_files.py" \ + ) + for file in ${code_generators[@]}; do + compare_and_update "$PX4_DIR/msg/tools/$file $ws_dir/src/px4_ros_com/scripts/$file" \ + && echo -e "--\t\t- '$ws_dir/src/px4_ros_com/scripts/$file' updated" && ((code_generator_files_updated+=1)) + done + if [ $code_generator_files_updated -eq 0 ]; then + echo -e "--\t\t- No code generators / helpers files updated" + elif [ $code_generator_files_updated -eq 1 ]; then + echo -e "--\t\t - 1 code generator / helper file updated" + else + echo -e "--\t\t - $code_generator_files_updated code generator / helper files updated" + fi +} + +# update px4_ros_com files +function update_px4_ros_com { + python3 $PX4_DIR/msg/tools/uorb_to_ros_urtps_topics.py -i $PX4_DIR/msg/tools/urtps_bridge_topics.yaml -o $ws_dir/src/px4_ros_com/templates/urtps_bridge_topics.yaml + echo -e "--------------- \033[1mmicroRTPS agent code generation and templates update\033[0m ----------------" + echo "-------------------------------------------------------------------------------------------------------" + update_agent_code + update_agent_templates + return 0 +} + +# function to update px4_msgs +function update_px4_msgs { + find "$ws_dir/src/px4_msgs/msg/" -maxdepth 1 -type f -delete + python3 $PX4_DIR/msg/tools/uorb_to_ros_msgs.py $PX4_DIR/msg/ $ws_dir/src/px4_msgs/msg/ +} + +# decisor +echo "-------------------------------------------------------------------------------------------------------" +if [ -d "${ws_dir}" ]; then + ws_dir=$(cd "$ws_dir" && pwd) + if [ ! -z ${all} ]; then + update_px4_ros_com + echo "-------------------------------------------------------------------------------------------------------" + update_px4_msgs + elif [ ! -z ${px4_ros_com} ]; then + update_px4_ros_com + echo "-------------------------------------------------------------------------------------------------------" + elif [ ! -z ${px4_msgs} ]; then + update_px4_msgs + fi + echo -e "-------------------------------- \033[0;32mUpdate successful!\033[0m ---------------------------------" + echo "-------------------------------------------------------------------------------------------------------" + exit 0 +else + echo -e "-- \033[0;31mWorkspace directory doesn't exist...\033[0m" + echo -e "---------------------------------- \033[0;31mUpdate failed!\033[0m -----------------------------------" + echo "-------------------------------------------------------------------------------------------------------" + exit $ERRCODE +fi