Skip to content

Commit 4707841

Browse files
authored
cmd_vel_mux + base_link frame name + odometry_transformer (#6)
* fixed path bug * Refactor launch scripts to source workspace setup from a consistent directory structure and include cmd_vel_mux in all relevant launch files. * Update frame_id references from 'vehicle' to 'base_link' in launch files and source code for consistency * Implemented new odom transformer node. Remove sensor offset parameters from configuration and source code; update odometry topic references to use '/odom_base_link' instead of '/state_estimation' across launch files and implementations. * bug fix for building * rviz bug * wrong url fixed
1 parent b73e719 commit 4707841

40 files changed

Lines changed: 1040 additions & 65 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ ros2 run pct_planner pcd_to_tomogram.py /home/user/maps/warehouse/map.pcd -o /ho
194194

195195
The stack supports Unity-based simulation environments. Download a Unity environment model and unzip to:
196196

197-
Download a [Unity environment model for the Mecanum wheel platform](https://drive.google.com/drive/folders/1G1JYkccvoSlxyySuTlPfvmrWoJUO8oSs?usp=sharing) and unzip the files to the 'src/base_autonomy/vehicle_simulator/mesh/unity' folder. The environment model files should look like below. For computers without a powerful GPU, please try the 'without_360_camera' version for a higher rendering rate.
197+
Download a [Unity environment model for the Mecanum wheel platform](https://drive.google.com/drive/folders/1GNz386h6wiiFuQQdaY2_HbNRyd7nKA1N) and unzip the files to the 'src/base_autonomy/vehicle_simulator/mesh/unity' folder. The environment model files should look like below. For computers without a powerful GPU, please try the 'without_360_camera' version for a higher rendering rate.
198198

199199
mesh/<br>
200200
&nbsp;&nbsp;&nbsp;&nbsp;unity/<br>

src/base_autonomy/local_planner/config/unitree/unitree_g1.yaml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ localPlanner:
2626
# obstacle height threshold
2727
obstacleHeightThre: 0.1 # 0.1 for flat terrain
2828

29-
# Sensor offset
30-
sensorOffsetX: 0.0
31-
sensorOffsetY: 0.0
32-
3329
# Vehicle dimensions
3430
vehicleLength: 0.5
3531
vehicleWidth: 0.5

src/base_autonomy/local_planner/launch/local_planner.launch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@
7878
</node>
7979

8080
<!-- Static transform using sensor offsets from launch arguments (should match robot_config file values) -->
81-
<node pkg="tf2_ros" exec="static_transform_publisher" name="vehicleTransPublisher" args="$(var sensorOffsetX) $(var sensorOffsetY) $(var sensorOffsetZ) 0 0 0 /sensor /vehicle"/>
81+
<node pkg="tf2_ros" exec="static_transform_publisher" name="vehicleTransPublisher" args="$(var sensorOffsetX) $(var sensorOffsetY) $(var sensorOffsetZ) 0 0 0 sensor base_link"/>
8282

83-
<node pkg="tf2_ros" exec="static_transform_publisher" name="sensorTransPublisher" args="0 0 $(var cameraOffsetZ) -1.5707963 0 -1.5707963 /sensor /camera"/>
83+
<node pkg="tf2_ros" exec="static_transform_publisher" name="sensorTransPublisher" args="0 0 $(var cameraOffsetZ) -1.5707963 0 -1.5707963 sensor camera"/>
8484

8585
</launch>

src/base_autonomy/local_planner/launch/local_planner.launch.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,21 @@ def generate_launch_description():
185185
]
186186
)
187187

188+
# Odom transformer: re-expresses /state_estimation (sensor frame) as
189+
# odom_base_link (base_link frame) using the sensor->base_link static TF.
190+
odomTransformer_node = Node(
191+
package='odom_transformer',
192+
executable='odom_transformer_node',
193+
name='odom_transformer',
194+
output='screen',
195+
parameters=[{
196+
'source_frame': 'sensor',
197+
'target_frame': 'base_link',
198+
'odom_topic_in': '/state_estimation',
199+
'odom_topic_out': '/odom_base_link',
200+
}]
201+
)
202+
188203
# Static transform publishers with sensor offsets from config
189204
vehicleTransPublisher_node = Node(
190205
package='tf2_ros',
@@ -195,8 +210,8 @@ def generate_launch_description():
195210
str(-sensor_offsets['sensorOffsetY']),
196211
str(-sensor_offsets['sensorOffsetZ']),
197212
'0', '0', '0',
198-
'/sensor',
199-
'/vehicle'
213+
'sensor',
214+
'base_link'
200215
]
201216
)
202217

