-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New hardware interface for actuator pico interaction (servos)
- Loading branch information
Showing
25 changed files
with
1,730 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
cmake_minimum_required(VERSION 3.16) | ||
project(actuators_rppico_h_i LANGUAGES CXX) | ||
|
||
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") | ||
add_compile_options(-Wall -Wextra ) | ||
endif() | ||
|
||
# find dependencies | ||
set(THIS_PACKAGE_INCLUDE_DEPENDS | ||
hardware_interface | ||
pluginlib | ||
rclcpp | ||
rclcpp_lifecycle | ||
) | ||
|
||
# find dependencies | ||
find_package(ament_cmake REQUIRED) | ||
foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS}) | ||
find_package(${Dependency} REQUIRED) | ||
endforeach() | ||
|
||
|
||
## COMPILE | ||
add_library( | ||
actuators_rppico_h_i | ||
SHARED | ||
hardware/actuators_rppico_h_i.cpp | ||
) | ||
target_compile_features(actuators_rppico_h_i PUBLIC cxx_std_17) | ||
target_include_directories(actuators_rppico_h_i PUBLIC | ||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/hardware/include> | ||
$<INSTALL_INTERFACE:include/actuators_rppico_h_i> | ||
) | ||
ament_target_dependencies( | ||
actuators_rppico_h_i PUBLIC | ||
${THIS_PACKAGE_INCLUDE_DEPENDS} | ||
) | ||
|
||
target_link_libraries(actuators_rppico_h_i PUBLIC serial) | ||
|
||
# Causes the visibility macros to use dllexport rather than dllimport, | ||
# which is appropriate when building the dll but not consuming it. | ||
target_compile_definitions(${PROJECT_NAME} PRIVATE "DIFFDRIVE_ARDUINO_BUILDING_DLL") | ||
|
||
# Export hardware plugins | ||
pluginlib_export_plugin_description_file(hardware_interface actuators_rppico_h_i.xml) | ||
|
||
# INSTALL | ||
install( | ||
DIRECTORY hardware/include/ | ||
DESTINATION include/actuators_rppico_h_i | ||
) | ||
install( | ||
DIRECTORY description/launch description/ros2_control description/urdf description/rviz | ||
DESTINATION share/actuators_rppico_h_i | ||
) | ||
install( | ||
DIRECTORY bringup/launch bringup/config | ||
DESTINATION share/actuators_rppico_h_i | ||
) | ||
install(TARGETS actuators_rppico_h_i | ||
EXPORT export_actuators_rppico_h_i | ||
ARCHIVE DESTINATION lib | ||
LIBRARY DESTINATION lib | ||
RUNTIME DESTINATION bin | ||
) | ||
|
||
if(BUILD_TESTING) | ||
find_package(ament_cmake_gtest REQUIRED) | ||
endif() | ||
|
||
## EXPORTS | ||
ament_export_targets(export_actuators_rppico_h_i HAS_LIBRARY_TARGET) | ||
ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS}) | ||
ament_package() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# diffdrive_arduino | ||
|
||
This node is designed to provide a ros2_control hardware interface for an Arduino running firmware from `ros_arduino_bridge`. | ||
It is designed to be used with a `diff_drive_controller` from `ros2_control`. | ||
It is expected to communicate via serial and to have two motors, each with velocity control and position/velocity feedback. | ||
|
||
|
||
|
||
|
||
It is based on the diffbot example from [ros2_control demos](https://github.com/ros-controls/ros2_control_demos/tree/master/example_2). | ||
|
||
For a tutorial on how to develop a hardware interface like this, check out the video below: | ||
|
||
https://youtu.be/J02jEKawE5U | ||
|
||
|
||
|
||
## To Do | ||
|
||
- [ ] Document changes from earlier versions | ||
- [ ] Document usage and parameters | ||
- [ ] Clean up remaining connections to original demo code | ||
- [ ] Add license etc (in the meantime, do whatever you want with it) |
10 changes: 10 additions & 0 deletions
10
actuators_rppico_hardware_interface/actuators_rppico_h_i.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<library path="actuators_rppico_h_i"> | ||
<class name="actuators_rppico_h_i/ActuatorsRpPicoHardware" | ||
type="actuators_rppico_h_i::ActuatorsRpPicoHardware" | ||
base_class_type="hardware_interface::SystemInterface"> | ||
<description> | ||
Hardware interface to commuicate with the raspberry pico that control the actuators (mainly servos) | ||
</description> | ||
|
||
</class> | ||
</library> |
57 changes: 57 additions & 0 deletions
57
actuators_rppico_hardware_interface/bringup/config/diffbot_controllers.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
controller_manager: | ||
ros__parameters: | ||
update_rate: 10 # Hz | ||
|
||
joint_state_broadcaster: | ||
type: joint_state_broadcaster/JointStateBroadcaster | ||
|
||
diffbot_base_controller: | ||
type: diff_drive_controller/DiffDriveController | ||
|
||
diffbot_base_controller: | ||
ros__parameters: | ||
left_wheel_names: ["left_wheel_joint"] | ||
right_wheel_names: ["right_wheel_joint"] | ||
|
||
wheel_separation: 0.10 | ||
#wheels_per_side: 1 # actually 2, but both are controlled by 1 signal | ||
wheel_radius: 0.015 | ||
|
||
wheel_separation_multiplier: 1.0 | ||
left_wheel_radius_multiplier: 1.0 | ||
right_wheel_radius_multiplier: 1.0 | ||
|
||
publish_rate: 50.0 | ||
odom_frame_id: odom | ||
base_frame_id: base_link | ||
pose_covariance_diagonal : [0.001, 0.001, 0.001, 0.001, 0.001, 0.01] | ||
twist_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.01] | ||
|
||
open_loop: true | ||
enable_odom_tf: true | ||
|
||
cmd_vel_timeout: 0.5 | ||
#publish_limited_velocity: true | ||
use_stamped_vel: false | ||
#velocity_rolling_window_size: 10 | ||
|
||
# Velocity and acceleration limits | ||
# Whenever a min_* is unspecified, default to -max_* | ||
linear.x.has_velocity_limits: true | ||
linear.x.has_acceleration_limits: true | ||
linear.x.has_jerk_limits: false | ||
linear.x.max_velocity: 1.0 | ||
linear.x.min_velocity: -1.0 | ||
linear.x.max_acceleration: 1.0 | ||
linear.x.max_jerk: 0.0 | ||
linear.x.min_jerk: 0.0 | ||
|
||
angular.z.has_velocity_limits: true | ||
angular.z.has_acceleration_limits: true | ||
angular.z.has_jerk_limits: false | ||
angular.z.max_velocity: 1.0 | ||
angular.z.min_velocity: -1.0 | ||
angular.z.max_acceleration: 1.0 | ||
angular.z.min_acceleration: -1.0 | ||
angular.z.max_jerk: 0.0 | ||
angular.z.min_jerk: 0.0 |
107 changes: 107 additions & 0 deletions
107
actuators_rppico_hardware_interface/bringup/launch/diffbot.launch.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
# Copyright 2020 ros2_control Development Team | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
from launch import LaunchDescription | ||
from launch.actions import RegisterEventHandler | ||
from launch.event_handlers import OnProcessExit | ||
from launch.substitutions import Command, FindExecutable, PathJoinSubstitution | ||
|
||
from launch_ros.actions import Node | ||
from launch_ros.substitutions import FindPackageShare | ||
|
||
|
||
def generate_launch_description(): | ||
# Get URDF via xacro | ||
robot_description_content = Command( | ||
[ | ||
PathJoinSubstitution([FindExecutable(name="xacro")]), | ||
" ", | ||
PathJoinSubstitution( | ||
[FindPackageShare("diffdrive_arduino"), "urdf", "diffbot.urdf.xacro"] | ||
), | ||
] | ||
) | ||
robot_description = {"robot_description": robot_description_content} | ||
|
||
robot_controllers = PathJoinSubstitution( | ||
[ | ||
FindPackageShare("diffdrive_arduino"), | ||
"config", | ||
"diffbot_controllers.yaml", | ||
] | ||
) | ||
rviz_config_file = PathJoinSubstitution( | ||
[FindPackageShare("diffdrive_arduino"), "rviz", "diffbot.rviz"] | ||
) | ||
|
||
control_node = Node( | ||
package="controller_manager", | ||
executable="ros2_control_node", | ||
parameters=[robot_description, robot_controllers], | ||
output="both", | ||
) | ||
robot_state_pub_node = Node( | ||
package="robot_state_publisher", | ||
executable="robot_state_publisher", | ||
output="both", | ||
parameters=[robot_description], | ||
remappings=[ | ||
("/diff_drive_controller/cmd_vel_unstamped", "/cmd_vel"), | ||
], | ||
) | ||
rviz_node = Node( | ||
package="rviz2", | ||
executable="rviz2", | ||
name="rviz2", | ||
output="log", | ||
arguments=["-d", rviz_config_file], | ||
) | ||
|
||
joint_state_broadcaster_spawner = Node( | ||
package="controller_manager", | ||
executable="spawner", | ||
arguments=["joint_state_broadcaster", "--controller-manager", "/controller_manager"], | ||
) | ||
|
||
robot_controller_spawner = Node( | ||
package="controller_manager", | ||
executable="spawner", | ||
arguments=["diffbot_base_controller", "--controller-manager", "/controller_manager"], | ||
) | ||
|
||
# Delay rviz start after `joint_state_broadcaster` | ||
delay_rviz_after_joint_state_broadcaster_spawner = RegisterEventHandler( | ||
event_handler=OnProcessExit( | ||
target_action=joint_state_broadcaster_spawner, | ||
on_exit=[rviz_node], | ||
) | ||
) | ||
|
||
# Delay start of robot_controller after `joint_state_broadcaster` | ||
delay_robot_controller_spawner_after_joint_state_broadcaster_spawner = RegisterEventHandler( | ||
event_handler=OnProcessExit( | ||
target_action=joint_state_broadcaster_spawner, | ||
on_exit=[robot_controller_spawner], | ||
) | ||
) | ||
|
||
nodes = [ | ||
control_node, | ||
robot_state_pub_node, | ||
joint_state_broadcaster_spawner, | ||
delay_rviz_after_joint_state_broadcaster_spawner, | ||
delay_robot_controller_spawner_after_joint_state_broadcaster_spawner, | ||
] | ||
|
||
return LaunchDescription(nodes) |
99 changes: 99 additions & 0 deletions
99
actuators_rppico_hardware_interface/description/launch/view_robot.launch.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
# Copyright 2021 Stogl Robotics Consulting UG (haftungsbeschränkt) | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
from launch import LaunchDescription | ||
from launch.actions import DeclareLaunchArgument | ||
from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution | ||
|
||
from launch_ros.actions import Node | ||
from launch_ros.substitutions import FindPackageShare | ||
|
||
|
||
def generate_launch_description(): | ||
# Declare arguments | ||
declared_arguments = [] | ||
declared_arguments.append( | ||
DeclareLaunchArgument( | ||
"description_package", | ||
default_value="diffdrive_arduino", | ||
description="Description package with robot URDF/xacro files. Usually the argument \ | ||
is not set, it enables use of a custom description.", | ||
) | ||
) | ||
declared_arguments.append( | ||
DeclareLaunchArgument( | ||
"description_file", | ||
default_value="diffbot.urdf.xacro", | ||
description="URDF/XACRO description file with the robot.", | ||
) | ||
) | ||
declared_arguments.append( | ||
DeclareLaunchArgument( | ||
"prefix", | ||
default_value='""', | ||
description="Prefix of the joint names, useful for \ | ||
multi-robot setup. If changed than also joint names in the controllers' configuration \ | ||
have to be updated.", | ||
) | ||
) | ||
|
||
# Initialize Arguments | ||
description_package = LaunchConfiguration("description_package") | ||
description_file = LaunchConfiguration("description_file") | ||
prefix = LaunchConfiguration("prefix") | ||
|
||
# Get URDF via xacro | ||
robot_description_content = Command( | ||
[ | ||
PathJoinSubstitution([FindExecutable(name="xacro")]), | ||
" ", | ||
PathJoinSubstitution( | ||
[FindPackageShare(description_package), "urdf", description_file] | ||
), | ||
" ", | ||
"prefix:=", | ||
prefix, | ||
] | ||
) | ||
robot_description = {"robot_description": robot_description_content} | ||
|
||
rviz_config_file = PathJoinSubstitution( | ||
[FindPackageShare(description_package), "rviz", "diffbot_view.rviz"] | ||
) | ||
|
||
joint_state_publisher_node = Node( | ||
package="joint_state_publisher_gui", | ||
executable="joint_state_publisher_gui", | ||
) | ||
robot_state_publisher_node = Node( | ||
package="robot_state_publisher", | ||
executable="robot_state_publisher", | ||
output="both", | ||
parameters=[robot_description], | ||
) | ||
rviz_node = Node( | ||
package="rviz2", | ||
executable="rviz2", | ||
name="rviz2", | ||
output="log", | ||
arguments=["-d", rviz_config_file], | ||
) | ||
|
||
nodes = [ | ||
joint_state_publisher_node, | ||
robot_state_publisher_node, | ||
rviz_node, | ||
] | ||
|
||
return LaunchDescription(declared_arguments + nodes) |
Oops, something went wrong.