@@ -20,26 +20,30 @@ namespace westonrobot {
20
20
// } // namespace
21
21
22
22
// /////////////////////////////////////////////////////////////////////////////////
23
- RangerROSMessenger::RangerROSMessenger (rclcpp::Node::SharedPtr& node){
24
-
23
+ RangerROSMessenger::RangerROSMessenger (rclcpp::Node::SharedPtr& node) {
25
24
node_ = node;
26
25
LoadParameters ();
27
26
28
27
// connect to robot and setup ROS subscription
29
28
if (robot_type_ == RangerSubType::kRangerMiniV1 ) {
30
- robot_ = std::make_shared<RangerRobot>(true );
29
+ robot_ = std::make_shared<RangerRobot>(RangerRobot::Variant::kRangerMiniV1 );
30
+ } else if (robot_type_ == RangerSubType::kRangerMiniV2 ) {
31
+ robot_ = std::make_shared<RangerRobot>(RangerRobot::Variant::kRangerMiniV2 );
32
+ } else if (robot_type_ == RangerSubType::kRangerMiniV3 ) {
33
+ robot_ = std::make_shared<RangerRobot>(RangerRobot::Variant::kRangerMiniV3 );
31
34
} else {
32
- robot_ = std::make_shared<RangerRobot>(false );
35
+ robot_ = std::make_shared<RangerRobot>(RangerRobot::Variant:: kRanger );
33
36
}
34
37
35
38
if (port_name_.find (" can" ) != std::string::npos) {
36
39
if (!robot_->Connect (port_name_)) {
37
- RCLCPP_ERROR (node_->get_logger ()," Failed to connect to the CAN port" );
40
+ RCLCPP_ERROR (node_->get_logger (), " Failed to connect to the CAN port" );
38
41
return ;
39
42
}
40
43
robot_->EnableCommandedMode ();
41
44
} else {
42
- RCLCPP_ERROR (node_->get_logger ()," Invalid port name: %s" , port_name_.c_str ());
45
+ RCLCPP_ERROR (node_->get_logger (), " Invalid port name: %s" ,
46
+ port_name_.c_str ());
43
47
return ;
44
48
}
45
49
@@ -56,16 +60,19 @@ void RangerROSMessenger::Run() {
56
60
}
57
61
58
62
void RangerROSMessenger::LoadParameters () {
59
- // load parameter from launch files
60
- port_name_ = node_->declare_parameter <std::string>(" port_name" ," can0" );
61
- robot_model_ = node_->declare_parameter <std::string>(" robot_model" ," ranger" );
62
- odom_frame_ = node_->declare_parameter <std::string>(" odom_frame" ," odom" );
63
- base_frame_ = node_->declare_parameter <std::string>(" base_frame" , " base_link" );
63
+ // load parameter from launch files
64
+ port_name_ = node_->declare_parameter <std::string>(" port_name" , " can0" );
65
+ robot_model_ = node_->declare_parameter <std::string>(" robot_model" , " ranger" );
66
+ odom_frame_ = node_->declare_parameter <std::string>(" odom_frame" , " odom" );
67
+ base_frame_ =
68
+ node_->declare_parameter <std::string>(" base_frame" , " base_link" );
64
69
update_rate_ = node_->declare_parameter <int >(" update_rate" , 50 );
65
- odom_topic_name_ = node_->declare_parameter <std::string>(" odom_topic_name" , " odom" );
66
- publish_odom_tf_ = node_->declare_parameter <bool >(" publish_odom_tf" ,false );
70
+ odom_topic_name_ =
71
+ node_->declare_parameter <std::string>(" odom_topic_name" , " odom" );
72
+ publish_odom_tf_ = node_->declare_parameter <bool >(" publish_odom_tf" , false );
67
73
68
- RCLCPP_INFO (node_->get_logger (),
74
+ RCLCPP_INFO (
75
+ node_->get_logger (),
69
76
" Successfully loaded the following parameters: \n port_name: %s\n "
70
77
" robot_model: %s\n odom_frame: %s\n base_frame: %s\n "
71
78
" update_rate: %d\n odom_topic_name: %s\n "
@@ -89,59 +96,78 @@ void RangerROSMessenger::LoadParameters() {
89
96
RangerMiniV1Params::max_steer_angle_parallel;
90
97
robot_params_.max_round_angle = RangerMiniV1Params::max_round_angle;
91
98
robot_params_.min_turn_radius = RangerMiniV1Params::min_turn_radius;
99
+ } else if (robot_model_ == " ranger_mini_v2" ) {
100
+ robot_type_ = RangerSubType::kRangerMiniV2 ;
101
+
102
+ robot_params_.track = RangerMiniV2Params::track;
103
+ robot_params_.wheelbase = RangerMiniV2Params::wheelbase;
104
+ robot_params_.max_linear_speed = RangerMiniV2Params::max_linear_speed;
105
+ robot_params_.max_angular_speed = RangerMiniV2Params::max_angular_speed;
106
+ robot_params_.max_speed_cmd = RangerMiniV2Params::max_speed_cmd;
107
+ robot_params_.max_steer_angle_central =
108
+ RangerMiniV2Params::max_steer_angle_central;
109
+ robot_params_.max_steer_angle_parallel =
110
+ RangerMiniV2Params::max_steer_angle_parallel;
111
+ robot_params_.max_round_angle = RangerMiniV2Params::max_round_angle;
112
+ robot_params_.min_turn_radius = RangerMiniV2Params::min_turn_radius;
113
+ } else if (robot_model_ == " ranger_mini_v3" ) {
114
+ robot_type_ = RangerSubType::kRangerMiniV3 ;
115
+
116
+ robot_params_.track = RangerMiniV2Params::track;
117
+ robot_params_.wheelbase = RangerMiniV2Params::wheelbase;
118
+ robot_params_.max_linear_speed = RangerMiniV2Params::max_linear_speed;
119
+ robot_params_.max_angular_speed = RangerMiniV2Params::max_angular_speed;
120
+ robot_params_.max_speed_cmd = RangerMiniV2Params::max_speed_cmd;
121
+ robot_params_.max_steer_angle_central =
122
+ RangerMiniV2Params::max_steer_angle_central;
123
+ robot_params_.max_steer_angle_parallel =
124
+ RangerMiniV2Params::max_steer_angle_parallel;
125
+ robot_params_.max_round_angle = RangerMiniV2Params::max_round_angle;
126
+ robot_params_.min_turn_radius = RangerMiniV2Params::min_turn_radius;
92
127
} else {
93
- if (robot_model_ == " ranger_mini_v2" ) {
94
- robot_type_ = RangerSubType::kRangerMiniV2 ;
95
-
96
- robot_params_.track = RangerMiniV2Params::track;
97
- robot_params_.wheelbase = RangerMiniV2Params::wheelbase;
98
- robot_params_.max_linear_speed = RangerMiniV2Params::max_linear_speed;
99
- robot_params_.max_angular_speed = RangerMiniV2Params::max_angular_speed;
100
- robot_params_.max_speed_cmd = RangerMiniV2Params::max_speed_cmd;
101
- robot_params_.max_steer_angle_central =
102
- RangerMiniV2Params::max_steer_angle_central;
103
- robot_params_.max_steer_angle_parallel =
104
- RangerMiniV2Params::max_steer_angle_parallel;
105
- robot_params_.max_round_angle = RangerMiniV2Params::max_round_angle;
106
- robot_params_.min_turn_radius = RangerMiniV2Params::min_turn_radius;
107
- } else {
108
- robot_type_ = RangerSubType::kRanger ;
109
-
110
- robot_params_.track = RangerParams::track;
111
- robot_params_.wheelbase = RangerParams::wheelbase;
112
- robot_params_.max_linear_speed = RangerParams::max_linear_speed;
113
- robot_params_.max_angular_speed = RangerParams::max_angular_speed;
114
- robot_params_.max_speed_cmd = RangerParams::max_speed_cmd;
115
- robot_params_.max_steer_angle_central =
116
- RangerParams::max_steer_angle_central;
117
- robot_params_.max_steer_angle_parallel =
118
- RangerParams::max_steer_angle_parallel;
119
- robot_params_.max_round_angle = RangerParams::max_round_angle;
120
- robot_params_.min_turn_radius = RangerParams::min_turn_radius;
121
- }
128
+ robot_type_ = RangerSubType::kRanger ;
129
+
130
+ robot_params_.track = RangerParams::track;
131
+ robot_params_.wheelbase = RangerParams::wheelbase;
132
+ robot_params_.max_linear_speed = RangerParams::max_linear_speed;
133
+ robot_params_.max_angular_speed = RangerParams::max_angular_speed;
134
+ robot_params_.max_speed_cmd = RangerParams::max_speed_cmd;
135
+ robot_params_.max_steer_angle_central =
136
+ RangerParams::max_steer_angle_central;
137
+ robot_params_.max_steer_angle_parallel =
138
+ RangerParams::max_steer_angle_parallel;
139
+ robot_params_.max_round_angle = RangerParams::max_round_angle;
140
+ robot_params_.min_turn_radius = RangerParams::min_turn_radius;
122
141
}
123
142
parking_mode_ = false ;
124
143
}
125
144
126
145
void RangerROSMessenger::SetupSubscription () {
127
146
// publisher
128
- system_state_pub_ =
129
- node_-> create_publisher <ranger_msgs::msg::SystemState>( " /system_state" , 10 );
130
- motion_state_pub_ =
131
- node_-> create_publisher <ranger_msgs::msg::MotionState>( " /motion_state" , 10 );
147
+ system_state_pub_ = node_-> create_publisher <ranger_msgs::msg::SystemState>(
148
+ " /system_state" , 10 );
149
+ motion_state_pub_ = node_-> create_publisher <ranger_msgs::msg::MotionState>(
150
+ " /motion_state" , 10 );
132
151
actuator_state_pub_ =
133
- node_->create_publisher <ranger_msgs::msg::ActuatorStateArray>(" /actuator_state" , 10 );
134
- odom_pub_ = node_->create_publisher <nav_msgs::msg::Odometry>(odom_topic_name_, 10 );
135
- battery_state_pub_ =
136
- node_->create_publisher <sensor_msgs::msg::BatteryState>(" /battery_state" , 10 );
152
+ node_->create_publisher <ranger_msgs::msg::ActuatorStateArray>(
153
+ " /actuator_state" , 10 );
154
+ odom_pub_ =
155
+ node_->create_publisher <nav_msgs::msg::Odometry>(odom_topic_name_, 10 );
156
+ battery_state_pub_ = node_->create_publisher <sensor_msgs::msg::BatteryState>(
157
+ " /battery_state" , 10 );
137
158
138
159
// subscriber
139
160
motion_cmd_sub_ = node_->create_subscription <geometry_msgs::msg::Twist>(
140
- " /cmd_vel" , 5 , std::bind (&RangerROSMessenger::TwistCmdCallback, this , std::placeholders::_1));
161
+ " /cmd_vel" , 5 ,
162
+ std::bind (&RangerROSMessenger::TwistCmdCallback, this ,
163
+ std::placeholders::_1));
141
164
142
165
// service server
143
- trigger_parking_server = node_->create_service <ranger_msgs::srv::TriggerParkMode>
144
- (" ranger_base_node/parking_service" , std::bind (&RangerROSMessenger::TriggerParkingService, this , std::placeholders::_1, std::placeholders::_2));
166
+ trigger_parking_server =
167
+ node_->create_service <ranger_msgs::srv::TriggerParkMode>(
168
+ " ranger_base_node/parking_service" ,
169
+ std::bind (&RangerROSMessenger::TriggerParkingService, this ,
170
+ std::placeholders::_1, std::placeholders::_2));
145
171
146
172
tf_broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(node_);
147
173
}
@@ -194,12 +220,14 @@ void RangerROSMessenger::PublishStateToROS() {
194
220
195
221
// publish actuator state
196
222
{
197
- // RCLCPP_DEBUG(node_->get_logger(),"feedback", "Angle_5:%f Angle_6:%f Angle_7:%f Angle_8:%f",
223
+ // RCLCPP_DEBUG(node_->get_logger(),"feedback", "Angle_5:%f Angle_6:%f
224
+ // Angle_7:%f Angle_8:%f",
198
225
// actuator_state.motor_angles.angle_5,
199
226
// actuator_state.motor_angles.angle_6,
200
227
// actuator_state.motor_angles.angle_7,
201
228
// actuator_state.motor_angles.angle_8);
202
- // RCLCPP_DEBUG(node_->get_logger(),"feedback", "speed_1:%f speed_2:%f speed_3:%f speed_4:%f",
229
+ // RCLCPP_DEBUG(node_->get_logger(),"feedback", "speed_1:%f speed_2:%f
230
+ // speed_3:%f speed_4:%f",
203
231
// actuator_state.motor_speeds.speed_1,
204
232
// actuator_state.motor_speeds.speed_2,
205
233
// actuator_state.motor_speeds.speed_3,
@@ -274,7 +302,7 @@ void RangerROSMessenger::UpdateOdometry(double linear, double angular,
274
302
boost::numeric::odeint::integrate_const (
275
303
boost::numeric::odeint::runge_kutta4<DualAckermanModel::state_type>(),
276
304
DualAckermanModel (robot_params_.wheelbase , u), x, 0.0 , dt, (dt / 10.0 ));
277
- // std::cout<<" steer: "<<angle<<" central: "<<u.phi<<std::endl;
305
+ // std::cout<<" steer: "<<angle<<" central: "<<u.phi<<std::endl;
278
306
position_x_ = x[0 ];
279
307
position_y_ = x[1 ];
280
308
theta_ = x[2 ];
@@ -364,16 +392,16 @@ void RangerROSMessenger::UpdateOdometry(double linear, double angular,
364
392
}
365
393
}
366
394
367
- void RangerROSMessenger::TwistCmdCallback (geometry_msgs::msg::Twist::SharedPtr msg) {
395
+ void RangerROSMessenger::TwistCmdCallback (
396
+ geometry_msgs::msg::Twist::SharedPtr msg) {
368
397
double steer_cmd;
369
398
double radius;
370
399
371
400
// analyze Twist msg and switch motion_mode
372
401
// check for parking mode, only applicable to RangerMiniV2
373
402
if (parking_mode_ && robot_type_ == RangerSubType::kRangerMiniV2 ) {
374
403
return ;
375
- }
376
- else if (msg->linear .y != 0 ) {
404
+ } else if (msg->linear .y != 0 ) {
377
405
if (msg->linear .x == 0.0 && robot_type_ == RangerSubType::kRangerMiniV1 ) {
378
406
motion_mode_ = MotionState::MOTION_MODE_SIDE_SLIP;
379
407
robot_->SetMotionMode (MotionState::MOTION_MODE_SIDE_SLIP);
@@ -445,10 +473,11 @@ void RangerROSMessenger::TwistCmdCallback(geometry_msgs::msg::Twist::SharedPtr m
445
473
}
446
474
}
447
475
448
- geometry_msgs::msg::Quaternion RangerROSMessenger::createQuaternionMsgFromYaw (double yaw) {
449
- tf2::Quaternion q;
450
- q.setRPY (0 , 0 , yaw);
451
- return tf2::toMsg (q);
476
+ geometry_msgs::msg::Quaternion RangerROSMessenger::createQuaternionMsgFromYaw (
477
+ double yaw) {
478
+ tf2::Quaternion q;
479
+ q.setRPY (0 , 0 , yaw);
480
+ return tf2::toMsg (q);
452
481
}
453
482
454
483
double RangerROSMessenger::CalculateSteeringAngle (geometry_msgs::msg::Twist msg,
@@ -464,7 +493,7 @@ double RangerROSMessenger::CalculateSteeringAngle(geometry_msgs::msg::Twist msg,
464
493
l = robot_params_.wheelbase ;
465
494
w = robot_params_.track ;
466
495
x = sqrt (radius * radius + (l / 2 ) * (l / 2 ));
467
- // phi_i = atan((l / 2) / (x - w / 2));
496
+ // phi_i = atan((l / 2) / (x - w / 2));
468
497
phi_i = atan ((l / 2 ) / radius);
469
498
return k * phi_i;
470
499
}
@@ -492,14 +521,15 @@ double RangerROSMessenger::ConvertCentralAngleToInner(double angle) {
492
521
return phi_i;
493
522
}
494
523
495
- bool RangerROSMessenger::TriggerParkingService (const std::shared_ptr<ranger_msgs::srv::TriggerParkMode::Request> req,
496
- const std::shared_ptr<ranger_msgs::srv::TriggerParkMode::Response> res) {
497
- // Call to trigger park mode
524
+ bool RangerROSMessenger::TriggerParkingService (
525
+ const std::shared_ptr<ranger_msgs::srv::TriggerParkMode::Request> req,
526
+ const std::shared_ptr<ranger_msgs::srv::TriggerParkMode::Response> res) {
527
+ // Call to trigger park mode
498
528
if (req->trigger_parked_mode ) {
499
529
res->response = true ;
500
530
res->is_parked = true ;
501
531
robot_->SetMotionMode (MotionState::MOTION_MODE_PARKING);
502
- } else { // Call to release park mode
532
+ } else { // Call to release park mode
503
533
res->response = true ;
504
534
res->is_parked = false ;
505
535
robot_->SetMotionMode (MotionState::MOTION_MODE_DUAL_ACKERMAN);
0 commit comments