@@ -211,7 +226,7 @@ def generate_launch_description():
211226
str(camera_offsets['cameraOffsetRoll']),
212227
str(camera_offsets['cameraOffsetPitch']),
213228
str(camera_offsets['cameraOffsetYaw']),
214-
'/sensor', camera_link
229+
'sensor', camera_link
215230
]
216231
)
217232

@@ -227,4 +242,5 @@ def generate_launch_description():
227242
pathFollower_node,
228243
vehicleTransPublisher_node,
229244
sensorTransPublisher_node,
245+
odomTransformer_node,
230246
])

src/base_autonomy/local_planner/src/localPlanner.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ double normalizeAngle(double angle) {
5252
string pathFolder;
5353
double vehicleLength = 0.6;
5454
double vehicleWidth = 0.6;
55-
double sensorOffsetX = 0;
56-
double sensorOffsetY = 0;
5755
bool twoWayDrive = true;
5856
double laserVoxelSize = 0.05;
5957
double terrainVoxelSize = 0.2;
@@ -169,8 +167,8 @@ void odometryHandler(const nav_msgs::msg::Odometry::ConstSharedPtr odom)
169167
vehicleRoll = roll;
170168
vehiclePitch = pitch;
171169
vehicleYaw = yaw;
172-
vehicleX = odom->pose.pose.position.x - cos(yaw) * sensorOffsetX + sin(yaw) * sensorOffsetY;
173-
vehicleY = odom->pose.pose.position.y - sin(yaw) * sensorOffsetX - cos(yaw) * sensorOffsetY;
170+
vehicleX = odom->pose.pose.position.x;
171+
vehicleY = odom->pose.pose.position.y;
174172
vehicleZ = odom->pose.pose.position.z;
175173
}
176174

@@ -562,8 +560,6 @@ int main(int argc, char** argv)
562560
nh->declare_parameter<std::string>("pathFolder", pathFolder);
563561
nh->declare_parameter<double>("vehicleLength", vehicleLength);
564562
nh->declare_parameter<double>("vehicleWidth", vehicleWidth);
565-
nh->declare_parameter<double>("sensorOffsetX", sensorOffsetX);
566-
nh->declare_parameter<double>("sensorOffsetY", sensorOffsetY);
567563
nh->declare_parameter<bool>("twoWayDrive", twoWayDrive);
568564
nh->declare_parameter<double>("laserVoxelSize", laserVoxelSize);
569565
nh->declare_parameter<double>("terrainVoxelSize", terrainVoxelSize);
@@ -610,8 +606,6 @@ int main(int argc, char** argv)
610606
nh->get_parameter("pathFolder", pathFolder);
611607
nh->get_parameter("vehicleLength", vehicleLength);
612608
nh->get_parameter("vehicleWidth", vehicleWidth);
613-
nh->get_parameter("sensorOffsetX", sensorOffsetX);
614-
nh->get_parameter("sensorOffsetY", sensorOffsetY);
615609
nh->get_parameter("twoWayDrive", twoWayDrive);
616610
nh->get_parameter("laserVoxelSize", laserVoxelSize);
617611
nh->get_parameter("terrainVoxelSize", terrainVoxelSize);
@@ -655,7 +649,7 @@ int main(int argc, char** argv)
655649
nh->get_parameter("goalX", goalX);
656650
nh->get_parameter("goalY", goalY);
657651

658-
auto subOdometry = nh->create_subscription<nav_msgs::msg::Odometry>("/state_estimation", 5, odometryHandler);
652+
auto subOdometry = nh->create_subscription<nav_msgs::msg::Odometry>("/odom_base_link", 5, odometryHandler);
659653

660654
auto subLaserCloud = nh->create_subscription<sensor_msgs::msg::PointCloud2>("/registered_scan", 5, laserCloudHandler);
661655

@@ -1061,7 +1055,7 @@ int main(int argc, char** argv)
10611055
}
10621056

10631057
path.header.stamp = rclcpp::Time(static_cast<uint64_t>(odomTime * 1e9));
1064-
path.header.frame_id = "vehicle";
1058+
path.header.frame_id = "base_link";
10651059
pubPath->publish(path);
10661060

