Added the ability to switch between cmd_vel control and induvidual motor control
This commit is contained in:
@@ -17,8 +17,6 @@ fi
|
|||||||
|
|
||||||
source install/setup.bash
|
source install/setup.bash
|
||||||
|
|
||||||
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
|
|
||||||
|
|
||||||
case $TARGET in
|
case $TARGET in
|
||||||
"forward")
|
"forward")
|
||||||
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped "
|
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped "
|
||||||
@@ -75,8 +73,19 @@ case $TARGET in
|
|||||||
"zero")
|
"zero")
|
||||||
ros2 service call /zero std_srvs/srv/Empty
|
ros2 service call /zero std_srvs/srv/Empty
|
||||||
;;
|
;;
|
||||||
|
"vel")
|
||||||
|
ros2 topic pub --rate 10 /velocity_controller/commands std_msgs/msg/Float64MultiArray "
|
||||||
|
data: [$2, $3]"
|
||||||
|
;;
|
||||||
|
"switch")
|
||||||
|
controllers=$(ros2 control list_controllers | grep -E "velocity|diffdrive")
|
||||||
|
to_deactivate=$(echo "$controllers" | awk '$3 == "active" { print $1 }')
|
||||||
|
to_activate=$(echo "$controllers" | awk '$3 == "inactive" { print $1 }')
|
||||||
|
ros2 control switch_controllers --deactivate $to_deactivate --activate $to_activate --best-effort
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Target not defined"
|
echo "Target not defined"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
exit 0
|
||||||
|
|||||||
@@ -35,18 +35,11 @@ def generate_launch_description():
|
|||||||
description="Whether to use mock controller"
|
description="Whether to use mock controller"
|
||||||
)
|
)
|
||||||
|
|
||||||
# odom_broadcast = Node(
|
|
||||||
# package='tf2_ros',
|
|
||||||
# executable='static_transform_publisher',
|
|
||||||
# name='map_to_odom_broadcaster',
|
|
||||||
# arguments=['0', '0', '0', '0', '0', '0', 'map', 'odom'],
|
|
||||||
# condition=IfCondition(LaunchConfiguration('visualize'))
|
|
||||||
# )
|
|
||||||
|
|
||||||
odom_broadcast = Node(
|
odom_broadcast = Node(
|
||||||
package='toid_odometry',
|
package='toid_odometry',
|
||||||
executable='toid_odometry',
|
executable='toid_odometry',
|
||||||
name='map_to_odom_broadcaster',
|
name='map_to_odom_broadcaster',
|
||||||
|
emulate_tty=True,
|
||||||
parameters=[{'mock_odom': use_mock}],
|
parameters=[{'mock_odom': use_mock}],
|
||||||
condition=IfCondition(LaunchConfiguration('visualize'))
|
condition=IfCondition(LaunchConfiguration('visualize'))
|
||||||
)
|
)
|
||||||
@@ -57,6 +50,7 @@ def generate_launch_description():
|
|||||||
executable='robot_state_publisher',
|
executable='robot_state_publisher',
|
||||||
name='robot_state_publisher',
|
name='robot_state_publisher',
|
||||||
output='screen',
|
output='screen',
|
||||||
|
emulate_tty=True,
|
||||||
parameters=[{'robot_description': Command(['xacro ', default_model_path, ' use_mock:=', use_mock])}]
|
parameters=[{'robot_description': Command(['xacro ', default_model_path, ' use_mock:=', use_mock])}]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -64,20 +58,42 @@ def generate_launch_description():
|
|||||||
package='controller_manager',
|
package='controller_manager',
|
||||||
executable='ros2_control_node',
|
executable='ros2_control_node',
|
||||||
output='screen',
|
output='screen',
|
||||||
parameters=[params]
|
emulate_tty=True,
|
||||||
|
parameters=[params],
|
||||||
|
arguments=['--ros-args', '--log-level', 'warn']
|
||||||
)
|
)
|
||||||
|
|
||||||
joint_state_broadcaster = Node(
|
joint_state_broadcaster = Node(
|
||||||
package='controller_manager',
|
package='controller_manager',
|
||||||
executable='spawner',
|
executable='spawner',
|
||||||
output='screen',
|
output='screen',
|
||||||
arguments=["joint_state_broadcaster"]
|
emulate_tty=True,
|
||||||
|
arguments=[
|
||||||
|
"joint_state_broadcaster",
|
||||||
|
'--ros-args', '--log-level', 'warn'
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
velocity_controller = Node(
|
||||||
|
package='controller_manager',
|
||||||
|
executable='spawner',
|
||||||
|
output='screen',
|
||||||
|
emulate_tty=True,
|
||||||
|
arguments=[
|
||||||
|
"velocity_controller",
|
||||||
|
"--inactive",
|
||||||
|
"-p",
|
||||||
|
params,
|
||||||
|
'--ros-args', '--log-level', 'warn'
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
diffbot_base_controller = Node(
|
diffbot_base_controller = Node(
|
||||||
package='controller_manager',
|
package='controller_manager',
|
||||||
executable='spawner',
|
executable='spawner',
|
||||||
output='both',
|
output='both',
|
||||||
|
emulate_tty=True,
|
||||||
arguments=[
|
arguments=[
|
||||||
"diffdrive_controller",
|
"diffdrive_controller",
|
||||||
"-p",
|
"-p",
|
||||||
@@ -96,6 +112,7 @@ def generate_launch_description():
|
|||||||
"--param enable_odom_tf:=true",
|
"--param enable_odom_tf:=true",
|
||||||
"--param enable_odom_tf:=false"
|
"--param enable_odom_tf:=false"
|
||||||
),
|
),
|
||||||
|
'--ros-args', '--log-level', 'warn'
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -104,7 +121,10 @@ def generate_launch_description():
|
|||||||
executable='rviz2',
|
executable='rviz2',
|
||||||
name='rviz2',
|
name='rviz2',
|
||||||
output='screen',
|
output='screen',
|
||||||
arguments=['-d', default_rviz_config_path],
|
emulate_tty=True,
|
||||||
|
arguments=['-d', default_rviz_config_path,
|
||||||
|
'--ros-args', '--log-level', 'warn'
|
||||||
|
],
|
||||||
condition=IfCondition(visualize)
|
condition=IfCondition(visualize)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -116,5 +136,6 @@ def generate_launch_description():
|
|||||||
controller_manager,
|
controller_manager,
|
||||||
joint_state_broadcaster,
|
joint_state_broadcaster,
|
||||||
diffbot_base_controller,
|
diffbot_base_controller,
|
||||||
|
velocity_controller,
|
||||||
rviz_node
|
rviz_node
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
<depend>controller_manager</depend>
|
<depend>controller_manager</depend>
|
||||||
<depend>diff_drive_controller</depend>
|
<depend>diff_drive_controller</depend>
|
||||||
|
<depend>forward_command_controller</depend>
|
||||||
<depend>robot_state_publisher</depend>
|
<depend>robot_state_publisher</depend>
|
||||||
<depend>joint_state_broadcaster</depend>
|
<depend>joint_state_broadcaster</depend>
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,15 @@ controller_manager:
|
|||||||
type: diff_drive_controller/DiffDriveController
|
type: diff_drive_controller/DiffDriveController
|
||||||
joint_state_broadcaster:
|
joint_state_broadcaster:
|
||||||
type: joint_state_broadcaster/JointStateBroadcaster
|
type: joint_state_broadcaster/JointStateBroadcaster
|
||||||
|
velocity_controller:
|
||||||
|
type: forward_command_controller/ForwardCommandController
|
||||||
|
|
||||||
|
velocity_controller:
|
||||||
|
ros__parameters:
|
||||||
|
joints:
|
||||||
|
- drivewhl_l_joint
|
||||||
|
- drivewhl_r_joint
|
||||||
|
interface_name: velocity
|
||||||
|
|
||||||
diffdrive_controller:
|
diffdrive_controller:
|
||||||
ros__parameters:
|
ros__parameters:
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ find_package(ament_cmake REQUIRED)
|
|||||||
set(PACKAGE_DEPS
|
set(PACKAGE_DEPS
|
||||||
rclcpp
|
rclcpp
|
||||||
Boost
|
Boost
|
||||||
|
nav_msgs
|
||||||
std_srvs
|
std_srvs
|
||||||
tf2
|
tf2
|
||||||
tf2_ros
|
tf2_ros
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
<depend>rclcpp</depend>
|
<depend>rclcpp</depend>
|
||||||
<depend>boost</depend>
|
<depend>boost</depend>
|
||||||
|
<depend>nav_msgs</depend>
|
||||||
<depend>std_srvs</depend>
|
<depend>std_srvs</depend>
|
||||||
<depend>tf2</depend>
|
<depend>tf2</depend>
|
||||||
<depend>tf2_ros</depend>
|
<depend>tf2_ros</depend>
|
||||||
|
|||||||
@@ -23,9 +23,20 @@
|
|||||||
#include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
|
#include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
|
||||||
#include "tf2/convert.hpp"
|
#include "tf2/convert.hpp"
|
||||||
|
|
||||||
|
#include "nav_msgs/msg/odometry.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace asio = boost::asio;
|
namespace asio = boost::asio;
|
||||||
|
|
||||||
|
const std::array<double, 36> COVARIENCE_MATRIX{
|
||||||
|
0.0001, .0, 0, 0, 0, 0,
|
||||||
|
0, 0.0001, 0, 0, 0, 0,
|
||||||
|
0, .0, 0.0001, 0, 0, 0,
|
||||||
|
0, .0, 0, 0.0001, 0, 0,
|
||||||
|
0, .0, 0, 0, 0.0001, 0,
|
||||||
|
0, .0, 0, 0, 0, 0.0001,
|
||||||
|
};
|
||||||
|
|
||||||
class ToidOdomNode : public rclcpp::Node {
|
class ToidOdomNode : public rclcpp::Node {
|
||||||
using SendDoubleSrv = toid_msgs::srv::SendDouble;
|
using SendDoubleSrv = toid_msgs::srv::SendDouble;
|
||||||
using ZeroSrv = std_srvs::srv::Empty;
|
using ZeroSrv = std_srvs::srv::Empty;
|
||||||
@@ -78,6 +89,9 @@ public:
|
|||||||
|
|
||||||
zero_service_ = create_service<ZeroSrv> (
|
zero_service_ = create_service<ZeroSrv> (
|
||||||
"/zero", std::bind(&ToidOdomNode::zero, this, _1));
|
"/zero", std::bind(&ToidOdomNode::zero, this, _1));
|
||||||
|
|
||||||
|
odometry_publisher_ = this->create_publisher<nav_msgs::msg::Odometry>(
|
||||||
|
"/odom", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -179,13 +193,30 @@ private:
|
|||||||
|
|
||||||
void send_transform(tRespState &state) {
|
void send_transform(tRespState &state) {
|
||||||
geometry_msgs::msg::TransformStamped t;
|
geometry_msgs::msg::TransformStamped t;
|
||||||
|
nav_msgs::msg::Odometry o;
|
||||||
|
|
||||||
t.header.stamp = this->get_clock()->now();
|
t.header.stamp = this->get_clock()->now();
|
||||||
t.header.frame_id = this->odometry_frame_id_;
|
t.header.frame_id = this->odometry_frame_id_;
|
||||||
t.child_frame_id = this->base_frame_id_;
|
t.child_frame_id = this->base_frame_id_;
|
||||||
|
|
||||||
|
o.header = t.header;
|
||||||
|
o.child_frame_id = t.child_frame_id;
|
||||||
|
|
||||||
t.transform = make_transform(state.x, state.y, state.theta);
|
t.transform = make_transform(state.x, state.y, state.theta);
|
||||||
|
|
||||||
|
const auto& [x,y,z] = t.transform.translation;
|
||||||
|
o.pose.pose.position.x = x;
|
||||||
|
o.pose.pose.position.x = y;
|
||||||
|
o.pose.pose.position.x = z;
|
||||||
|
o.pose.pose.orientation = t.transform.rotation;
|
||||||
|
o.pose.covariance = COVARIENCE_MATRIX;
|
||||||
|
|
||||||
|
o.twist.twist.linear.x = state.vl;
|
||||||
|
o.twist.twist.angular.z = state.vr;
|
||||||
|
o.twist.covariance = COVARIENCE_MATRIX;
|
||||||
|
|
||||||
|
odometry_publisher_->publish(o);
|
||||||
|
|
||||||
tf_broadcaster_->sendTransform(t);
|
tf_broadcaster_->sendTransform(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,6 +268,7 @@ private:
|
|||||||
rclcpp::Service<ZeroSrv>::SharedPtr zero_service_;
|
rclcpp::Service<ZeroSrv>::SharedPtr zero_service_;
|
||||||
|
|
||||||
rclcpp::Subscription<geometry_msgs::msg::PoseWithCovarianceStamped>::SharedPtr startpose_listener_;
|
rclcpp::Subscription<geometry_msgs::msg::PoseWithCovarianceStamped>::SharedPtr startpose_listener_;
|
||||||
|
rclcpp::Publisher<nav_msgs::msg::Odometry>::SharedPtr odometry_publisher_;
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(const int argc,const char** argv) {
|
int main(const int argc,const char** argv) {
|
||||||
|
|||||||
Reference in New Issue
Block a user