From 72af2d1b89dfb182d240208143e25964c36565bf Mon Sep 17 00:00:00 2001 From: Allan TARCY Date: Fri, 26 May 2023 07:47:24 -0300 Subject: [PATCH] initial commit --- CMakeLists.txt | 15 +- README.md | 30 +- available_ros2_types | 411 +++++++++--------- built_packages | 18 +- .../msg/admittance_controller_state.h | 12 - .../admittance_controller_state__functions.h | 177 -------- ...tate__rosidl_typesupport_introspection_c.h | 26 -- ...state__rosidl_typesupport_microxrcedds_c.h | 39 -- .../admittance_controller_state__struct.h | 90 ---- ...dmittance_controller_state__type_support.h | 33 -- ...oint_trajectory_controller_state__struct.h | 40 +- ...ecanum_drive_controller_state__functions.h | 177 -------- ...tate__rosidl_typesupport_introspection_c.h | 26 -- ...state__rosidl_typesupport_microxrcedds_c.h | 39 -- .../mecanum_drive_controller_state__struct.h | 51 --- ...num_drive_controller_state__type_support.h | 33 -- .../steering_controller_status__functions.h | 177 -------- ...atus__rosidl_typesupport_introspection_c.h | 26 -- ...tatus__rosidl_typesupport_microxrcedds_c.h | 39 -- .../steering_controller_status__struct.h | 60 --- ...steering_controller_status__type_support.h | 33 -- .../msg/mecanum_drive_controller_state.h | 12 - .../msg/steering_controller_status.h | 12 - libmicroros/include/uxr/client/config.h | 4 +- .../client/core/session/create_entities_ref.h | 2 +- libmicroros/libmicroros.a | Bin 8319892 -> 8333360 bytes librobot/motor.c | 52 +++ librobot/motor.h | 27 ++ librobot/robot.c | 53 +++ librobot/robot.h | 45 ++ librobot/sensor.c | 27 ++ librobot/sensor.h | 17 + lwipopts.h | 89 ++++ .../library_generation/colcon.meta | 0 .../extra_packages/extra_packages.repos | 2 +- .../library_generation/library_generation.sh | 2 - .../library_generation/toolchain.cmake | 0 pico_micro_ros_example.c | 104 +++-- pico_uart_transport.c | 64 --- pico_uart_transports.h | 14 - pico_wifi_transport.c | 108 +++++ pico_wifi_transport.h | 69 +++ 42 files changed, 822 insertions(+), 1433 deletions(-) delete mode 100755 libmicroros/include/control_msgs/msg/admittance_controller_state.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/admittance_controller_state__functions.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_introspection_c.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_microxrcedds_c.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/admittance_controller_state__struct.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/admittance_controller_state__type_support.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__functions.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_introspection_c.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_microxrcedds_c.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__struct.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__type_support.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/steering_controller_status__functions.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_introspection_c.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_microxrcedds_c.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/steering_controller_status__struct.h delete mode 100755 libmicroros/include/control_msgs/msg/detail/steering_controller_status__type_support.h delete mode 100755 libmicroros/include/control_msgs/msg/mecanum_drive_controller_state.h delete mode 100755 libmicroros/include/control_msgs/msg/steering_controller_status.h create mode 100644 librobot/motor.c create mode 100644 librobot/motor.h create mode 100644 librobot/robot.c create mode 100644 librobot/robot.h create mode 100644 librobot/sensor.c create mode 100644 librobot/sensor.h create mode 100644 lwipopts.h mode change 100755 => 100644 microros_static_library/library_generation/colcon.meta mode change 100755 => 100644 microros_static_library/library_generation/extra_packages/extra_packages.repos mode change 100755 => 100644 microros_static_library/library_generation/library_generation.sh mode change 100755 => 100644 microros_static_library/library_generation/toolchain.cmake delete mode 100755 pico_uart_transport.c delete mode 100755 pico_uart_transports.h create mode 100755 pico_wifi_transport.c create mode 100755 pico_wifi_transport.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 54c545e3..e0c79146 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,20 +6,33 @@ project(pico_micro_ros_example C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) +set(PICO_BOARD pico_w CACHE STRING "Board type") + pico_sdk_init() link_directories(libmicroros) add_executable(pico_micro_ros_example pico_micro_ros_example.c - pico_uart_transport.c + pico_wifi_transport.c + librobot/motor.c + librobot/robot.c + librobot/sensor.c ) target_link_libraries(pico_micro_ros_example pico_stdlib + hardware_pwm microros ) target_include_directories(pico_micro_ros_example PUBLIC libmicroros/include + librobot + ${CMAKE_CURRENT_LIST_DIR} + ${CMAKE_CURRENT_LIST_DIR}/.. +) + +target_link_libraries(pico_micro_ros_example + pico_cyw43_arch_lwip_threadsafe_background ) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") diff --git a/README.md b/README.md index 6db02acd..05d3e1f4 100755 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ source ~/.bashrc Once the Pico SDK is ready, compile the example: ```bash -cd micro_ros_raspberrypi_pico_sdk +cd uros_pico_w mkdir build cd build cmake .. @@ -54,13 +54,34 @@ cp pico_micro_ros_example.uf2 /media/$USER/RPI-RP2 Micro-ROS follows the client-server architecture, so you need to start the Micro-ROS Agent. You can do so using the [micro-ros-agent Docker](https://hub.docker.com/r/microros/micro-ros-agent): ```bash -docker run -it --rm -v /dev:/dev --privileged --net=host microros/micro-ros-agent:humble serial --dev /dev/ttyACM0 -b 115200 +docker run -it --rm -v /dev:/dev --privileged --net=host microros/micro-ros-agent:humble upd4 --port 4444 +``` + +Or using the snap agent: +```bash +#Install +sudo snap install micro-ros-agent +#Run +micro-ros-agent udp4 --port 4444 # add -v[1-6] to specify verbosity +``` + +Or directly in your ros ecosystem running the micro-ros-agent node [micro-ros-agent node](https://micro.ros.org/docs/tutorials/core/first_application_linux/): +```bash +# Download micro-ROS-Agent packages +ros2 run micro_ros_setup create_agent_ws.sh + +# Build step +ros2 run micro_ros_setup build_agent.sh +. install/local_setup.bash + +# Run a micro-ROS agent +ros2 run micro_ros_agent micro_ros_agent udp4 --port 4444 ``` ## What files are relevant? -- `pico_uart_transport.c`: Contains the board specific implementation of the serial transport (no change needed). +- `pico_wifi_transport.c`: Contains the board specific implementation of the wifi transport (no change needed). - `CMakeLists.txt`: CMake file. -- `pico_micro_ros_example.c`: The actual ROS 2 publisher. +- `pico_micro_ros_example.c`: The Picobot ROS 2 exemple. ## How to build the precompiled library @@ -73,6 +94,7 @@ docker run -it --rm -v $(pwd):/project microros/micro_ros_static_library_builder ``` Note that folders added to `microros_static_library/library_generation/extra_packages` and entries added to `microros_static_library/library_generation/extra_packages/extra_packages.repos` will be taken into account by this build system. + ## How to use Pico SDK? Here is a Raspberry Pi Pico C/C++ SDK documentation: diff --git a/available_ros2_types b/available_ros2_types index a11eaabe..25f81bdd 100755 --- a/available_ros2_types +++ b/available_ros2_types @@ -1,245 +1,242 @@ -action_msgs/CancelGoal.srv -action_msgs/GoalInfo.msg -action_msgs/GoalStatus.msg -action_msgs/GoalStatusArray.msg -actionlib_msgs/GoalID.msg -actionlib_msgs/GoalStatus.msg -actionlib_msgs/GoalStatusArray.msg -builtin_interfaces/Duration.msg -builtin_interfaces/Time.msg +test_interface_files/Constants.msg +test_interface_files/Empty.msg +test_interface_files/MultiNested.msg +test_interface_files/UnboundedSequences.msg +test_interface_files/BoundedSequences.msg +test_interface_files/WStrings.msg +test_interface_files/Nested.msg +test_interface_files/BoundedPlainSequences.msg +test_interface_files/BasicTypes.msg +test_interface_files/Defaults.msg +test_interface_files/Strings.msg +test_interface_files/Arrays.msg +test_interface_files/Fibonacci.action +test_interface_files/Arrays.srv +test_interface_files/BasicTypes.srv +test_interface_files/Empty.srv +unique_identifier_msgs/UUID.msg +tf2_msgs/TFMessage.msg +tf2_msgs/TF2Error.msg +tf2_msgs/LookupTransform.action +tf2_msgs/FrameGraph.srv +rosgraph_msgs/Clock.msg +rcl_interfaces/Parameter.msg +rcl_interfaces/FloatingPointRange.msg +rcl_interfaces/ListParametersResult.msg +rcl_interfaces/ParameterDescriptor.msg +rcl_interfaces/IntegerRange.msg +rcl_interfaces/ParameterEvent.msg +rcl_interfaces/ParameterType.msg +rcl_interfaces/ParameterEventDescriptors.msg +rcl_interfaces/Log.msg +rcl_interfaces/ParameterValue.msg +rcl_interfaces/SetParametersResult.msg +rcl_interfaces/GetParameters.srv +rcl_interfaces/GetParameterTypes.srv +rcl_interfaces/SetParameters.srv +rcl_interfaces/SetParametersAtomically.srv +rcl_interfaces/ListParameters.srv +rcl_interfaces/DescribeParameters.srv composition_interfaces/ListNodes.srv composition_interfaces/LoadNode.srv composition_interfaces/UnloadNode.srv -control_msgs/AdmittanceControllerState.msg -control_msgs/DynamicJointState.msg -control_msgs/FollowJointTrajectory.action -control_msgs/GripperCommand.action -control_msgs/GripperCommand.msg -control_msgs/InterfaceValue.msg -control_msgs/JointComponentTolerance.msg -control_msgs/JointControllerState.msg -control_msgs/JointJog.msg -control_msgs/JointTolerance.msg -control_msgs/JointTrajectory.action -control_msgs/JointTrajectoryControllerState.msg -control_msgs/MecanumDriveControllerState.msg -control_msgs/PidState.msg -control_msgs/PointHead.action -control_msgs/QueryCalibrationState.srv -control_msgs/QueryTrajectoryState.srv -control_msgs/SingleJointPosition.action -control_msgs/SteeringControllerStatus.msg -data/Test.action -data/Test.msg -data/Test.srv -diagnostic_msgs/AddDiagnostics.srv -diagnostic_msgs/DiagnosticArray.msg -diagnostic_msgs/DiagnosticStatus.msg -diagnostic_msgs/KeyValue.msg -diagnostic_msgs/SelfTest.srv -example_interfaces/AddTwoInts.srv -example_interfaces/Bool.msg -example_interfaces/Byte.msg +statistics_msgs/StatisticDataType.msg +statistics_msgs/MetricsMessage.msg +statistics_msgs/StatisticDataPoint.msg +action_msgs/GoalStatusArray.msg +action_msgs/GoalInfo.msg +action_msgs/GoalStatus.msg +action_msgs/CancelGoal.srv +test_msgs/Builtins.msg +test_msgs/NestedMessage.action +builtin_interfaces/Time.msg +builtin_interfaces/Duration.msg +lifecycle_msgs/TransitionEvent.msg +lifecycle_msgs/Transition.msg +lifecycle_msgs/TransitionDescription.msg +lifecycle_msgs/State.msg +lifecycle_msgs/GetAvailableTransitions.srv +lifecycle_msgs/GetState.srv +lifecycle_msgs/ChangeState.srv +lifecycle_msgs/GetAvailableStates.srv +example_interfaces/UInt32.msg +example_interfaces/Int8.msg example_interfaces/ByteMultiArray.msg -example_interfaces/Char.msg -example_interfaces/Empty.msg -example_interfaces/Fibonacci.action -example_interfaces/Float32.msg -example_interfaces/Float32MultiArray.msg example_interfaces/Float64.msg -example_interfaces/Float64MultiArray.msg -example_interfaces/Int16.msg +example_interfaces/UInt8MultiArray.msg +example_interfaces/Int64.msg +example_interfaces/Int32MultiArray.msg +example_interfaces/UInt8.msg +example_interfaces/Byte.msg +example_interfaces/Empty.msg +example_interfaces/UInt16MultiArray.msg +example_interfaces/UInt64.msg +example_interfaces/Int8MultiArray.msg example_interfaces/Int16MultiArray.msg +example_interfaces/Int16.msg +example_interfaces/UInt16.msg +example_interfaces/WString.msg +example_interfaces/MultiArrayLayout.msg +example_interfaces/UInt64MultiArray.msg +example_interfaces/UInt32MultiArray.msg example_interfaces/Int32.msg -example_interfaces/Int32MultiArray.msg -example_interfaces/Int64.msg example_interfaces/Int64MultiArray.msg -example_interfaces/Int8.msg -example_interfaces/Int8MultiArray.msg +example_interfaces/Float64MultiArray.msg example_interfaces/MultiArrayDimension.msg -example_interfaces/MultiArrayLayout.msg -example_interfaces/SetBool.srv +example_interfaces/Float32.msg +example_interfaces/Bool.msg example_interfaces/String.msg +example_interfaces/Float32MultiArray.msg +example_interfaces/Char.msg +example_interfaces/Fibonacci.action example_interfaces/Trigger.srv -example_interfaces/UInt16.msg -example_interfaces/UInt16MultiArray.msg -example_interfaces/UInt32.msg -example_interfaces/UInt32MultiArray.msg -example_interfaces/UInt64.msg -example_interfaces/UInt64MultiArray.msg -example_interfaces/UInt8.msg -example_interfaces/UInt8MultiArray.msg -example_interfaces/WString.msg -geometry_msgs/Accel.msg +example_interfaces/AddTwoInts.srv +example_interfaces/SetBool.srv +shape_msgs/MeshTriangle.msg +shape_msgs/Plane.msg +shape_msgs/SolidPrimitive.msg +shape_msgs/Mesh.msg geometry_msgs/AccelStamped.msg -geometry_msgs/AccelWithCovariance.msg -geometry_msgs/AccelWithCovarianceStamped.msg -geometry_msgs/Inertia.msg +geometry_msgs/Accel.msg +geometry_msgs/Pose.msg +geometry_msgs/Transform.msg +geometry_msgs/PointStamped.msg +geometry_msgs/WrenchStamped.msg +geometry_msgs/PoseWithCovarianceStamped.msg geometry_msgs/InertiaStamped.msg -geometry_msgs/Point.msg geometry_msgs/Point32.msg -geometry_msgs/PointStamped.msg -geometry_msgs/Polygon.msg -geometry_msgs/PolygonStamped.msg -geometry_msgs/Pose.msg +geometry_msgs/AccelWithCovarianceStamped.msg geometry_msgs/Pose2D.msg -geometry_msgs/PoseArray.msg -geometry_msgs/PoseStamped.msg -geometry_msgs/PoseWithCovariance.msg -geometry_msgs/PoseWithCovarianceStamped.msg -geometry_msgs/Quaternion.msg -geometry_msgs/QuaternionStamped.msg -geometry_msgs/Transform.msg -geometry_msgs/TransformStamped.msg geometry_msgs/Twist.msg -geometry_msgs/TwistStamped.msg geometry_msgs/TwistWithCovariance.msg -geometry_msgs/TwistWithCovarianceStamped.msg +geometry_msgs/Quaternion.msg +geometry_msgs/PoseWithCovariance.msg geometry_msgs/Vector3.msg +geometry_msgs/PolygonStamped.msg geometry_msgs/Vector3Stamped.msg geometry_msgs/Wrench.msg -geometry_msgs/WrenchStamped.msg -lifecycle_msgs/ChangeState.srv -lifecycle_msgs/GetAvailableStates.srv -lifecycle_msgs/GetAvailableTransitions.srv -lifecycle_msgs/GetState.srv -lifecycle_msgs/State.msg -lifecycle_msgs/Transition.msg -lifecycle_msgs/TransitionDescription.msg -lifecycle_msgs/TransitionEvent.msg -nav_msgs/GetMap.srv -nav_msgs/GetPlan.srv -nav_msgs/GridCells.msg -nav_msgs/LoadMap.srv -nav_msgs/MapMetaData.msg -nav_msgs/OccupancyGrid.msg -nav_msgs/Odometry.msg -nav_msgs/Path.msg -nav_msgs/SetMap.srv -rcl_interfaces/DescribeParameters.srv -rcl_interfaces/FloatingPointRange.msg -rcl_interfaces/GetParameterTypes.srv -rcl_interfaces/GetParameters.srv -rcl_interfaces/IntegerRange.msg -rcl_interfaces/ListParameters.srv -rcl_interfaces/ListParametersResult.msg -rcl_interfaces/Log.msg -rcl_interfaces/Parameter.msg -rcl_interfaces/ParameterDescriptor.msg -rcl_interfaces/ParameterEvent.msg -rcl_interfaces/ParameterEventDescriptors.msg -rcl_interfaces/ParameterType.msg -rcl_interfaces/ParameterValue.msg -rcl_interfaces/SetParameters.srv -rcl_interfaces/SetParametersAtomically.srv -rcl_interfaces/SetParametersResult.msg -rosgraph_msgs/Clock.msg -sensor_msgs/BatteryState.msg -sensor_msgs/CameraInfo.msg +geometry_msgs/TwistWithCovarianceStamped.msg +geometry_msgs/Polygon.msg +geometry_msgs/PoseStamped.msg +geometry_msgs/Inertia.msg +geometry_msgs/TwistStamped.msg +geometry_msgs/AccelWithCovariance.msg +geometry_msgs/Point.msg +geometry_msgs/TransformStamped.msg +geometry_msgs/QuaternionStamped.msg +geometry_msgs/PoseArray.msg +actionlib_msgs/GoalStatusArray.msg +actionlib_msgs/GoalID.msg +actionlib_msgs/GoalStatus.msg +diagnostic_msgs/KeyValue.msg +diagnostic_msgs/DiagnosticStatus.msg +diagnostic_msgs/DiagnosticArray.msg +diagnostic_msgs/SelfTest.srv +diagnostic_msgs/AddDiagnostics.srv +std_msgs/UInt32.msg +std_msgs/Int8.msg +std_msgs/ByteMultiArray.msg +std_msgs/Float64.msg +std_msgs/UInt8MultiArray.msg +std_msgs/Int64.msg +std_msgs/Int32MultiArray.msg +std_msgs/UInt8.msg +std_msgs/Byte.msg +std_msgs/Empty.msg +std_msgs/UInt16MultiArray.msg +std_msgs/ColorRGBA.msg +std_msgs/UInt64.msg +std_msgs/Int8MultiArray.msg +std_msgs/Int16MultiArray.msg +std_msgs/Int16.msg +std_msgs/Header.msg +std_msgs/UInt16.msg +std_msgs/MultiArrayLayout.msg +std_msgs/UInt64MultiArray.msg +std_msgs/UInt32MultiArray.msg +std_msgs/Int32.msg +std_msgs/Int64MultiArray.msg +std_msgs/Float64MultiArray.msg +std_msgs/MultiArrayDimension.msg +std_msgs/Float32.msg +std_msgs/Bool.msg +std_msgs/String.msg +std_msgs/Float32MultiArray.msg +std_msgs/Char.msg +sensor_msgs/LaserScan.msg +sensor_msgs/PointCloud.msg +sensor_msgs/Temperature.msg +sensor_msgs/Imu.msg +sensor_msgs/Joy.msg sensor_msgs/ChannelFloat32.msg +sensor_msgs/NavSatStatus.msg +sensor_msgs/JointState.msg sensor_msgs/CompressedImage.msg +sensor_msgs/MultiEchoLaserScan.msg +sensor_msgs/TimeReference.msg +sensor_msgs/RelativeHumidity.msg sensor_msgs/FluidPressure.msg +sensor_msgs/LaserEcho.msg +sensor_msgs/PointCloud2.msg +sensor_msgs/NavSatFix.msg +sensor_msgs/RegionOfInterest.msg sensor_msgs/Illuminance.msg +sensor_msgs/MagneticField.msg +sensor_msgs/CameraInfo.msg +sensor_msgs/PointField.msg +sensor_msgs/JoyFeedbackArray.msg sensor_msgs/Image.msg -sensor_msgs/Imu.msg -sensor_msgs/JointState.msg -sensor_msgs/Joy.msg sensor_msgs/JoyFeedback.msg -sensor_msgs/JoyFeedbackArray.msg -sensor_msgs/LaserEcho.msg -sensor_msgs/LaserScan.msg -sensor_msgs/MagneticField.msg sensor_msgs/MultiDOFJointState.msg -sensor_msgs/MultiEchoLaserScan.msg -sensor_msgs/NavSatFix.msg -sensor_msgs/NavSatStatus.msg -sensor_msgs/PointCloud.msg -sensor_msgs/PointCloud2.msg -sensor_msgs/PointField.msg sensor_msgs/Range.msg -sensor_msgs/RegionOfInterest.msg -sensor_msgs/RelativeHumidity.msg +sensor_msgs/BatteryState.msg sensor_msgs/SetCameraInfo.srv -sensor_msgs/Temperature.msg -sensor_msgs/TimeReference.msg -shape_msgs/Mesh.msg -shape_msgs/MeshTriangle.msg -shape_msgs/Plane.msg -shape_msgs/SolidPrimitive.msg -statistics_msgs/MetricsMessage.msg -statistics_msgs/StatisticDataPoint.msg -statistics_msgs/StatisticDataType.msg -std_msgs/Bool.msg -std_msgs/Byte.msg -std_msgs/ByteMultiArray.msg -std_msgs/Char.msg -std_msgs/ColorRGBA.msg -std_msgs/Empty.msg -std_msgs/Float32.msg -std_msgs/Float32MultiArray.msg -std_msgs/Float64.msg -std_msgs/Float64MultiArray.msg -std_msgs/Header.msg -std_msgs/Int16.msg -std_msgs/Int16MultiArray.msg -std_msgs/Int32.msg -std_msgs/Int32MultiArray.msg -std_msgs/Int64.msg -std_msgs/Int64MultiArray.msg -std_msgs/Int8.msg -std_msgs/Int8MultiArray.msg -std_msgs/MultiArrayDimension.msg -std_msgs/MultiArrayLayout.msg -std_msgs/String.msg -std_msgs/UInt16.msg -std_msgs/UInt16MultiArray.msg -std_msgs/UInt32.msg -std_msgs/UInt32MultiArray.msg -std_msgs/UInt64.msg -std_msgs/UInt64MultiArray.msg -std_msgs/UInt8.msg -std_msgs/UInt8MultiArray.msg -std_srvs/Empty.srv -std_srvs/SetBool.srv std_srvs/Trigger.srv -stereo_msgs/DisparityImage.msg -test_interface_files/Arrays.msg -test_interface_files/Arrays.srv -test_interface_files/BasicTypes.msg -test_interface_files/BasicTypes.srv -test_interface_files/BoundedPlainSequences.msg -test_interface_files/BoundedSequences.msg -test_interface_files/Constants.msg -test_interface_files/Defaults.msg -test_interface_files/Empty.msg -test_interface_files/Empty.srv -test_interface_files/Fibonacci.action -test_interface_files/MultiNested.msg -test_interface_files/Nested.msg -test_interface_files/Strings.msg -test_interface_files/UnboundedSequences.msg -test_interface_files/WStrings.msg -test_msgs/Builtins.msg -test_msgs/NestedMessage.action -tf2_msgs/FrameGraph.srv -tf2_msgs/LookupTransform.action -tf2_msgs/TF2Error.msg -tf2_msgs/TFMessage.msg +std_srvs/SetBool.srv +std_srvs/Empty.srv trajectory_msgs/JointTrajectory.msg -trajectory_msgs/JointTrajectoryPoint.msg trajectory_msgs/MultiDOFJointTrajectory.msg +trajectory_msgs/JointTrajectoryPoint.msg trajectory_msgs/MultiDOFJointTrajectoryPoint.msg -unique_identifier_msgs/UUID.msg -visualization_msgs/GetInteractiveMarkers.srv -visualization_msgs/ImageMarker.msg -visualization_msgs/InteractiveMarker.msg -visualization_msgs/InteractiveMarkerControl.msg -visualization_msgs/InteractiveMarkerFeedback.msg visualization_msgs/InteractiveMarkerInit.msg visualization_msgs/InteractiveMarkerPose.msg -visualization_msgs/InteractiveMarkerUpdate.msg -visualization_msgs/Marker.msg +visualization_msgs/UVCoordinate.msg visualization_msgs/MarkerArray.msg visualization_msgs/MenuEntry.msg visualization_msgs/MeshFile.msg -visualization_msgs/UVCoordinate.msg +visualization_msgs/InteractiveMarkerUpdate.msg +visualization_msgs/InteractiveMarkerFeedback.msg +visualization_msgs/InteractiveMarker.msg +visualization_msgs/Marker.msg +visualization_msgs/ImageMarker.msg +visualization_msgs/InteractiveMarkerControl.msg +visualization_msgs/GetInteractiveMarkers.srv +stereo_msgs/DisparityImage.msg +nav_msgs/Odometry.msg +nav_msgs/GridCells.msg +nav_msgs/Path.msg +nav_msgs/MapMetaData.msg +nav_msgs/OccupancyGrid.msg +nav_msgs/GetMap.srv +nav_msgs/LoadMap.srv +nav_msgs/SetMap.srv +nav_msgs/GetPlan.srv +data/Test.msg +data/Test.action +data/Test.srv +control_msgs/PidState.msg +control_msgs/InterfaceValue.msg +control_msgs/JointTrajectoryControllerState.msg +control_msgs/JointComponentTolerance.msg +control_msgs/JointTolerance.msg +control_msgs/JointControllerState.msg +control_msgs/DynamicJointState.msg +control_msgs/GripperCommand.msg +control_msgs/JointJog.msg +control_msgs/GripperCommand.action +control_msgs/JointTrajectory.action +control_msgs/FollowJointTrajectory.action +control_msgs/PointHead.action +control_msgs/SingleJointPosition.action +control_msgs/QueryTrajectoryState.srv +control_msgs/QueryCalibrationState.srv diff --git a/built_packages b/built_packages index 72a34a1f..7419329f 100755 --- a/built_packages +++ b/built_packages @@ -1,29 +1,29 @@ -https://github.com/ament/ament_cmake.git 6105a1f7e7e896f45677184570495b3c6b534097 +https://github.com/ament/ament_cmake.git 15ea54ad541f367a76fd491f028e2659ec712ef5 https://github.com/ament/ament_index.git f019d6c40991799a13b18c9c3dcc583e3fde0381 -https://github.com/ament/ament_lint.git 65a0b1cf7d1c950869609b624b7797ab5e4677b1 +https://github.com/ament/ament_lint.git 4f4bf85fcc117ee6ccd19b62551f77f3163105c1 https://github.com/ament/ament_package.git f8ea958fd02cff6f4192425e28566369c92b5e34 -https://github.com/ament/googletest.git 0acc5196ddd5364fe24b729185c81746573835dd +https://github.com/ament/googletest.git 6df7425fdcbd368d2d1b99ffd89b9168014abb07 https://github.com/ament/uncrustify_vendor.git ec8f8b4d03483671e8ea2b3039f1015f92b0ef89 https://github.com/eProsima/Micro-CDR.git ed4fd513a24a53b93d548d342cb7aa0a18716f04 -https://github.com/eProsima/Micro-XRCE-DDS-Client.git 5cd43eb0ba97c7ec21949492344b8bf05e04572c +https://github.com/eProsima/Micro-XRCE-DDS-Client.git c28bf96f6e93ad1e01b8f0d74ea255e6bd8b07d2 https://github.com/micro-ROS/micro_ros_msgs.git e3664463e78ae5d0c34d86be92d707b3d9dfd27d https://github.com/micro-ROS/micro_ros_utilities 008b94ab857c72a4e79239cb1d5b80e80ed268bc -https://github.com/micro-ROS/rcl a11ba25bd022a885daa8e19a5f042cebae52d399 -https://github.com/micro-ROS/rcutils 00229f3085984f27cf32dbf95f09a0be6aa05998 +https://github.com/micro-ROS/rcl e8033a2a22e28a2da6d605bf467b1856813f8fa7 +https://github.com/micro-ROS/rcutils ffa1eccb31d1a8d4aaf405f41962c799efc51d57 https://github.com/micro-ROS/rmw-microxrcedds.git 7886a89312ec4787d9ff94d30a7b4e47e0bb3b8c https://github.com/micro-ROS/rosidl_typesupport.git d21bde140e1a4b413f6725888470b758a739171d https://github.com/micro-ROS/rosidl_typesupport_microxrcedds.git 106fda6a43a912e09480d7b705f3ca4a31a1803c -https://github.com/ros-controls/control_msgs aa46047b27b8b034d526760f92f62cfc4dbe873e +https://github.com/ros-controls/control_msgs 1416954c31432c192ff95a06559847e87386cf60 https://github.com/ros2/ament_cmake_ros.git 60572fa1bec50b9e6fbe64e1b23640d21c15e9d0 https://github.com/ros2/common_interfaces.git f4eac72f0bbd70f7955a5f709d4a6705eb6ca7e8 https://github.com/ros2/example_interfaces.git f8deb566a1facf91bd38b9f00c4cf684c5007d85 https://github.com/ros2/libyaml_vendor.git 239f695ceaa0820255f3d0fe02ec8c2bd41b8e78 -https://github.com/ros2/rcl.git 7bf1f07ae2ecf60a30e931be126ae73b727be41c +https://github.com/ros2/rcl.git 48c6e4c0d7c870f90c773161d3856f868fb0e65f https://github.com/ros2/rcl_interfaces.git 5e01a28f9866a564491480e12d8659a134678741 https://github.com/ros2/rcl_logging.git 1b7a4e34884005f28eeb04065b5d94565c67b11d https://github.com/ros2/rclc 27703c2ea0f869a6b0ddc0a7bdee4f7ec00c073c -https://github.com/ros2/rcpputils.git 3eb281afdc891855b5feb367c79ede1e2fbb0acb +https://github.com/ros2/rcpputils.git a93b1d4dbcac45b639e3468ba5d54d582689b3c6 https://github.com/ros2/rmw.git 2a4ee718d0da004d5629f50afd2896fbd1f4aedd https://github.com/ros2/rmw_implementation.git 413eb313f7e128c6977cd453818e1a39bf70da40 https://github.com/ros2/rosidl.git 81e90074ad5a36d63affabf966c71914660c417f diff --git a/libmicroros/include/control_msgs/msg/admittance_controller_state.h b/libmicroros/include/control_msgs/msg/admittance_controller_state.h deleted file mode 100755 index 7075041d..00000000 --- a/libmicroros/include/control_msgs/msg/admittance_controller_state.h +++ /dev/null @@ -1,12 +0,0 @@ -// generated from rosidl_generator_c/resource/idl.h.em -// with input from control_msgs:msg/AdmittanceControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__ADMITTANCE_CONTROLLER_STATE_H_ -#define CONTROL_MSGS__MSG__ADMITTANCE_CONTROLLER_STATE_H_ - -#include "control_msgs/msg/detail/admittance_controller_state__struct.h" -#include "control_msgs/msg/detail/admittance_controller_state__functions.h" -#include "control_msgs/msg/detail/admittance_controller_state__type_support.h" - -#endif // CONTROL_MSGS__MSG__ADMITTANCE_CONTROLLER_STATE_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__functions.h b/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__functions.h deleted file mode 100755 index 29affb45..00000000 --- a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__functions.h +++ /dev/null @@ -1,177 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__functions.h.em -// with input from control_msgs:msg/AdmittanceControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__FUNCTIONS_H_ -#define CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include - -#include "rosidl_runtime_c/visibility_control.h" -#include "control_msgs/msg/rosidl_generator_c__visibility_control.h" - -#include "control_msgs/msg/detail/admittance_controller_state__struct.h" - -/// Initialize msg/AdmittanceControllerState message. -/** - * If the init function is called twice for the same message without - * calling fini inbetween previously allocated memory will be leaked. - * \param[in,out] msg The previously allocated message pointer. - * Fields without a default value will not be initialized by this function. - * You might want to call memset(msg, 0, sizeof( - * control_msgs__msg__AdmittanceControllerState - * )) before or use - * control_msgs__msg__AdmittanceControllerState__create() - * to allocate and initialize the message. - * \return true if initialization was successful, otherwise false - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__AdmittanceControllerState__init(control_msgs__msg__AdmittanceControllerState * msg); - -/// Finalize msg/AdmittanceControllerState message. -/** - * \param[in,out] msg The allocated message pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__AdmittanceControllerState__fini(control_msgs__msg__AdmittanceControllerState * msg); - -/// Create msg/AdmittanceControllerState message. -/** - * It allocates the memory for the message, sets the memory to zero, and - * calls - * control_msgs__msg__AdmittanceControllerState__init(). - * \return The pointer to the initialized message if successful, - * otherwise NULL - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -control_msgs__msg__AdmittanceControllerState * -control_msgs__msg__AdmittanceControllerState__create(); - -/// Destroy msg/AdmittanceControllerState message. -/** - * It calls - * control_msgs__msg__AdmittanceControllerState__fini() - * and frees the memory of the message. - * \param[in,out] msg The allocated message pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__AdmittanceControllerState__destroy(control_msgs__msg__AdmittanceControllerState * msg); - -/// Check for msg/AdmittanceControllerState message equality. -/** - * \param[in] lhs The message on the left hand size of the equality operator. - * \param[in] rhs The message on the right hand size of the equality operator. - * \return true if messages are equal, otherwise false. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__AdmittanceControllerState__are_equal(const control_msgs__msg__AdmittanceControllerState * lhs, const control_msgs__msg__AdmittanceControllerState * rhs); - -/// Copy a msg/AdmittanceControllerState message. -/** - * This functions performs a deep copy, as opposed to the shallow copy that - * plain assignment yields. - * - * \param[in] input The source message pointer. - * \param[out] output The target message pointer, which must - * have been initialized before calling this function. - * \return true if successful, or false if either pointer is null - * or memory allocation fails. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__AdmittanceControllerState__copy( - const control_msgs__msg__AdmittanceControllerState * input, - control_msgs__msg__AdmittanceControllerState * output); - -/// Initialize array of msg/AdmittanceControllerState messages. -/** - * It allocates the memory for the number of elements and calls - * control_msgs__msg__AdmittanceControllerState__init() - * for each element of the array. - * \param[in,out] array The allocated array pointer. - * \param[in] size The size / capacity of the array. - * \return true if initialization was successful, otherwise false - * If the array pointer is valid and the size is zero it is guaranteed - # to return true. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__AdmittanceControllerState__Sequence__init(control_msgs__msg__AdmittanceControllerState__Sequence * array, size_t size); - -/// Finalize array of msg/AdmittanceControllerState messages. -/** - * It calls - * control_msgs__msg__AdmittanceControllerState__fini() - * for each element of the array and frees the memory for the number of - * elements. - * \param[in,out] array The initialized array pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__AdmittanceControllerState__Sequence__fini(control_msgs__msg__AdmittanceControllerState__Sequence * array); - -/// Create array of msg/AdmittanceControllerState messages. -/** - * It allocates the memory for the array and calls - * control_msgs__msg__AdmittanceControllerState__Sequence__init(). - * \param[in] size The size / capacity of the array. - * \return The pointer to the initialized array if successful, otherwise NULL - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -control_msgs__msg__AdmittanceControllerState__Sequence * -control_msgs__msg__AdmittanceControllerState__Sequence__create(size_t size); - -/// Destroy array of msg/AdmittanceControllerState messages. -/** - * It calls - * control_msgs__msg__AdmittanceControllerState__Sequence__fini() - * on the array, - * and frees the memory of the array. - * \param[in,out] array The initialized array pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__AdmittanceControllerState__Sequence__destroy(control_msgs__msg__AdmittanceControllerState__Sequence * array); - -/// Check for msg/AdmittanceControllerState message array equality. -/** - * \param[in] lhs The message array on the left hand size of the equality operator. - * \param[in] rhs The message array on the right hand size of the equality operator. - * \return true if message arrays are equal in size and content, otherwise false. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__AdmittanceControllerState__Sequence__are_equal(const control_msgs__msg__AdmittanceControllerState__Sequence * lhs, const control_msgs__msg__AdmittanceControllerState__Sequence * rhs); - -/// Copy an array of msg/AdmittanceControllerState messages. -/** - * This functions performs a deep copy, as opposed to the shallow copy that - * plain assignment yields. - * - * \param[in] input The source array pointer. - * \param[out] output The target array pointer, which must - * have been initialized before calling this function. - * \return true if successful, or false if either pointer - * is null or memory allocation fails. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__AdmittanceControllerState__Sequence__copy( - const control_msgs__msg__AdmittanceControllerState__Sequence * input, - control_msgs__msg__AdmittanceControllerState__Sequence * output); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__FUNCTIONS_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_introspection_c.h b/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_introspection_c.h deleted file mode 100755 index 45a47bbd..00000000 --- a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_introspection_c.h +++ /dev/null @@ -1,26 +0,0 @@ -// generated from rosidl_typesupport_introspection_c/resource/idl__rosidl_typesupport_introspection_c.h.em -// with input from control_msgs:msg/AdmittanceControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ -#define CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#include "rosidl_runtime_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "control_msgs/msg/rosidl_typesupport_introspection_c__visibility_control.h" - -ROSIDL_TYPESUPPORT_INTROSPECTION_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, control_msgs, msg, AdmittanceControllerState)(); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_microxrcedds_c.h b/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_microxrcedds_c.h deleted file mode 100755 index 82cc7aba..00000000 --- a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__rosidl_typesupport_microxrcedds_c.h +++ /dev/null @@ -1,39 +0,0 @@ -// generated from rosidl_typesupport_microxrcedds_c/resource/idl__rosidl_typesupport_c.h.em -// with input from control_msgs:msg/AdmittanceControllerState.idl -// generated code does not contain a copyright notice -#ifndef CONTROL_MSGS__MSG__ADMITTANCE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ -#define CONTROL_MSGS__MSG__ADMITTANCE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ - - -#include -#include -#include -#include "rosidl_runtime_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "control_msgs/msg/rosidl_typesupport_microxrcedds_c__visibility_control.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -size_t get_serialized_size_control_msgs__msg__AdmittanceControllerState( - const void * untyped_ros_message, - size_t current_alignment); - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -size_t max_serialized_size_control_msgs__msg__AdmittanceControllerState( - bool * full_bounded, - size_t current_alignment); - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_microxrcedds_c, control_msgs, msg, AdmittanceControllerState)(); - -#ifdef __cplusplus -} -#endif - - -#endif // CONTROL_MSGS__MSG__ADMITTANCE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__struct.h b/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__struct.h deleted file mode 100755 index d6fca9b2..00000000 --- a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__struct.h +++ /dev/null @@ -1,90 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__struct.h.em -// with input from control_msgs:msg/AdmittanceControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__STRUCT_H_ -#define CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__STRUCT_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include -#include - - -// Constants defined in the message - -// Include directives for member types -// Member 'mass' -// Member 'damping' -// Member 'stiffness' -#include "std_msgs/msg/detail/float64_multi_array__struct.h" -// Member 'rot_base_control' -#include "geometry_msgs/msg/detail/quaternion__struct.h" -// Member 'ref_trans_base_ft' -// Member 'admittance_position' -#include "geometry_msgs/msg/detail/transform_stamped__struct.h" -// Member 'selected_axes' -#include "std_msgs/msg/detail/int8_multi_array__struct.h" -// Member 'ft_sensor_frame' -#include "std_msgs/msg/detail/string__struct.h" -// Member 'admittance_acceleration' -// Member 'admittance_velocity' -#include "geometry_msgs/msg/detail/twist_stamped__struct.h" -// Member 'wrench_base' -#include "geometry_msgs/msg/detail/wrench_stamped__struct.h" -// Member 'joint_state' -#include "sensor_msgs/msg/detail/joint_state__struct.h" - -/// Struct defined in msg/AdmittanceControllerState in the package control_msgs. -/** - * Admittance parameters - */ -typedef struct control_msgs__msg__AdmittanceControllerState -{ - /// 6-vector of mass terms used in the admittance calculation - std_msgs__msg__Float64MultiArray mass; - /// 6-vector of damping terms used in the admittance calculation - std_msgs__msg__Float64MultiArray damping; - /// 6-vector of stiffness terms used in the admittance calculation - std_msgs__msg__Float64MultiArray stiffness; - /// Frame information - /// quaternion describing the orientation of the control frame - geometry_msgs__msg__Quaternion rot_base_control; - /// force torque sensor transform at the reference joint configuration - geometry_msgs__msg__TransformStamped ref_trans_base_ft; - /// 6-vector of 0/1 describing if admittance is enable in the corresponding control frame axis - std_msgs__msg__Int8MultiArray selected_axes; - /// name of the force torque frame - std_msgs__msg__String ft_sensor_frame; - /// State information - /// calculated admittance position in cartesian space - geometry_msgs__msg__TransformStamped admittance_position; - /// calculated admittance acceleration in cartesian space - geometry_msgs__msg__TwistStamped admittance_acceleration; - /// calculated admittance velocity in cartesian space - geometry_msgs__msg__TwistStamped admittance_velocity; - /// wrench used in the admittance calculation - geometry_msgs__msg__WrenchStamped wrench_base; - /// calculated admittance offsets in joint space - sensor_msgs__msg__JointState joint_state; -} control_msgs__msg__AdmittanceControllerState; - -// Struct for a sequence of control_msgs__msg__AdmittanceControllerState. -typedef struct control_msgs__msg__AdmittanceControllerState__Sequence -{ - control_msgs__msg__AdmittanceControllerState * data; - /// The number of valid items in data - size_t size; - /// The number of allocated items in data - size_t capacity; -} control_msgs__msg__AdmittanceControllerState__Sequence; - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__STRUCT_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__type_support.h b/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__type_support.h deleted file mode 100755 index 0ad585bb..00000000 --- a/libmicroros/include/control_msgs/msg/detail/admittance_controller_state__type_support.h +++ /dev/null @@ -1,33 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__type_support.h.em -// with input from control_msgs:msg/AdmittanceControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__TYPE_SUPPORT_H_ -#define CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__TYPE_SUPPORT_H_ - -#include "rosidl_typesupport_interface/macros.h" - -#include "control_msgs/msg/rosidl_generator_c__visibility_control.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "rosidl_runtime_c/message_type_support_struct.h" - -// Forward declare the get type support functions for this type. -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( - rosidl_typesupport_c, - control_msgs, - msg, - AdmittanceControllerState -)(); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__ADMITTANCE_CONTROLLER_STATE__TYPE_SUPPORT_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/joint_trajectory_controller_state__struct.h b/libmicroros/include/control_msgs/msg/detail/joint_trajectory_controller_state__struct.h index 2b108b26..d78257c7 100755 --- a/libmicroros/include/control_msgs/msg/detail/joint_trajectory_controller_state__struct.h +++ b/libmicroros/include/control_msgs/msg/detail/joint_trajectory_controller_state__struct.h @@ -21,55 +21,21 @@ extern "C" // Member 'header' #include "std_msgs/msg/detail/header__struct.h" // Member 'joint_names' -// Member 'multi_dof_joint_names' #include "rosidl_runtime_c/string.h" -// Member 'reference' -// Member 'feedback' -// Member 'error' -// Member 'output' // Member 'desired' // Member 'actual' +// Member 'error' #include "trajectory_msgs/msg/detail/joint_trajectory_point__struct.h" -// Member 'multi_dof_reference' -// Member 'multi_dof_feedback' -// Member 'multi_dof_error' -// Member 'multi_dof_output' -// Member 'multi_dof_desired' -// Member 'multi_dof_actual' -#include "trajectory_msgs/msg/detail/multi_dof_joint_trajectory_point__struct.h" /// Struct defined in msg/JointTrajectoryControllerState in the package control_msgs. -/** - * This message presents current controller state of JTC - */ typedef struct control_msgs__msg__JointTrajectoryControllerState { - /// Header timestamp should be update time of controller state std_msgs__msg__Header header; rosidl_runtime_c__String__Sequence joint_names; - /// The set point, that is, desired state. - trajectory_msgs__msg__JointTrajectoryPoint reference; - /// Current value of the process (ie: latest sensor measurement on the controlled value). - trajectory_msgs__msg__JointTrajectoryPoint feedback; - /// The error of the controlled value, essentially reference - feedback (for a regular PID implementation). - trajectory_msgs__msg__JointTrajectoryPoint error; - /// Current output of the controller. - trajectory_msgs__msg__JointTrajectoryPoint output; - /// -- deprecated -- trajectory_msgs__msg__JointTrajectoryPoint desired; trajectory_msgs__msg__JointTrajectoryPoint actual; - rosidl_runtime_c__String__Sequence multi_dof_joint_names; - /// The set point, that is, desired state. - trajectory_msgs__msg__MultiDOFJointTrajectoryPoint multi_dof_reference; - /// Current value of the process (ie: latest sensor measurement on the controlled value). - trajectory_msgs__msg__MultiDOFJointTrajectoryPoint multi_dof_feedback; - /// The error of the controlled value, essentially reference - feedback (for a regular PID implementation). - trajectory_msgs__msg__MultiDOFJointTrajectoryPoint multi_dof_error; - /// Current output of the controller. - trajectory_msgs__msg__MultiDOFJointTrajectoryPoint multi_dof_output; - /// -- deprecated -- - trajectory_msgs__msg__MultiDOFJointTrajectoryPoint multi_dof_desired; - trajectory_msgs__msg__MultiDOFJointTrajectoryPoint multi_dof_actual; + /// Redundant, but useful + trajectory_msgs__msg__JointTrajectoryPoint error; } control_msgs__msg__JointTrajectoryControllerState; // Struct for a sequence of control_msgs__msg__JointTrajectoryControllerState. diff --git a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__functions.h b/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__functions.h deleted file mode 100755 index 9e6c244e..00000000 --- a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__functions.h +++ /dev/null @@ -1,177 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__functions.h.em -// with input from control_msgs:msg/MecanumDriveControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__FUNCTIONS_H_ -#define CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include - -#include "rosidl_runtime_c/visibility_control.h" -#include "control_msgs/msg/rosidl_generator_c__visibility_control.h" - -#include "control_msgs/msg/detail/mecanum_drive_controller_state__struct.h" - -/// Initialize msg/MecanumDriveControllerState message. -/** - * If the init function is called twice for the same message without - * calling fini inbetween previously allocated memory will be leaked. - * \param[in,out] msg The previously allocated message pointer. - * Fields without a default value will not be initialized by this function. - * You might want to call memset(msg, 0, sizeof( - * control_msgs__msg__MecanumDriveControllerState - * )) before or use - * control_msgs__msg__MecanumDriveControllerState__create() - * to allocate and initialize the message. - * \return true if initialization was successful, otherwise false - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__MecanumDriveControllerState__init(control_msgs__msg__MecanumDriveControllerState * msg); - -/// Finalize msg/MecanumDriveControllerState message. -/** - * \param[in,out] msg The allocated message pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__MecanumDriveControllerState__fini(control_msgs__msg__MecanumDriveControllerState * msg); - -/// Create msg/MecanumDriveControllerState message. -/** - * It allocates the memory for the message, sets the memory to zero, and - * calls - * control_msgs__msg__MecanumDriveControllerState__init(). - * \return The pointer to the initialized message if successful, - * otherwise NULL - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -control_msgs__msg__MecanumDriveControllerState * -control_msgs__msg__MecanumDriveControllerState__create(); - -/// Destroy msg/MecanumDriveControllerState message. -/** - * It calls - * control_msgs__msg__MecanumDriveControllerState__fini() - * and frees the memory of the message. - * \param[in,out] msg The allocated message pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__MecanumDriveControllerState__destroy(control_msgs__msg__MecanumDriveControllerState * msg); - -/// Check for msg/MecanumDriveControllerState message equality. -/** - * \param[in] lhs The message on the left hand size of the equality operator. - * \param[in] rhs The message on the right hand size of the equality operator. - * \return true if messages are equal, otherwise false. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__MecanumDriveControllerState__are_equal(const control_msgs__msg__MecanumDriveControllerState * lhs, const control_msgs__msg__MecanumDriveControllerState * rhs); - -/// Copy a msg/MecanumDriveControllerState message. -/** - * This functions performs a deep copy, as opposed to the shallow copy that - * plain assignment yields. - * - * \param[in] input The source message pointer. - * \param[out] output The target message pointer, which must - * have been initialized before calling this function. - * \return true if successful, or false if either pointer is null - * or memory allocation fails. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__MecanumDriveControllerState__copy( - const control_msgs__msg__MecanumDriveControllerState * input, - control_msgs__msg__MecanumDriveControllerState * output); - -/// Initialize array of msg/MecanumDriveControllerState messages. -/** - * It allocates the memory for the number of elements and calls - * control_msgs__msg__MecanumDriveControllerState__init() - * for each element of the array. - * \param[in,out] array The allocated array pointer. - * \param[in] size The size / capacity of the array. - * \return true if initialization was successful, otherwise false - * If the array pointer is valid and the size is zero it is guaranteed - # to return true. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__MecanumDriveControllerState__Sequence__init(control_msgs__msg__MecanumDriveControllerState__Sequence * array, size_t size); - -/// Finalize array of msg/MecanumDriveControllerState messages. -/** - * It calls - * control_msgs__msg__MecanumDriveControllerState__fini() - * for each element of the array and frees the memory for the number of - * elements. - * \param[in,out] array The initialized array pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__MecanumDriveControllerState__Sequence__fini(control_msgs__msg__MecanumDriveControllerState__Sequence * array); - -/// Create array of msg/MecanumDriveControllerState messages. -/** - * It allocates the memory for the array and calls - * control_msgs__msg__MecanumDriveControllerState__Sequence__init(). - * \param[in] size The size / capacity of the array. - * \return The pointer to the initialized array if successful, otherwise NULL - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -control_msgs__msg__MecanumDriveControllerState__Sequence * -control_msgs__msg__MecanumDriveControllerState__Sequence__create(size_t size); - -/// Destroy array of msg/MecanumDriveControllerState messages. -/** - * It calls - * control_msgs__msg__MecanumDriveControllerState__Sequence__fini() - * on the array, - * and frees the memory of the array. - * \param[in,out] array The initialized array pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__MecanumDriveControllerState__Sequence__destroy(control_msgs__msg__MecanumDriveControllerState__Sequence * array); - -/// Check for msg/MecanumDriveControllerState message array equality. -/** - * \param[in] lhs The message array on the left hand size of the equality operator. - * \param[in] rhs The message array on the right hand size of the equality operator. - * \return true if message arrays are equal in size and content, otherwise false. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__MecanumDriveControllerState__Sequence__are_equal(const control_msgs__msg__MecanumDriveControllerState__Sequence * lhs, const control_msgs__msg__MecanumDriveControllerState__Sequence * rhs); - -/// Copy an array of msg/MecanumDriveControllerState messages. -/** - * This functions performs a deep copy, as opposed to the shallow copy that - * plain assignment yields. - * - * \param[in] input The source array pointer. - * \param[out] output The target array pointer, which must - * have been initialized before calling this function. - * \return true if successful, or false if either pointer - * is null or memory allocation fails. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__MecanumDriveControllerState__Sequence__copy( - const control_msgs__msg__MecanumDriveControllerState__Sequence * input, - control_msgs__msg__MecanumDriveControllerState__Sequence * output); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__FUNCTIONS_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_introspection_c.h b/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_introspection_c.h deleted file mode 100755 index 7e2ccbcf..00000000 --- a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_introspection_c.h +++ /dev/null @@ -1,26 +0,0 @@ -// generated from rosidl_typesupport_introspection_c/resource/idl__rosidl_typesupport_introspection_c.h.em -// with input from control_msgs:msg/MecanumDriveControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ -#define CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#include "rosidl_runtime_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "control_msgs/msg/rosidl_typesupport_introspection_c__visibility_control.h" - -ROSIDL_TYPESUPPORT_INTROSPECTION_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, control_msgs, msg, MecanumDriveControllerState)(); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_microxrcedds_c.h b/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_microxrcedds_c.h deleted file mode 100755 index b9ef0320..00000000 --- a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__rosidl_typesupport_microxrcedds_c.h +++ /dev/null @@ -1,39 +0,0 @@ -// generated from rosidl_typesupport_microxrcedds_c/resource/idl__rosidl_typesupport_c.h.em -// with input from control_msgs:msg/MecanumDriveControllerState.idl -// generated code does not contain a copyright notice -#ifndef CONTROL_MSGS__MSG__MECANUM_DRIVE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ -#define CONTROL_MSGS__MSG__MECANUM_DRIVE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ - - -#include -#include -#include -#include "rosidl_runtime_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "control_msgs/msg/rosidl_typesupport_microxrcedds_c__visibility_control.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -size_t get_serialized_size_control_msgs__msg__MecanumDriveControllerState( - const void * untyped_ros_message, - size_t current_alignment); - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -size_t max_serialized_size_control_msgs__msg__MecanumDriveControllerState( - bool * full_bounded, - size_t current_alignment); - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_microxrcedds_c, control_msgs, msg, MecanumDriveControllerState)(); - -#ifdef __cplusplus -} -#endif - - -#endif // CONTROL_MSGS__MSG__MECANUM_DRIVE_CONTROLLER_STATE__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__struct.h b/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__struct.h deleted file mode 100755 index f321bcd8..00000000 --- a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__struct.h +++ /dev/null @@ -1,51 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__struct.h.em -// with input from control_msgs:msg/MecanumDriveControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__STRUCT_H_ -#define CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__STRUCT_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include -#include - - -// Constants defined in the message - -// Include directives for member types -// Member 'header' -#include "std_msgs/msg/detail/header__struct.h" -// Member 'reference_velocity' -#include "geometry_msgs/msg/detail/twist__struct.h" - -/// Struct defined in msg/MecanumDriveControllerState in the package control_msgs. -typedef struct control_msgs__msg__MecanumDriveControllerState -{ - std_msgs__msg__Header header; - double front_left_wheel_velocity; - double back_left_wheel_velocity; - double back_right_wheel_velocity; - double front_right_wheel_velocity; - geometry_msgs__msg__Twist reference_velocity; -} control_msgs__msg__MecanumDriveControllerState; - -// Struct for a sequence of control_msgs__msg__MecanumDriveControllerState. -typedef struct control_msgs__msg__MecanumDriveControllerState__Sequence -{ - control_msgs__msg__MecanumDriveControllerState * data; - /// The number of valid items in data - size_t size; - /// The number of allocated items in data - size_t capacity; -} control_msgs__msg__MecanumDriveControllerState__Sequence; - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__STRUCT_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__type_support.h b/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__type_support.h deleted file mode 100755 index e1ad91eb..00000000 --- a/libmicroros/include/control_msgs/msg/detail/mecanum_drive_controller_state__type_support.h +++ /dev/null @@ -1,33 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__type_support.h.em -// with input from control_msgs:msg/MecanumDriveControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__TYPE_SUPPORT_H_ -#define CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__TYPE_SUPPORT_H_ - -#include "rosidl_typesupport_interface/macros.h" - -#include "control_msgs/msg/rosidl_generator_c__visibility_control.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "rosidl_runtime_c/message_type_support_struct.h" - -// Forward declare the get type support functions for this type. -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( - rosidl_typesupport_c, - control_msgs, - msg, - MecanumDriveControllerState -)(); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__MECANUM_DRIVE_CONTROLLER_STATE__TYPE_SUPPORT_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__functions.h b/libmicroros/include/control_msgs/msg/detail/steering_controller_status__functions.h deleted file mode 100755 index 4a28e092..00000000 --- a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__functions.h +++ /dev/null @@ -1,177 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__functions.h.em -// with input from control_msgs:msg/SteeringControllerStatus.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__FUNCTIONS_H_ -#define CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include - -#include "rosidl_runtime_c/visibility_control.h" -#include "control_msgs/msg/rosidl_generator_c__visibility_control.h" - -#include "control_msgs/msg/detail/steering_controller_status__struct.h" - -/// Initialize msg/SteeringControllerStatus message. -/** - * If the init function is called twice for the same message without - * calling fini inbetween previously allocated memory will be leaked. - * \param[in,out] msg The previously allocated message pointer. - * Fields without a default value will not be initialized by this function. - * You might want to call memset(msg, 0, sizeof( - * control_msgs__msg__SteeringControllerStatus - * )) before or use - * control_msgs__msg__SteeringControllerStatus__create() - * to allocate and initialize the message. - * \return true if initialization was successful, otherwise false - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__SteeringControllerStatus__init(control_msgs__msg__SteeringControllerStatus * msg); - -/// Finalize msg/SteeringControllerStatus message. -/** - * \param[in,out] msg The allocated message pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__SteeringControllerStatus__fini(control_msgs__msg__SteeringControllerStatus * msg); - -/// Create msg/SteeringControllerStatus message. -/** - * It allocates the memory for the message, sets the memory to zero, and - * calls - * control_msgs__msg__SteeringControllerStatus__init(). - * \return The pointer to the initialized message if successful, - * otherwise NULL - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -control_msgs__msg__SteeringControllerStatus * -control_msgs__msg__SteeringControllerStatus__create(); - -/// Destroy msg/SteeringControllerStatus message. -/** - * It calls - * control_msgs__msg__SteeringControllerStatus__fini() - * and frees the memory of the message. - * \param[in,out] msg The allocated message pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__SteeringControllerStatus__destroy(control_msgs__msg__SteeringControllerStatus * msg); - -/// Check for msg/SteeringControllerStatus message equality. -/** - * \param[in] lhs The message on the left hand size of the equality operator. - * \param[in] rhs The message on the right hand size of the equality operator. - * \return true if messages are equal, otherwise false. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__SteeringControllerStatus__are_equal(const control_msgs__msg__SteeringControllerStatus * lhs, const control_msgs__msg__SteeringControllerStatus * rhs); - -/// Copy a msg/SteeringControllerStatus message. -/** - * This functions performs a deep copy, as opposed to the shallow copy that - * plain assignment yields. - * - * \param[in] input The source message pointer. - * \param[out] output The target message pointer, which must - * have been initialized before calling this function. - * \return true if successful, or false if either pointer is null - * or memory allocation fails. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__SteeringControllerStatus__copy( - const control_msgs__msg__SteeringControllerStatus * input, - control_msgs__msg__SteeringControllerStatus * output); - -/// Initialize array of msg/SteeringControllerStatus messages. -/** - * It allocates the memory for the number of elements and calls - * control_msgs__msg__SteeringControllerStatus__init() - * for each element of the array. - * \param[in,out] array The allocated array pointer. - * \param[in] size The size / capacity of the array. - * \return true if initialization was successful, otherwise false - * If the array pointer is valid and the size is zero it is guaranteed - # to return true. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__SteeringControllerStatus__Sequence__init(control_msgs__msg__SteeringControllerStatus__Sequence * array, size_t size); - -/// Finalize array of msg/SteeringControllerStatus messages. -/** - * It calls - * control_msgs__msg__SteeringControllerStatus__fini() - * for each element of the array and frees the memory for the number of - * elements. - * \param[in,out] array The initialized array pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__SteeringControllerStatus__Sequence__fini(control_msgs__msg__SteeringControllerStatus__Sequence * array); - -/// Create array of msg/SteeringControllerStatus messages. -/** - * It allocates the memory for the array and calls - * control_msgs__msg__SteeringControllerStatus__Sequence__init(). - * \param[in] size The size / capacity of the array. - * \return The pointer to the initialized array if successful, otherwise NULL - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -control_msgs__msg__SteeringControllerStatus__Sequence * -control_msgs__msg__SteeringControllerStatus__Sequence__create(size_t size); - -/// Destroy array of msg/SteeringControllerStatus messages. -/** - * It calls - * control_msgs__msg__SteeringControllerStatus__Sequence__fini() - * on the array, - * and frees the memory of the array. - * \param[in,out] array The initialized array pointer. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -void -control_msgs__msg__SteeringControllerStatus__Sequence__destroy(control_msgs__msg__SteeringControllerStatus__Sequence * array); - -/// Check for msg/SteeringControllerStatus message array equality. -/** - * \param[in] lhs The message array on the left hand size of the equality operator. - * \param[in] rhs The message array on the right hand size of the equality operator. - * \return true if message arrays are equal in size and content, otherwise false. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__SteeringControllerStatus__Sequence__are_equal(const control_msgs__msg__SteeringControllerStatus__Sequence * lhs, const control_msgs__msg__SteeringControllerStatus__Sequence * rhs); - -/// Copy an array of msg/SteeringControllerStatus messages. -/** - * This functions performs a deep copy, as opposed to the shallow copy that - * plain assignment yields. - * - * \param[in] input The source array pointer. - * \param[out] output The target array pointer, which must - * have been initialized before calling this function. - * \return true if successful, or false if either pointer - * is null or memory allocation fails. - */ -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -bool -control_msgs__msg__SteeringControllerStatus__Sequence__copy( - const control_msgs__msg__SteeringControllerStatus__Sequence * input, - control_msgs__msg__SteeringControllerStatus__Sequence * output); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__FUNCTIONS_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_introspection_c.h b/libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_introspection_c.h deleted file mode 100755 index 943904a0..00000000 --- a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_introspection_c.h +++ /dev/null @@ -1,26 +0,0 @@ -// generated from rosidl_typesupport_introspection_c/resource/idl__rosidl_typesupport_introspection_c.h.em -// with input from control_msgs:msg/SteeringControllerStatus.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ -#define CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#include "rosidl_runtime_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "control_msgs/msg/rosidl_typesupport_introspection_c__visibility_control.h" - -ROSIDL_TYPESUPPORT_INTROSPECTION_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, control_msgs, msg, SteeringControllerStatus)(); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__ROSIDL_TYPESUPPORT_INTROSPECTION_C_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_microxrcedds_c.h b/libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_microxrcedds_c.h deleted file mode 100755 index cc19c13f..00000000 --- a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__rosidl_typesupport_microxrcedds_c.h +++ /dev/null @@ -1,39 +0,0 @@ -// generated from rosidl_typesupport_microxrcedds_c/resource/idl__rosidl_typesupport_c.h.em -// with input from control_msgs:msg/SteeringControllerStatus.idl -// generated code does not contain a copyright notice -#ifndef CONTROL_MSGS__MSG__STEERING_CONTROLLER_STATUS__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ -#define CONTROL_MSGS__MSG__STEERING_CONTROLLER_STATUS__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ - - -#include -#include -#include -#include "rosidl_runtime_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "control_msgs/msg/rosidl_typesupport_microxrcedds_c__visibility_control.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -size_t get_serialized_size_control_msgs__msg__SteeringControllerStatus( - const void * untyped_ros_message, - size_t current_alignment); - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -size_t max_serialized_size_control_msgs__msg__SteeringControllerStatus( - bool * full_bounded, - size_t current_alignment); - -ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_microxrcedds_c, control_msgs, msg, SteeringControllerStatus)(); - -#ifdef __cplusplus -} -#endif - - -#endif // CONTROL_MSGS__MSG__STEERING_CONTROLLER_STATUS__ROSIDL_TYPESUPPORT_MICROXRCEDDS_C_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__struct.h b/libmicroros/include/control_msgs/msg/detail/steering_controller_status__struct.h deleted file mode 100755 index cdba027f..00000000 --- a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__struct.h +++ /dev/null @@ -1,60 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__struct.h.em -// with input from control_msgs:msg/SteeringControllerStatus.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__STRUCT_H_ -#define CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__STRUCT_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include -#include - - -// Constants defined in the message - -// Include directives for member types -// Member 'header' -#include "std_msgs/msg/detail/header__struct.h" -// Member 'traction_wheels_position' -// Member 'traction_wheels_velocity' -// Member 'steer_positions' -// Member 'linear_velocity_command' -// Member 'steering_angle_command' -#include "rosidl_runtime_c/primitives_sequence.h" - -/// Struct defined in msg/SteeringControllerStatus in the package control_msgs. -typedef struct control_msgs__msg__SteeringControllerStatus -{ - std_msgs__msg__Header header; - /// positions of traction wheels if the robot is controlled by position - rosidl_runtime_c__double__Sequence traction_wheels_position; - /// velocities of traction wheels if the robot is controlled by velocity - rosidl_runtime_c__double__Sequence traction_wheels_velocity; - /// positions of steering joints - rosidl_runtime_c__double__Sequence steer_positions; - /// value commanded to tractions joint - rosidl_runtime_c__double__Sequence linear_velocity_command; - /// values commanded to steering joints - rosidl_runtime_c__double__Sequence steering_angle_command; -} control_msgs__msg__SteeringControllerStatus; - -// Struct for a sequence of control_msgs__msg__SteeringControllerStatus. -typedef struct control_msgs__msg__SteeringControllerStatus__Sequence -{ - control_msgs__msg__SteeringControllerStatus * data; - /// The number of valid items in data - size_t size; - /// The number of allocated items in data - size_t capacity; -} control_msgs__msg__SteeringControllerStatus__Sequence; - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__STRUCT_H_ diff --git a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__type_support.h b/libmicroros/include/control_msgs/msg/detail/steering_controller_status__type_support.h deleted file mode 100755 index 8ca0e428..00000000 --- a/libmicroros/include/control_msgs/msg/detail/steering_controller_status__type_support.h +++ /dev/null @@ -1,33 +0,0 @@ -// generated from rosidl_generator_c/resource/idl__type_support.h.em -// with input from control_msgs:msg/SteeringControllerStatus.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__TYPE_SUPPORT_H_ -#define CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__TYPE_SUPPORT_H_ - -#include "rosidl_typesupport_interface/macros.h" - -#include "control_msgs/msg/rosidl_generator_c__visibility_control.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "rosidl_runtime_c/message_type_support_struct.h" - -// Forward declare the get type support functions for this type. -ROSIDL_GENERATOR_C_PUBLIC_control_msgs -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( - rosidl_typesupport_c, - control_msgs, - msg, - SteeringControllerStatus -)(); - -#ifdef __cplusplus -} -#endif - -#endif // CONTROL_MSGS__MSG__DETAIL__STEERING_CONTROLLER_STATUS__TYPE_SUPPORT_H_ diff --git a/libmicroros/include/control_msgs/msg/mecanum_drive_controller_state.h b/libmicroros/include/control_msgs/msg/mecanum_drive_controller_state.h deleted file mode 100755 index 487b6e1c..00000000 --- a/libmicroros/include/control_msgs/msg/mecanum_drive_controller_state.h +++ /dev/null @@ -1,12 +0,0 @@ -// generated from rosidl_generator_c/resource/idl.h.em -// with input from control_msgs:msg/MecanumDriveControllerState.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__MECANUM_DRIVE_CONTROLLER_STATE_H_ -#define CONTROL_MSGS__MSG__MECANUM_DRIVE_CONTROLLER_STATE_H_ - -#include "control_msgs/msg/detail/mecanum_drive_controller_state__struct.h" -#include "control_msgs/msg/detail/mecanum_drive_controller_state__functions.h" -#include "control_msgs/msg/detail/mecanum_drive_controller_state__type_support.h" - -#endif // CONTROL_MSGS__MSG__MECANUM_DRIVE_CONTROLLER_STATE_H_ diff --git a/libmicroros/include/control_msgs/msg/steering_controller_status.h b/libmicroros/include/control_msgs/msg/steering_controller_status.h deleted file mode 100755 index 44799e63..00000000 --- a/libmicroros/include/control_msgs/msg/steering_controller_status.h +++ /dev/null @@ -1,12 +0,0 @@ -// generated from rosidl_generator_c/resource/idl.h.em -// with input from control_msgs:msg/SteeringControllerStatus.idl -// generated code does not contain a copyright notice - -#ifndef CONTROL_MSGS__MSG__STEERING_CONTROLLER_STATUS_H_ -#define CONTROL_MSGS__MSG__STEERING_CONTROLLER_STATUS_H_ - -#include "control_msgs/msg/detail/steering_controller_status__struct.h" -#include "control_msgs/msg/detail/steering_controller_status__functions.h" -#include "control_msgs/msg/detail/steering_controller_status__type_support.h" - -#endif // CONTROL_MSGS__MSG__STEERING_CONTROLLER_STATUS_H_ diff --git a/libmicroros/include/uxr/client/config.h b/libmicroros/include/uxr/client/config.h index 38501bc6..ad674092 100755 --- a/libmicroros/include/uxr/client/config.h +++ b/libmicroros/include/uxr/client/config.h @@ -16,9 +16,9 @@ #define _UXR_CLIENT_CONFIG_H_ #define UXR_CLIENT_VERSION_MAJOR 2 -#define UXR_CLIENT_VERSION_MINOR 4 +#define UXR_CLIENT_VERSION_MINOR 3 #define UXR_CLIENT_VERSION_MICRO 0 -#define UXR_CLIENT_VERSION_STR "2.4.0" +#define UXR_CLIENT_VERSION_STR "2.3.0" /* #undef UCLIENT_PROFILE_DISCOVERY */ diff --git a/libmicroros/include/uxr/client/core/session/create_entities_ref.h b/libmicroros/include/uxr/client/core/session/create_entities_ref.h index 4049e5d6..7b4afd35 100755 --- a/libmicroros/include/uxr/client/core/session/create_entities_ref.h +++ b/libmicroros/include/uxr/client/core/session/create_entities_ref.h @@ -51,7 +51,7 @@ UXRDLLAPI uint16_t uxr_buffer_create_participant_ref( uxrSession* session, uxrStreamId stream_id, uxrObjectId object_id, - uint16_t domain_id, + int16_t domain_id, const char* ref, uint8_t mode); diff --git a/libmicroros/libmicroros.a b/libmicroros/libmicroros.a index 8ffc54218dd22d54a6dc79b9781546c52b3b29c3..e3138c3ff37894dc468d666f71e658fca44f1974 100755 GIT binary patch delta 110307 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 a8q?zdwSBxvuu6s7SsL*b+dgjHIOc!#3DrOV delta 110274 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 I_nX812?Sf1ssI20 diff --git a/librobot/motor.c b/librobot/motor.c new file mode 100644 index 00000000..73f625ea --- /dev/null +++ b/librobot/motor.c @@ -0,0 +1,52 @@ +#include "motor.h" + +void init_motor(motor *motor, int clockwise_pin, + int counterclockwise_pin, int pwm_pin) +{ + motor->clockwise_pin = clockwise_pin; + motor->counterclockwise_pin = counterclockwise_pin; + motor->pwm_pin = pwm_pin; + + gpio_init(motor->clockwise_pin); + gpio_set_dir(motor->clockwise_pin, GPIO_OUT); + gpio_pull_up(motor->clockwise_pin); + + gpio_init(motor->counterclockwise_pin); + gpio_set_dir(motor->counterclockwise_pin, GPIO_OUT); + gpio_pull_up(motor->counterclockwise_pin); + + gpio_set_function(motor->pwm_pin, GPIO_FUNC_PWM); + gpio_pull_up(motor->pwm_pin); + uint slice_num = pwm_gpio_to_slice_num(motor->pwm_pin); + pwm_set_wrap(slice_num, MAX_CYCLES); + pwm_set_gpio_level(motor->pwm_pin, 0); + pwm_set_enabled(slice_num, 1); +} + +void forward_motor(motor *motor, int speed) +{ + gpio_put(motor->clockwise_pin, 1); + gpio_put(motor->counterclockwise_pin, 0); + pwm_set_gpio_level(motor->pwm_pin, speed <= MAX_CYCLES - 1 ? speed : MAX_CYCLES - 1); +} + +void backward_motor(motor *motor, int speed) +{ + gpio_put(motor->clockwise_pin, 0); + gpio_put(motor->counterclockwise_pin, 1); + pwm_set_gpio_level(motor->pwm_pin, speed <= MAX_CYCLES - 1 ? speed : MAX_CYCLES - 1); +} + +void stop_motor(motor *motor) +{ + gpio_put(motor->clockwise_pin, 0); + gpio_put(motor->counterclockwise_pin, 0); + pwm_set_gpio_level(motor->pwm_pin, 0); +} + +void brake_motor(motor *motor) +{ + gpio_put(motor->clockwise_pin, 1); + gpio_put(motor->counterclockwise_pin, 1); + pwm_set_gpio_level(motor->pwm_pin, 0); +} \ No newline at end of file diff --git a/librobot/motor.h b/librobot/motor.h new file mode 100644 index 00000000..eb6a7e25 --- /dev/null +++ b/librobot/motor.h @@ -0,0 +1,27 @@ +#ifndef __MOTOR_H__ +#define __MOTOR_H__ + +#include "pico/stdlib.h" +#include "hardware/pwm.h" + +#define MAX_CYCLES 256 + +typedef struct +{ + uint8_t clockwise_pin; + uint8_t counterclockwise_pin; + uint8_t pwm_pin; +} motor; + +void init_motor(motor *motor, int clockwise_pin, + int counterclockwise_pin, int pwm_pin); + +void forward_motor(motor *motor, int speed); + +void backward_motor(motor *motor, int speed); + +void stop_motor(motor *motor); + +void brake_motor(motor *motor); + +#endif \ No newline at end of file diff --git a/librobot/robot.c b/librobot/robot.c new file mode 100644 index 00000000..8e62416d --- /dev/null +++ b/librobot/robot.c @@ -0,0 +1,53 @@ +#include "robot.h" +#include + +void forward_robot(robot *robot, int speed) +{ + forward_motor(&robot->motor_left, speed); + forward_motor(&robot->motor_right, speed); +} + +void backward_robot(robot *robot, int speed) +{ + backward_motor(&robot->motor_left, speed); + backward_motor(&robot->motor_right, speed); +} + +void left_robot(robot *robot, int speed) +{ + backward_motor(&robot->motor_left, speed); + forward_motor(&robot->motor_right, speed); +} + +void duck_left_robot(robot *robot, int speed) +{ + stop_motor(&robot->motor_left); + forward_motor(&robot->motor_right, speed); +} + +void right_robot(robot *robot, int speed) +{ + forward_motor(&robot->motor_left, speed); + backward_motor(&robot->motor_right, speed); +} + +void duck_right_robot(robot *robot, int speed) +{ + forward_motor(&robot->motor_left, speed); + stop_motor(&robot->motor_right); +} + +void brake_robot(robot *robot) +{ + brake_motor(&robot->motor_left); + brake_motor(&robot->motor_right); +} + +uint8_t read_sensors(sensor *wall, sensor *ground) +{ + uint8_t wall_data = read_sensor(wall); + uint8_t ground_data = read_sensor(ground); + printf("m: %d - g: %d ", wall_data, ground_data); + + return (wall_data << 3) + ground_data; +} \ No newline at end of file diff --git a/librobot/robot.h b/librobot/robot.h new file mode 100644 index 00000000..e870c51c --- /dev/null +++ b/librobot/robot.h @@ -0,0 +1,45 @@ +#ifndef __ROBOT_H__ +#define __ROBOT_H__ + +#include "pico/stdlib.h" +#include "hardware/pwm.h" +#include "librobot/motor.h" +#include "librobot/sensor.h" + +typedef enum +{ + STOP, + FORWARD, + RIGHT, + BACKWARD, + LEFT, + DUCK_LEFT, + DUCK_RIGHT +} action; + +typedef struct +{ + action state; + motor motor_left; + motor motor_right; + sensor wall; + sensor ground; +} robot; + +void forward_robot(robot *robot, int speed); + +void backward_robot(robot *robot, int speed); + +void left_robot(robot *robot, int speed); + +void duck_left_robot(robot *robot, int speed); + +void right_robot(robot *robot, int speed); + +void duck_right_robot(robot *robot, int speed); + +void brake_robot(robot *robot); + +uint8_t read_sensors(sensor *wall, sensor *ground); + +#endif \ No newline at end of file diff --git a/librobot/sensor.c b/librobot/sensor.c new file mode 100644 index 00000000..8684a312 --- /dev/null +++ b/librobot/sensor.c @@ -0,0 +1,27 @@ +#include "sensor.h" + +void init_sensor(sensor *sensor, uint8_t left, uint8_t middle, uint8_t right) +{ + sensor->left = left; + sensor->middle = middle; + sensor->right = right; + + gpio_init(sensor->left); + gpio_set_dir(sensor->left, GPIO_IN); + gpio_pull_up(sensor->left); + gpio_init(sensor->middle); + gpio_set_dir(sensor->middle, GPIO_IN); + gpio_pull_up(sensor->middle); + gpio_init(sensor->right); + gpio_set_dir(sensor->right, GPIO_IN); + gpio_pull_up(sensor->right); +} + +uint8_t read_sensor(sensor *sensor) +{ + uint8_t left = gpio_get(sensor->left); + uint8_t middle = gpio_get(sensor->middle); + uint8_t right = gpio_get(sensor->right); + + return (left << 2) + (middle << 1) + (right); +} \ No newline at end of file diff --git a/librobot/sensor.h b/librobot/sensor.h new file mode 100644 index 00000000..91e9b014 --- /dev/null +++ b/librobot/sensor.h @@ -0,0 +1,17 @@ +#ifndef __SENSOR_H__ +#define __SENSOR_H__ + +#include "hardware/gpio.h" + +typedef struct +{ + uint8_t left; + uint8_t middle; + uint8_t right; +} sensor; + +void init_sensor(sensor *sensor, uint8_t left, uint8_t middle, uint8_t right); + +uint8_t read_sensor(sensor* sensor); + +#endif \ No newline at end of file diff --git a/lwipopts.h b/lwipopts.h new file mode 100644 index 00000000..997ed7b7 --- /dev/null +++ b/lwipopts.h @@ -0,0 +1,89 @@ +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +// Common settings used in most of the pico_w examples +// (see https://www.nongnu.org/lwip/2_1_x/group__lwip__opts.html for details) + +// allow override in some examples +#ifndef NO_SYS +#define NO_SYS 1 +#endif +// allow override in some examples +#ifndef LWIP_SOCKET +#define LWIP_SOCKET 0 +#endif +#if PICO_CYW43_ARCH_POLL +#define MEM_LIBC_MALLOC 1 +#else +// MEM_LIBC_MALLOC is incompatible with non polling versions +#define MEM_LIBC_MALLOC 0 +#endif +#define MEM_ALIGNMENT 4 +#define MEM_SIZE 4000 +#define MEMP_NUM_TCP_SEG 32 +#define MEMP_NUM_ARP_QUEUE 10 +#define PBUF_POOL_SIZE 24 +#define LWIP_ARP 1 +#define LWIP_ETHERNET 1 +#define LWIP_ICMP 1 +#define LWIP_RAW 1 +#define TCP_WND (8 * TCP_MSS) +#define TCP_MSS 1460 +#define TCP_SND_BUF (8 * TCP_MSS) +#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1)) / (TCP_MSS)) +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_NETIF_LINK_CALLBACK 1 +#define LWIP_NETIF_HOSTNAME 1 +#define LWIP_NETCONN 0 +#define MEM_STATS 0 +#define SYS_STATS 0 +#define MEMP_STATS 0 +#define LINK_STATS 0 +// #define ETH_PAD_SIZE 2 +#define LWIP_CHKSUM_ALGORITHM 3 +#define LWIP_DHCP 1 +#define LWIP_IPV4 1 +#define LWIP_TCP 1 +#define LWIP_UDP 1 +#define LWIP_DNS 1 +#define LWIP_TCP_KEEPALIVE 1 +#define LWIP_NETIF_TX_SINGLE_PBUF 1 +#define DHCP_DOES_ARP_CHECK 0 +#define LWIP_DHCP_DOES_ACD_CHECK 0 + +#ifndef NDEBUG +#define LWIP_DEBUG 1 +#define LWIP_STATS 1 +#define LWIP_STATS_DISPLAY 1 +#endif + +#define ETHARP_DEBUG LWIP_DBG_OFF +#define NETIF_DEBUG LWIP_DBG_OFF +#define PBUF_DEBUG LWIP_DBG_OFF +#define API_LIB_DEBUG LWIP_DBG_OFF +#define API_MSG_DEBUG LWIP_DBG_OFF +#define SOCKETS_DEBUG LWIP_DBG_OFF +#define ICMP_DEBUG LWIP_DBG_OFF +#define INET_DEBUG LWIP_DBG_OFF +#define IP_DEBUG LWIP_DBG_OFF +#define IP_REASS_DEBUG LWIP_DBG_OFF +#define RAW_DEBUG LWIP_DBG_OFF +#define MEM_DEBUG LWIP_DBG_OFF +#define MEMP_DEBUG LWIP_DBG_OFF +#define SYS_DEBUG LWIP_DBG_OFF +#define TCP_DEBUG LWIP_DBG_OFF +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#define TCP_WND_DEBUG LWIP_DBG_OFF +#define TCP_FR_DEBUG LWIP_DBG_OFF +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#define TCP_RST_DEBUG LWIP_DBG_OFF +#define UDP_DEBUG LWIP_DBG_OFF +#define TCPIP_DEBUG LWIP_DBG_OFF +#define PPP_DEBUG LWIP_DBG_OFF +#define SLIP_DEBUG LWIP_DBG_OFF +#define DHCP_DEBUG LWIP_DBG_OFF + +#endif /* __LWIPOPTS_H__ */ diff --git a/microros_static_library/library_generation/colcon.meta b/microros_static_library/library_generation/colcon.meta old mode 100755 new mode 100644 diff --git a/microros_static_library/library_generation/extra_packages/extra_packages.repos b/microros_static_library/library_generation/extra_packages/extra_packages.repos old mode 100755 new mode 100644 index 724270ef..1deca123 --- a/microros_static_library/library_generation/extra_packages/extra_packages.repos +++ b/microros_static_library/library_generation/extra_packages/extra_packages.repos @@ -2,4 +2,4 @@ repositories: control_msgs: type: git url: https://github.com/ros-controls/control_msgs - version: humble \ No newline at end of file + version: galactic-devel \ No newline at end of file diff --git a/microros_static_library/library_generation/library_generation.sh b/microros_static_library/library_generation/library_generation.sh old mode 100755 new mode 100644 index 7ae4c93d..bc44535e --- a/microros_static_library/library_generation/library_generation.sh +++ b/microros_static_library/library_generation/library_generation.sh @@ -63,8 +63,6 @@ done ######## Generate extra files ######## find firmware/mcu_ws/ros2 \( -name "*.srv" -o -name "*.msg" -o -name "*.action" \) | awk -F"/" '{print $(NF-2)"/"$NF}' > /project/available_ros2_types find firmware/mcu_ws/extra_packages \( -name "*.srv" -o -name "*.msg" -o -name "*.action" \) | awk -F"/" '{print $(NF-2)"/"$NF}' >> /project/available_ros2_types -# sort it so that the result order is reproducible -sort -o /project/available_ros2_types /project/available_ros2_types cd firmware echo "" > /project/built_packages diff --git a/microros_static_library/library_generation/toolchain.cmake b/microros_static_library/library_generation/toolchain.cmake old mode 100755 new mode 100644 diff --git a/pico_micro_ros_example.c b/pico_micro_ros_example.c index 4eb0e422..3c767dfb 100755 --- a/pico_micro_ros_example.c +++ b/pico_micro_ros_example.c @@ -4,36 +4,76 @@ #include #include #include -#include + +#include + #include #include "pico/stdlib.h" -#include "pico_uart_transports.h" +#include "pico_wifi_transport.h" +#include "librobot/robot.h" -const uint LED_PIN = 25; +robot picobot; +action current_state = STOP; rcl_publisher_t publisher; -std_msgs__msg__Int32 msg; +rcl_subscription_t subscriber; + +std_msgs__msg__Int8 msg_pub; +std_msgs__msg__Int8 msg_sub; void timer_callback(rcl_timer_t *timer, int64_t last_call_time) { - rcl_ret_t ret = rcl_publish(&publisher, &msg, NULL); - msg.data++; + msg_pub.data = read_sensors(&picobot.wall, &picobot.ground); + char buf[3]; + sprintf(buf, "%d", msg_pub.data); + printf("%s ", buf); + rcl_ret_t ret = rcl_publish(&publisher, &msg_pub, NULL); + + switch (current_state) + { + case STOP: + brake_robot(&picobot); + break; + case FORWARD: + forward_robot(&picobot, 50); + break; + case RIGHT: + right_robot(&picobot, 45); + break; + case BACKWARD: + backward_robot(&picobot, 50); + break; + case LEFT: + left_robot(&picobot, 45); + break; + case DUCK_LEFT: + duck_left_robot(&picobot, 50); + break; + case DUCK_RIGHT: + duck_right_robot(&picobot, 50); + break; + default: + break; + } +} + +void subscription_callback(const void *msgin) +{ + const std_msgs__msg__Int8 *msg = (const std_msgs__msg__Int8 *)msgin; + + current_state = msg->data; } int main() { - rmw_uros_set_custom_transport( - true, - NULL, - pico_serial_transport_open, - pico_serial_transport_close, - pico_serial_transport_write, - pico_serial_transport_read - ); - - gpio_init(LED_PIN); - gpio_set_dir(LED_PIN, GPIO_OUT); + set_microros_wifi_transports("SSID", "PASSWORD", "PC IP ADDRESS", 4444); + + picobot.state = STOP; + init_motor(&picobot.motor_left, 20, 19, 21); + init_motor(&picobot.motor_right, 17, 18, 16); + init_sensor(&picobot.wall, 26, 27, 28); + init_sensor(&picobot.ground, 13, 12, 11); rcl_timer_t timer; rcl_node_t node; @@ -44,7 +84,7 @@ int main() allocator = rcl_get_default_allocator(); // Wait for agent successful ping for 2 minutes. - const int timeout_ms = 1000; + const int timeout_ms = 1000; const uint8_t attempts = 120; rcl_ret_t ret = rmw_uros_ping_agent(timeout_ms, attempts); @@ -52,33 +92,39 @@ int main() if (ret != RCL_RET_OK) { // Unreachable agent, exiting program. + printf("Agent unreachable. Exiting..."); return ret; } rclc_support_init(&support, 0, NULL, &allocator); - rclc_node_init_default(&node, "pico_node", "", &support); - rclc_publisher_init_default( + rclc_node_init_default(&node, "picobot_node", "", &support); + + rclc_subscription_init_best_effort( + &subscriber, + &node, + ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int8), + "picobot/cmd_vel"); + + rclc_publisher_init_best_effort( &publisher, &node, - ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), - "pico_publisher"); + ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int8), + "picobot/sensors"); rclc_timer_init_default( &timer, &support, - RCL_MS_TO_NS(1000), + RCL_MS_TO_NS(100), timer_callback); - rclc_executor_init(&executor, &support.context, 1, &allocator); + rclc_executor_init(&executor, &support.context, 2, &allocator); rclc_executor_add_timer(&executor, &timer); + rclc_executor_add_subscription(&executor, &subscriber, &msg_sub, &subscription_callback, ON_NEW_DATA); - gpio_put(LED_PIN, 1); - - msg.data = 0; while (true) { - rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)); + rcl_ret_t ret = rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)); } return 0; -} +} \ No newline at end of file diff --git a/pico_uart_transport.c b/pico_uart_transport.c deleted file mode 100755 index 84f784ac..00000000 --- a/pico_uart_transport.c +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include "pico/stdlib.h" - -#include - -void usleep(uint64_t us) -{ - sleep_us(us); -} - -int clock_gettime(clockid_t unused, struct timespec *tp) -{ - uint64_t m = time_us_64(); - tp->tv_sec = m / 1000000; - tp->tv_nsec = (m % 1000000) * 1000; - return 0; -} - -bool pico_serial_transport_open(struct uxrCustomTransport * transport) -{ - stdio_init_all(); - return true; -} - -bool pico_serial_transport_close(struct uxrCustomTransport * transport) -{ - return true; -} - -size_t pico_serial_transport_write(struct uxrCustomTransport * transport, uint8_t *buf, size_t len, uint8_t *errcode) -{ - for (size_t i = 0; i < len; i++) - { - if (buf[i] != putchar(buf[i])) - { - *errcode = 1; - return i; - } - } - return len; -} - -size_t pico_serial_transport_read(struct uxrCustomTransport * transport, uint8_t *buf, size_t len, int timeout, uint8_t *errcode) -{ - uint64_t start_time_us = time_us_64(); - for (size_t i = 0; i < len; i++) - { - int64_t elapsed_time_us = timeout * 1000 - (time_us_64() - start_time_us); - if (elapsed_time_us < 0) - { - *errcode = 1; - return i; - } - - int character = getchar_timeout_us(elapsed_time_us); - if (character == PICO_ERROR_TIMEOUT) - { - *errcode = 1; - return i; - } - buf[i] = character; - } - return len; -} diff --git a/pico_uart_transports.h b/pico_uart_transports.h deleted file mode 100755 index 124e02f9..00000000 --- a/pico_uart_transports.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef MICRO_ROS_PICOSDK -#define MICRO_ROS_PICOSDK - -#include -#include - -#include - -bool pico_serial_transport_open(struct uxrCustomTransport * transport); -bool pico_serial_transport_close(struct uxrCustomTransport * transport); -size_t pico_serial_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err); -size_t pico_serial_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err); - -#endif //MICRO_ROS_PICOSDK diff --git a/pico_wifi_transport.c b/pico_wifi_transport.c new file mode 100755 index 00000000..47255ded --- /dev/null +++ b/pico_wifi_transport.c @@ -0,0 +1,108 @@ +#include +#include +#include + +#include "pico/stdlib.h" +#include "pico/cyw43_arch.h" + +#include "lwip/pbuf.h" +#include "lwip/udp.h" + +#include + +struct micro_ros_agent_locator +{ + ip_addr_t address; + int port; +}; + +struct transport_buffer +{ + uint8_t *buf; + bool packet_received; +}; + +void usleep(uint64_t us) +{ + sleep_us(us); +} + +int clock_gettime(clockid_t unused, struct timespec *tp) +{ + uint64_t m = time_us_64(); + tp->tv_sec = m / 1000000; + tp->tv_nsec = (m % 1000000) * 1000; + return 0; +} + +static struct udp_pcb *pcb; + +bool pico_wifi_transport_open(struct uxrCustomTransport *transport) +{ + struct micro_ros_agent_locator *locator = (struct micro_ros_agent_locator *)transport->args; + + pcb = udp_new(); + + err_t bind_error = udp_bind(pcb, IP_ADDR_ANY, locator->port); + + bind_error = udp_connect(pcb, &locator->address, locator->port); + + return bind_error == ERR_OK; +} + +bool pico_wifi_transport_close(struct uxrCustomTransport *transport) +{ + udp_disconnect(pcb); + return true; +} + +size_t pico_wifi_transport_write(struct uxrCustomTransport *transport, const uint8_t *buf, size_t len, uint8_t *errcode) +{ + + struct micro_ros_agent_locator *locator = (struct micro_ros_agent_locator *)transport->args; + + struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM); + + memcpy(p->payload, buf, p->len); + + err_t er = udp_send(pcb, p); + + pbuf_free(p); + + if (er != ERR_OK) + { + printf("Writing error"); + return 0; + } + + return len; +} + +static void udp_recv_callback(void *arg, struct udp_pcb *pcb, + struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + struct transport_buffer *transport_buffer = (struct transport_buffer *)arg; + memcpy(transport_buffer->buf, p->payload, p->len); + pbuf_free(p); + transport_buffer->packet_received = true; +} + +size_t pico_wifi_transport_read(struct uxrCustomTransport *transport, uint8_t *buf, size_t len, int timeout, uint8_t *errcode) +{ + (void)errcode; + + struct transport_buffer transport_buffer = {buf, false}; + + + uint64_t start_time_us = time_us_64(); + int64_t elapsed_time_us = timeout * 1000 - (time_us_64() - start_time_us); + + while (!transport_buffer.packet_received && elapsed_time_us > 0) + { + udp_recv(pcb, udp_recv_callback, &transport_buffer); + sleep_ms(1); + elapsed_time_us = timeout * 1000 - (time_us_64() - start_time_us); + } + + return (elapsed_time_us < 0) ? 0 : len; +} \ No newline at end of file diff --git a/pico_wifi_transport.h b/pico_wifi_transport.h new file mode 100755 index 00000000..e9a754b9 --- /dev/null +++ b/pico_wifi_transport.h @@ -0,0 +1,69 @@ +#ifndef MICRO_ROS_PICOSDK +#define MICRO_ROS_PICOSDK + +#include +#include +#include +#include + +#include "pico/stdlib.h" +#include "pico/cyw43_arch.h" + +#include "lwip/pbuf.h" +#include "lwip/udp.h" + +#include + +bool pico_wifi_transport_open(struct uxrCustomTransport *transport); +bool pico_wifi_transport_close(struct uxrCustomTransport *transport); +size_t pico_wifi_transport_write(struct uxrCustomTransport *transport, const uint8_t *buf, size_t len, uint8_t *err); +size_t pico_wifi_transport_read(struct uxrCustomTransport *transport, uint8_t *buf, size_t len, int timeout, uint8_t *err); + +struct micro_ros_agent_locator +{ + ip_addr_t address; + int port; +}; + +static inline bool set_microros_wifi_transports(char *ssid, char *pass, char *agent_ip, uint agent_port) +{ + + stdio_init_all(); + + if (cyw43_arch_init()) + { + printf("failed to initialise\n"); + return 1; + } + + cyw43_arch_enable_sta_mode(); + + sleep_ms(1000); + + printf("Connecting to Wi-Fi...\n"); + if (cyw43_arch_wifi_connect_timeout_ms(ssid, pass, CYW43_AUTH_WPA2_AES_PSK, 20000)) + { + printf("failed to connect.\n"); + return 1; + } + else + { + printf("Connected.\n"); + } + + static struct micro_ros_agent_locator locator; + ipaddr_aton(agent_ip, &locator.address); + locator.port = agent_port; + + rmw_uros_set_custom_transport( + false, + (void *)&locator, + pico_wifi_transport_open, + pico_wifi_transport_close, + pico_wifi_transport_write, + pico_wifi_transport_read); + + return 0; +} + +#endif // MICRO_ROS_PICOSDK \ No newline at end of file