10671061
#if PLOTPATHSET == 1
@@ -1107,7 +1101,7 @@ int main(int argc, char** argv)
11071101
sensor_msgs::msg::PointCloud2 freePaths2;
11081102
pcl::toROSMsg(*freePaths, freePaths2);
11091103
freePaths2.header.stamp = rclcpp::Time(static_cast<uint64_t>(odomTime * 1e9));
1110-
freePaths2.header.frame_id = "vehicle";
1104+
freePaths2.header.frame_id = "base_link";
11111105
pubFreePaths->publish(freePaths2);
11121106
#endif
11131107
}
@@ -1137,23 +1131,23 @@ int main(int argc, char** argv)
11371131
path.poses[0].pose.orientation.w = 0;
11381132

11391133
path.header.stamp = rclcpp::Time(static_cast<uint64_t>(odomTime * 1e9));
1140-
path.header.frame_id = "vehicle";
1134+
path.header.frame_id = "base_link";
11411135
pubPath->publish(path);
11421136

11431137
#if PLOTPATHSET == 1
11441138
freePaths->clear();
11451139
sensor_msgs::msg::PointCloud2 freePaths2;
11461140
pcl::toROSMsg(*freePaths, freePaths2);
11471141
freePaths2.header.stamp = rclcpp::Time(static_cast<uint64_t>(odomTime * 1e9));
1148-
freePaths2.header.frame_id = "vehicle";
1142+
freePaths2.header.frame_id = "base_link";
11491143
pubFreePaths->publish(freePaths2);
11501144
#endif
11511145
}
11521146

11531147
/*sensor_msgs::msg::PointCloud2 plannerCloud2;
11541148
pcl::toROSMsg(*plannerCloudCrop, plannerCloud2);
11551149
plannerCloud2.header.stamp = rclcpp::Time(static_cast<uint64_t>(odomTime * 1e9));
1156-
plannerCloud2.header.frame_id = "vehicle";
1150+
plannerCloud2.header.frame_id = "base_link";
11571151
pubLaserCloud->publish(plannerCloud2);*/
11581152
}
11591153

src/base_autonomy/local_planner/src/pathFollower.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ double normalizeAngle(double angle) {
4646
bool realRobot = false;
4747
string serialPort = "/dev/ttyACM0";
4848
int baudrate = 115200;
49-
double sensorOffsetX = 0;
50-
double sensorOffsetY = 0;
5149
int pubSkipNum = 1;
5250
int pubSkipCount = 0;
5351
bool twoWayDrive = true;
@@ -133,8 +131,8 @@ void odomHandler(const nav_msgs::msg::Odometry::ConstSharedPtr odomIn)
133131
vehicleRoll = roll;
134132
vehiclePitch = pitch;
135133
vehicleYaw = yaw;
136-
vehicleX = odomIn->pose.pose.position.x - cos(yaw) * sensorOffsetX + sin(yaw) * sensorOffsetY;
137-
vehicleY = odomIn->pose.pose.position.y - sin(yaw) * sensorOffsetX - cos(yaw) * sensorOffsetY;
134+
vehicleX = odomIn->pose.pose.position.x;
135+
vehicleY = odomIn->pose.pose.position.y;
138136
vehicleZ = odomIn->pose.pose.position.z;
139137

140138
if ((fabs(roll) > inclThre * PI / 180.0 || fabs(pitch) > inclThre * PI / 180.0) && useInclToStop) {
@@ -246,8 +244,6 @@ int main(int argc, char** argv)
246244
nh->declare_parameter<bool>("realRobot", realRobot);
247245
nh->declare_parameter<string>("serialPort", serialPort);
248246
nh->declare_parameter<int>("baudrate", baudrate);
249-
nh->declare_parameter<double>("sensorOffsetX", sensorOffsetX);
250-
nh->declare_parameter<double>("sensorOffsetY", sensorOffsetY);
251247
nh->declare_parameter<int>("pubSkipNum", pubSkipNum);
252248
nh->declare_parameter<bool>("twoWayDrive", twoWayDrive);
253249
nh->declare_parameter<double>("lookAheadDis", lookAheadDis);
@@ -282,8 +278,6 @@ int main(int argc, char** argv)
282278
nh->get_parameter("realRobot", realRobot);
283279
nh->get_parameter("serialPort", serialPort);
284280
nh->get_parameter("baudrate", baudrate);
285-
nh->get_parameter("sensorOffsetX", sensorOffsetX);
286-
nh->get_parameter("sensorOffsetY", sensorOffsetY);
287281
nh->get_parameter("pubSkipNum", pubSkipNum);
288282
nh->get_parameter("twoWayDrive", twoWayDrive);
289283
nh->get_parameter("lookAheadDis", lookAheadDis);
@@ -315,7 +309,7 @@ int main(int argc, char** argv)
315309
nh->get_parameter("joyToSpeedDelay", joyToSpeedDelay);
316310
nh->get_parameter("goalYawGain", goalYawGain);
317311

318-
auto subOdom = nh->create_subscription<nav_msgs::msg::Odometry>("/state_estimation", 5, odomHandler);
312+
auto subOdom = nh->create_subscription<nav_msgs::msg::Odometry>("/odom_base_link", 5, odomHandler);
319313

320314
auto subPath = nh->create_subscription<nav_msgs::msg::Path>("/path", 5, pathHandler);
321315

@@ -327,9 +321,9 @@ int main(int argc, char** argv)
327321

328322
auto subSlowDown = nh->create_subscription<std_msgs::msg::Int8>("/slow_down", 5, slowDownHandler);
329323

330-
auto pubSpeed = nh->create_publisher<geometry_msgs::msg::TwistStamped>("/cmd_vel", 5);
324+
auto pubSpeed = nh->create_publisher<geometry_msgs::msg::TwistStamped>("/navigation_cmd_vel", 5);
331325
geometry_msgs::msg::TwistStamped cmd_vel;
332-
cmd_vel.header.frame_id = "vehicle";
326+
cmd_vel.header.frame_id = "base_link";
333327

334328
if (autonomyMode) {
335329
joySpeed = autonomySpeed / maxSpeed;

src/base_autonomy/vehicle_simulator/launch/system_bagfile.launch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ def generate_launch_description():
8686
}]
8787
)
8888

