Skip to content

Commit b279bc2

Browse files
Merge pull request #4 from westonrobot/feature-ranger_mini3_support
Feature ranger mini3 support
2 parents 112439e + 028e045 commit b279bc2

File tree

4 files changed

+127
-71
lines changed

4 files changed

+127
-71
lines changed

Diff for: README.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,19 @@ $ colcon build --symlink-install
7373
```bash
7474
$ ros2 launch ranger_bringup ranger_mini_v2.launch #for ranger_mini 2.0
7575
```
76+
* Start the base node for ranger_mini_v3
77+
78+
```bash
79+
$ ros2 launch ranger_bringup ranger_mini_v3.launch #for ranger_mini 3.0
80+
```
7681
7782
7883
## ROS interface
7984
8085
### Parameters
8186
8287
* can_device (string): **can0**
83-
* robot_model (string): **ranger**/ranger_mini_v1/ranger_mini_v2
88+
* robot_model (string): **ranger**/ranger_mini_v1/ranger_mini_v2/ranger_mini_v3
8489
* update_rate (int): **50**
8590
* base_frame (string): **base_link**
8691
* odom_frame (string): **odom**

Diff for: ranger_base/include/ranger_base/ranger_messenger.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class RangerROSMessenger : public std::enable_shared_from_this<RangerROSMessenge
6060
double min_turn_radius;
6161
};
6262

63-
enum class RangerSubType { kRanger = 0, kRangerMiniV1, kRangerMiniV2 };
63+
enum class RangerSubType { kRanger = 0, kRangerMiniV1, kRangerMiniV2, kRangerMiniV3 };
6464

6565
public:
6666
RangerROSMessenger(rclcpp::Node::SharedPtr& node);

Diff for: ranger_base/src/ranger_messenger.cpp

+99-69
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,30 @@ namespace westonrobot {
2020
// } // namespace
2121

2222
///////////////////////////////////////////////////////////////////////////////////
23-
RangerROSMessenger::RangerROSMessenger(rclcpp::Node::SharedPtr& node){
24-
23+
RangerROSMessenger::RangerROSMessenger(rclcpp::Node::SharedPtr& node) {
2524
node_ = node;
2625
LoadParameters();
2726

2827
// connect to robot and setup ROS subscription
2928
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);
3134
} else {
32-
robot_ = std::make_shared<RangerRobot>(false);
35+
robot_ = std::make_shared<RangerRobot>(RangerRobot::Variant::kRanger);
3336
}
3437

3538
if (port_name_.find("can") != std::string::npos) {
3639
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");
3841
return;
3942
}
4043
robot_->EnableCommandedMode();
4144
} 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());
4347
return;
4448
}
4549

@@ -56,16 +60,19 @@ void RangerROSMessenger::Run() {
5660
}
5761

5862
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");
6469
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);
6773

68-
RCLCPP_INFO(node_->get_logger(),
74+
RCLCPP_INFO(
75+
node_->get_logger(),
6976
"Successfully loaded the following parameters: \n port_name: %s\n "
7077
"robot_model: %s\n odom_frame: %s\n base_frame: %s\n "
7178
"update_rate: %d\n odom_topic_name: %s\n "
@@ -89,59 +96,78 @@ void RangerROSMessenger::LoadParameters() {
8996
RangerMiniV1Params::max_steer_angle_parallel;
9097
robot_params_.max_round_angle = RangerMiniV1Params::max_round_angle;
9198
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;
92127
} 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;
122141
}
123142
parking_mode_ = false;
124143
}
125144

126145
void RangerROSMessenger::SetupSubscription() {
127146
// 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);
132151
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);
137158

138159
// subscriber
139160
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));
141164

142165
// 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));
145171

