diff --git a/crazyflie_examples/CMakeLists.txt b/crazyflie_examples/CMakeLists.txt index 9ea4389cd..0c70c94d2 100644 --- a/crazyflie_examples/CMakeLists.txt +++ b/crazyflie_examples/CMakeLists.txt @@ -16,4 +16,20 @@ install(DIRECTORY DESTINATION share/${PROJECT_NAME}/ ) +if(BUILD_TESTING) + find_package(ament_cmake_pytest REQUIRED) + set(_pytest_tests + test/test_flake8.py + test/test_pep257.py + ) + foreach(_test_path ${_pytest_tests}) + get_filename_component(_test_name ${_test_path} NAME_WE) + ament_add_pytest_test(${_test_name} ${_test_path} + APPEND_ENV PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR} + TIMEOUT 60 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + endforeach() +endif() + ament_package() diff --git a/crazyflie_examples/crazyflie_examples/cmd_full_state.py b/crazyflie_examples/crazyflie_examples/cmd_full_state.py index 93040f90b..4979e6461 100644 --- a/crazyflie_examples/crazyflie_examples/cmd_full_state.py +++ b/crazyflie_examples/crazyflie_examples/cmd_full_state.py @@ -1,10 +1,10 @@ #!/usr/bin/env python -import numpy as np from pathlib import Path -from crazyflie_py import * +from crazyflie_py import Crazyswarm from crazyflie_py.uav_trajectory import Trajectory +import numpy as np def executeTrajectory(timeHelper, cf, trajpath, rate=100, offset=np.zeros(3)): @@ -39,12 +39,15 @@ def main(): cf.takeoff(targetHeight=Z, duration=Z+1.0) timeHelper.sleep(Z+2.0) - executeTrajectory(timeHelper, cf, Path(__file__).parent / "data/figure8.csv", rate, offset=np.array([0, 0, 0.5])) + executeTrajectory(timeHelper, cf, + Path(__file__).parent / 'data/figure8.csv', + rate, + offset=np.array([0, 0, 0.5])) cf.notifySetpointsStop() cf.land(targetHeight=0.03, duration=Z+1.0) timeHelper.sleep(Z+2.0) -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/crazyflie_examples/crazyflie_examples/figure8.py b/crazyflie_examples/crazyflie_examples/figure8.py index 58c768bc5..af75d2998 100644 --- a/crazyflie_examples/crazyflie_examples/figure8.py +++ b/crazyflie_examples/crazyflie_examples/figure8.py @@ -1,10 +1,11 @@ #!/usr/bin/env python -import numpy as np from pathlib import Path -from crazyflie_py import * +from crazyflie_py import Crazyswarm from crazyflie_py.uav_trajectory import Trajectory +import numpy as np + def main(): swarm = Crazyswarm() @@ -12,7 +13,7 @@ def main(): allcfs = swarm.allcfs traj1 = Trajectory() - traj1.loadcsv(Path(__file__).parent / "data/figure8.csv") + traj1.loadcsv(Path(__file__).parent / 'data/figure8.csv') TRIALS = 1 TIMESCALE = 1.0 @@ -36,5 +37,5 @@ def main(): timeHelper.sleep(3.0) -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/crazyflie_examples/crazyflie_examples/hello_world.py b/crazyflie_examples/crazyflie_examples/hello_world.py index add21cb8c..20bae593e 100644 --- a/crazyflie_examples/crazyflie_examples/hello_world.py +++ b/crazyflie_examples/crazyflie_examples/hello_world.py @@ -1,6 +1,5 @@ """Takeoff-hover-land for one CF. Useful to validate hardware config.""" -# from pycrazyswarm import Crazyswarm from crazyflie_py import Crazyswarm @@ -19,5 +18,5 @@ def main(): timeHelper.sleep(TAKEOFF_DURATION) -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/crazyflie_examples/crazyflie_examples/multi_trajectory.py b/crazyflie_examples/crazyflie_examples/multi_trajectory.py index a38b73139..57b5caa7d 100644 --- a/crazyflie_examples/crazyflie_examples/multi_trajectory.py +++ b/crazyflie_examples/crazyflie_examples/multi_trajectory.py @@ -1,21 +1,22 @@ #!/usr/bin/env python -import numpy as np from pathlib import Path -from crazyflie_py import * +from crazyflie_py import Crazyswarm from crazyflie_py.uav_trajectory import Trajectory +import numpy as np + def main(): swarm = Crazyswarm() timeHelper = swarm.timeHelper allcfs = swarm.allcfs trajs = [] - n = 2 # number of distinct trajectories + n = 2 # number of distinct trajectories for i in range(n): traj = Trajectory() - traj.loadcsv(Path(__file__).parent / f"data/multi_trajectory/traj{i}.csv") + traj.loadcsv(Path(__file__).parent / f'data/multi_trajectory/traj{i}.csv') trajs.append(traj) TRIALS = 1 @@ -38,5 +39,5 @@ def main(): timeHelper.sleep(3.0) -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/crazyflie_examples/crazyflie_examples/nice_hover.py b/crazyflie_examples/crazyflie_examples/nice_hover.py index 43b83331d..b85647cdf 100644 --- a/crazyflie_examples/crazyflie_examples/nice_hover.py +++ b/crazyflie_examples/crazyflie_examples/nice_hover.py @@ -1,12 +1,12 @@ #!/usr/bin/env python +from crazyflie_py import Crazyswarm import numpy as np -from crazyflie_py import * def main(): Z = 1.0 - + swarm = Crazyswarm() timeHelper = swarm.timeHelper allcfs = swarm.allcfs @@ -17,11 +17,12 @@ def main(): pos = np.array(cf.initialPosition) + np.array([0, 0, Z]) cf.goTo(pos, 0, 1.0) - print("press button to continue...") + print('press button to continue...') swarm.input.waitUntilButtonPressed() allcfs.land(targetHeight=0.02, duration=1.0+Z) timeHelper.sleep(1.0+Z) -if __name__ == "__main__": + +if __name__ == '__main__': main() diff --git a/crazyflie_examples/crazyflie_examples/set_param.py b/crazyflie_examples/crazyflie_examples/set_param.py index 1e52cc6f2..69c49daf0 100644 --- a/crazyflie_examples/crazyflie_examples/set_param.py +++ b/crazyflie_examples/crazyflie_examples/set_param.py @@ -1,26 +1,24 @@ #!/usr/bin/env python -from crazyflie_py import * +from crazyflie_py import Crazyswarm def main(): - Z = 1.0 - swarm = Crazyswarm() timeHelper = swarm.timeHelper allcfs = swarm.allcfs # disable LED (one by one) for cf in allcfs.crazyflies: - cf.setParam("led.bitmask", 128) + cf.setParam('led.bitmask', 128) timeHelper.sleep(1.0) timeHelper.sleep(2.0) # enable LED (broadcast) - allcfs.setParam("led.bitmask", 0) + allcfs.setParam('led.bitmask', 0) timeHelper.sleep(5.0) -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/crazyflie_examples/launch/keyboard_velmux_launch.py b/crazyflie_examples/launch/keyboard_velmux_launch.py index db7badac4..25d318a0b 100644 --- a/crazyflie_examples/launch/keyboard_velmux_launch.py +++ b/crazyflie_examples/launch/keyboard_velmux_launch.py @@ -1,8 +1,10 @@ import os -import yaml + from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch_ros.actions import Node +import yaml + def generate_launch_description(): # load crazyflies @@ -29,8 +31,8 @@ def generate_launch_description(): executable='vel_mux.py', name='vel_mux', output='screen', - parameters=[{"hover_height": 0.3}, - {"incoming_twist_topic": "/cmd_vel"}, - {"robot_prefix": "/cf1"}] + parameters=[{'hover_height': 0.3}, + {'incoming_twist_topic': '/cmd_vel'}, + {'robot_prefix': '/cf1'}] ), ]) diff --git a/crazyflie_examples/launch/multiranger_mapping_launch.py b/crazyflie_examples/launch/multiranger_mapping_launch.py index 7523caf77..7ff246f83 100644 --- a/crazyflie_examples/launch/multiranger_mapping_launch.py +++ b/crazyflie_examples/launch/multiranger_mapping_launch.py @@ -1,11 +1,10 @@ import os -import yaml + from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription from launch_ros.actions import Node -from launch.conditions import LaunchConfigurationEquals -from launch.launch_description_sources import PythonLaunchDescriptionSource +import yaml + def generate_launch_description(): # load crazyflies @@ -32,25 +31,25 @@ def generate_launch_description(): executable='vel_mux.py', name='vel_mux', output='screen', - parameters=[{"hover_height": 0.3}, - {"incoming_twist_topic": "/cmd_vel"}, - {"robot_prefix": "/cf1"}] + parameters=[{'hover_height': 0.3}, + {'incoming_twist_topic': '/cmd_vel'}, + {'robot_prefix': '/cf1'}] ), Node( - parameters=[ - {'odom_frame': 'odom'}, - {'map_frame': 'world'}, - {'base_frame': 'cf1'}, - {'scan_topic': '/cf1/scan'}, - {'use_scan_matching': False}, - {'max_laser_range': 3.5}, - {'resolution': 0.1}, - {'minimum_travel_distance': 0.01}, - {'minimum_travel_heading': 0.001}, - {'map_update_interval': 0.1} - ], - package='slam_toolbox', - executable='async_slam_toolbox_node', - name='slam_toolbox', - output='screen'), - ]) \ No newline at end of file + parameters=[ + {'odom_frame': 'odom'}, + {'map_frame': 'world'}, + {'base_frame': 'cf1'}, + {'scan_topic': '/cf1/scan'}, + {'use_scan_matching': False}, + {'max_laser_range': 3.5}, + {'resolution': 0.1}, + {'minimum_travel_distance': 0.01}, + {'minimum_travel_heading': 0.001}, + {'map_update_interval': 0.1} + ], + package='slam_toolbox', + executable='async_slam_toolbox_node', + name='slam_toolbox', + output='screen'), + ]) diff --git a/crazyflie_examples/launch/multiranger_nav2_launch.py b/crazyflie_examples/launch/multiranger_nav2_launch.py index e556277d3..9e1421325 100644 --- a/crazyflie_examples/launch/multiranger_nav2_launch.py +++ b/crazyflie_examples/launch/multiranger_nav2_launch.py @@ -1,11 +1,11 @@ import os -import yaml + from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription -from launch_ros.actions import Node -from launch.conditions import LaunchConfigurationEquals +from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch_ros.actions import Node +import yaml def generate_launch_description(): @@ -20,11 +20,10 @@ def generate_launch_description(): server_params = crazyflies - cf_examples_dir = get_package_share_directory("crazyflie_examples") + cf_examples_dir = get_package_share_directory('crazyflie_examples') bringup_dir = get_package_share_directory('nav2_bringup') bringup_launch_dir = os.path.join(bringup_dir, 'launch') - map_name = "map" - + map_name = 'map' return LaunchDescription([ Node( @@ -32,7 +31,7 @@ def generate_launch_description(): executable='crazyflie_server.py', name='crazyflie_server', output='screen', - parameters=[{"world_tf_name": 'map'}, + parameters=[{'world_tf_name': 'map'}, server_params], ), Node( @@ -40,44 +39,46 @@ def generate_launch_description(): executable='vel_mux.py', name='vel_mux', output='screen', - parameters=[{"hover_height": 0.3}, - {"incoming_twist_topic": "/cmd_vel"}, - {"robot_prefix": "/cf1"}] + parameters=[{'hover_height': 0.3}, + {'incoming_twist_topic': '/cmd_vel'}, + {'robot_prefix': '/cf1'}] ), Node( - parameters=[ - {'odom_frame': 'odom'}, - {'map_frame': 'map'}, - {'base_frame': 'cf1'}, - {'scan_topic': '/cf1/scan'}, - {'use_scan_matching': False}, - {'max_laser_range': 3.5}, - {'resolution': 0.1}, - {'minimum_travel_distance': 0.01}, - {'minimum_travel_heading': 0.001}, - {'map_update_interval': 0.1}, - {'mode': 'localization'}, - {"map_file_name": cf_examples_dir + "/data/" + map_name}, - {"map_start_pose": [0.0, 0.0, 0.0]} ], - package='slam_toolbox', - executable='async_slam_toolbox_node', - name='slam_toolbox', - output='screen'), + parameters=[ + {'odom_frame': 'odom'}, + {'map_frame': 'map'}, + {'base_frame': 'cf1'}, + {'scan_topic': '/cf1/scan'}, + {'use_scan_matching': False}, + {'max_laser_range': 3.5}, + {'resolution': 0.1}, + {'minimum_travel_distance': 0.01}, + {'minimum_travel_heading': 0.001}, + {'map_update_interval': 0.1}, + {'mode': 'localization'}, + {'map_file_name': cf_examples_dir + '/data/' + map_name}, + {'map_start_pose': [0.0, 0.0, 0.0]}], + package='slam_toolbox', + executable='async_slam_toolbox_node', + name='slam_toolbox', + output='screen'), IncludeLaunchDescription( PythonLaunchDescriptionSource( os.path.join(bringup_launch_dir, 'bringup_launch.py')), - launch_arguments={'slam': 'False', - 'use_sim_time': 'false', - 'map': cf_examples_dir + "/data/" + map_name + ".yaml", - 'params_file': os.path.join(cf_examples_dir, 'nav2_params.yaml'), - 'autostart': 'true', - 'use_composition': 'true', - 'transform_publish_period': '0.02' - }.items() + launch_arguments={ + 'slam': 'False', + 'use_sim_time': 'false', + 'map': cf_examples_dir + '/data/' + map_name + '.yaml', + 'params_file': os.path.join(cf_examples_dir, 'nav2_params.yaml'), + 'autostart': 'true', + 'use_composition': 'true', + 'transform_publish_period': '0.02' + }.items() ), IncludeLaunchDescription( PythonLaunchDescriptionSource( os.path.join(bringup_launch_dir, 'rviz_launch.py')), launch_arguments={ - 'rviz_config': os.path.join(bringup_dir, 'rviz', 'nav2_default_view.rviz')}.items()) + 'rviz_config': os.path.join( + bringup_dir, 'rviz', 'nav2_default_view.rviz')}.items()) ]) diff --git a/crazyflie_examples/package.xml b/crazyflie_examples/package.xml index 04015c337..1eba5101d 100644 --- a/crazyflie_examples/package.xml +++ b/crazyflie_examples/package.xml @@ -17,6 +17,7 @@ ament_flake8 ament_pep257 python3-pytest + ament_cmake_pytest ament_cmake diff --git a/crazyflie_examples/test/test_copyright.py b/crazyflie_examples/test/test_copyright.py deleted file mode 100644 index cc8ff03f7..000000000 --- a/crazyflie_examples/test/test_copyright.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_copyright.main import main -import pytest - - -@pytest.mark.copyright -@pytest.mark.linter -def test_copyright(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found errors'