89+
start_cmd_vel_mux = IncludeLaunchDescription(
90+
PythonLaunchDescriptionSource(os.path.join(
91+
get_package_share_directory('cmd_vel_mux'), 'launch', 'cmd_vel_mux-launch.py')
92+
)
93+
)
94+
8995
ld = LaunchDescription()
9096

9197
# Add the actions
@@ -105,4 +111,6 @@ def generate_launch_description():
105111
ld.add_action(start_visualization_tools)
106112
ld.add_action(start_joy)
107113

114+
ld.add_action(start_cmd_vel_mux)
115+
108116
return ld

src/base_autonomy/vehicle_simulator/launch/system_bagfile_with_exploration_planner.launch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ def generate_launch_description():
9696
}.items()
9797
)
9898

99+
start_cmd_vel_mux = IncludeLaunchDescription(
100+
PythonLaunchDescriptionSource(os.path.join(
101+
get_package_share_directory('cmd_vel_mux'), 'launch', 'cmd_vel_mux-launch.py')
102+
)
103+
)
104+
99105
ld = LaunchDescription()
100106

101107
# Add the actions
@@ -117,4 +123,6 @@ def generate_launch_description():
117123
ld.add_action(start_joy)
118124
ld.add_action(start_tare_planner)
119125

126+
ld.add_action(start_cmd_vel_mux)
127+
120128
return ld

src/base_autonomy/vehicle_simulator/launch/system_bagfile_with_route_planner.launch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ def generate_launch_description():
114114
condition=IfCondition(use_pct_planner)
115115
)
116116

117+
start_cmd_vel_mux = IncludeLaunchDescription(
118+
PythonLaunchDescriptionSource(os.path.join(
119+
get_package_share_directory('cmd_vel_mux'), 'launch', 'cmd_vel_mux-launch.py')
120+
)
121+
)
122+
117123
ld = LaunchDescription()
118124

119125
# Add the actions
@@ -137,4 +143,6 @@ def generate_launch_description():
137143
ld.add_action(start_far_planner)
138144
ld.add_action(start_pct_planner)
139145

146+
ld.add_action(start_cmd_vel_mux)
147+
140148
return ld

src/base_autonomy/vehicle_simulator/launch/system_real_robot.launch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ def generate_launch_description():
9191
[get_package_share_directory('livox_ros_driver2'), '/launch_ROS2/msg_MID360_launch.py']),
9292
)
9393

94+
start_cmd_vel_mux = IncludeLaunchDescription(
95+
PythonLaunchDescriptionSource(os.path.join(
96+
get_package_share_directory('cmd_vel_mux'), 'launch', 'cmd_vel_mux-launch.py')
97+
)
98+
)
99+
94100
ld = LaunchDescription()
95101

96102
# Add the actions
@@ -111,4 +117,6 @@ def generate_launch_description():
111117
ld.add_action(start_joy)
112118
ld.add_action(start_mid360)
113119

120+
ld.add_action(start_cmd_vel_mux)
121+
114122
return ld

0 commit comments

Comments
 (0)