146172
tf_broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(node_);
147173
}
@@ -194,12 +220,14 @@ void RangerROSMessenger::PublishStateToROS() {
194220

195221
// publish actuator state
196222
{
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",
198225
// actuator_state.motor_angles.angle_5,
199226
// actuator_state.motor_angles.angle_6,
200227
// actuator_state.motor_angles.angle_7,
201228
// 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",
203231
// actuator_state.motor_speeds.speed_1,
204232
// actuator_state.motor_speeds.speed_2,
205233
// actuator_state.motor_speeds.speed_3,
@@ -274,7 +302,7 @@ void RangerROSMessenger::UpdateOdometry(double linear, double angular,
274302
boost::numeric::odeint::integrate_const(
275303
boost::numeric::odeint::runge_kutta4<DualAckermanModel::state_type>(),
276304
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;
278306
position_x_ = x[0];
279307
position_y_ = x[1];
280308
theta_ = x[2];
@@ -364,16 +392,16 @@ void RangerROSMessenger::UpdateOdometry(double linear, double angular,
364392
}
365393
}
366394

367-
void RangerROSMessenger::TwistCmdCallback(geometry_msgs::msg::Twist::SharedPtr msg) {
395+
void RangerROSMessenger::TwistCmdCallback(
396+
geometry_msgs::msg::Twist::SharedPtr msg) {
368397
double steer_cmd;
369398
double radius;
370399

371400
// analyze Twist msg and switch motion_mode
372401
// check for parking mode, only applicable to RangerMiniV2
373402
if (parking_mode_ && robot_type_ == RangerSubType::kRangerMiniV2) {
374403
return;
375-
}
376-
else if (msg->linear.y != 0) {
404+
} else if (msg->linear.y != 0) {
377405
if (msg->linear.x == 0.0 && robot_type_ == RangerSubType::kRangerMiniV1) {
378406
motion_mode_ = MotionState::MOTION_MODE_SIDE_SLIP;
379407
robot_->SetMotionMode(MotionState::MOTION_MODE_SIDE_SLIP);
@@ -445,10 +473,11 @@ void RangerROSMessenger::TwistCmdCallback(geometry_msgs::msg::Twist::SharedPtr m
445473
}
446474
}
447475

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);
452481
}
453482

454483
double RangerROSMessenger::CalculateSteeringAngle(geometry_msgs::msg::Twist msg,
@@ -464,7 +493,7 @@ double RangerROSMessenger::CalculateSteeringAngle(geometry_msgs::msg::Twist msg,
464493
l = robot_params_.wheelbase;
465494
w = robot_params_.track;
466495
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));
468497
phi_i = atan((l / 2) / radius);
469498
return k * phi_i;
470499
}
@@ -492,14 +521,15 @@ double RangerROSMessenger::ConvertCentralAngleToInner(double angle) {
492521
return phi_i;
493522
}
494523

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
498528
if (req->trigger_parked_mode) {
499529
res->response = true;
500530
res->is_parked = true;
501531
robot_->SetMotionMode(MotionState::MOTION_MODE_PARKING);
502-
} else { // Call to release park mode
532+
} else { // Call to release park mode
503533
res->response = true;
504534
res->is_parked = false;
505535
robot_->SetMotionMode(MotionState::MOTION_MODE_DUAL_ACKERMAN);

Diff for: ranger_bringup/launch/ranger_mini_v3.launch.xml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version='1.0'?>
2+
<launch>
3+
4+
<arg name="port_name" default="can0"/>
5+
<arg name="robot_model" default="ranger_mini_v3"/>
6+
<arg name="odom_frame" default="odom"/>
7+
<arg name="base_frame" default="base_link" />
8+
<arg name="update_rate" default="50" />
9+
<arg name="odom_topic_name" default="odom" />
10+
<arg name="publish_odom_tf" default="false" />
11+
12+
<include file="$(find-pkg-share ranger_base)/launch/include/ranger_robot_base.launch.xml">
13+
<arg name="port_name" value="$(var port_name)"/>
14+
<arg name="robot_model" value="$(var robot_model)"/>
15+
<arg name="odom_frame" value="$(var odom_frame)"/>
16+
<arg name="base_frame" value="$(var base_frame)" />
17+
<arg name="update_rate" value="$(var update_rate)" />
18+
<arg name="odom_topic_name" value="$(var odom_topic_name)" />
19+
<arg name="publish_odom_tf" value="$(var publish_odom_tf)" />
20+
</include>
21+
</launch>

0 commit comments

Comments
 (0)