Skip to content

Commit bd93579

Browse files
authored
Merge pull request #15 from mleegwt/master
Navigation configuration improvements.
2 parents 9a93f78 + c4fcbc1 commit bd93579

File tree

10 files changed

+145
-72
lines changed

10 files changed

+145
-72
lines changed

ros_ws/src/boatcontrol/boatcontrol/boatcontrolnode.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def send_command(self, command):
5656
while "OK" not in response:
5757
response = ser.readline().decode().strip() # Read response from the actuator
5858
time.sleep(0.2)
59-
self.get_logger().info(f"Sent: {command}, Received: {response}")
59+
self.get_logger().debug(f"Sent: {command}, Received: {response}")
6060
return response
6161

6262
# Function to send enable motor command
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
behavior_server:
2+
ros__parameters:
3+
use_sim_time: false
4+
behavior_plugins: ["spin", "backup", "wait"]
5+
6+
spin:
7+
plugin: "nav2_behaviors::Spin"
8+
backup:
9+
plugin: "nav2_behaviors::BackUp"
10+
wait:
11+
plugin: "nav2_behaviors::Wait"
12+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
controller_server:
2+
ros__parameters:
3+
use_sim_time: true
4+
controller_plugins: ["FollowPath"]
5+
6+
FollowPath:
7+
plugin: "dwb_core::DWBLocalPlanner"
8+
9+
debug_trajectory_details: true
10+
min_vel_x: 0.0
11+
max_vel_x: 0.26
12+
min_vel_y: 0.0
13+
max_vel_y: 0.0
14+
max_vel_theta: 1.0
15+
min_speed_xy: 0.0
16+
max_speed_xy: 0.26
17+
min_speed_theta: 0.0
18+
19+
acc_lim_x: 2.5
20+
acc_lim_y: 0.0
21+
acc_lim_theta: 3.2
22+
23+
decel_lim_x: -1.0
24+
decel_lim_y: 0.0
25+
decel_lim_theta: -1.0
26+
27+
vx_samples: 20
28+
vtheta_samples: 40
29+
30+
sim_time: 1.7
31+
linear_granularity: 0.05
32+
angular_granularity: 0.025
33+
transform_tolerance: 0.2
34+
35+
critics: [
36+
"RotateToGoal",
37+
# "ObstacleFootprint",
38+
"GoalAlign",
39+
"PathAlign",
40+
"PathDist",
41+
"GoalDist",
42+
"PreferForward"
43+
]
44+

ros_ws/src/navigation/launch/nav2_stack.launch.py

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,56 @@
11
from launch import LaunchDescription
22
from launch_ros.actions import Node
3+
from launch_ros.actions import LifecycleNode
34
import launch_testing.actions
5+
from ament_index_python.packages import get_package_share_directory
6+
import os
7+
48

59
def generate_launch_description():
10+
controller_yaml = os.path.join(
11+
get_package_share_directory('navigation'),
12+
'config',
13+
'controller_server.yaml'
14+
)
15+
behavior_yaml = os.path.join(
16+
get_package_share_directory('navigation'),
17+
'config',
18+
'behavior_server.yaml'
19+
)
20+
map_yaml = os.path.join(
21+
get_package_share_directory('navigation'),
22+
'maps',
23+
'empty.yml'
24+
)
625
nodes = [
7-
Node(
26+
LifecycleNode(
827
package='nav2_bt_navigator',
928
executable='bt_navigator',
1029
name='bt_navigator',
30+
namespace='',
1131
parameters=[{'use_sim_time': False}],
1232
),
13-
Node(
33+
LifecycleNode(
1434
package='nav2_planner',
1535
executable='planner_server',
1636
name='planner_server',
37+
namespace='',
1738
parameters=[{'use_sim_time': False}],
1839
),
19-
Node(
40+
LifecycleNode(
2041
package='nav2_controller',
2142
executable='controller_server',
2243
name='controller_server',
23-
parameters=[{'use_sim_time': False}],
44+
namespace='',
45+
parameters=[controller_yaml],
2446
),
25-
Node(
47+
LifecycleNode(
2648
package='nav2_map_server',
2749
executable='map_server',
2850
name='map_server',
51+
namespace='',
2952
parameters=[{
30-
'yaml_filename': '../maps/empty.yml',
53+
'yaml_filename': map_yaml,
3154
'use_sim_time': False
3255
}],
3356
),
@@ -43,7 +66,44 @@ def generate_launch_description():
4366
name='navigation_node',
4467
output='screen',
4568
parameters=[{'use_sim_time': False}]
46-
)
69+
),
70+
Node(
71+
package='tf2_ros',
72+
executable='static_transform_publisher',
73+
name='static_map_to_odom',
74+
arguments=['0', '0', '0', '0', '0', '0', 'map', 'odom']
75+
),
76+
Node(
77+
package='tf2_ros',
78+
executable='static_transform_publisher',
79+
name='static_tf_map_to_base_link',
80+
arguments=['0', '0', '0', '0', '0', '0', 'map', 'base_link'],
81+
output='screen'
82+
),
83+
LifecycleNode(
84+
package='nav2_behaviors',
85+
executable='behavior_server',
86+
name='behavior_server',
87+
namespace='',
88+
output='screen',
89+
parameters=[behavior_yaml],
90+
),
91+
Node(
92+
package='nav2_lifecycle_manager',
93+
executable='lifecycle_manager',
94+
name='lifecycle_manager_navigation',
95+
output='screen',
96+
parameters=[{
97+
'autostart': True,
98+
'node_names': [
99+
'map_server',
100+
'controller_server',
101+
'planner_server',
102+
'behavior_server',
103+
'bt_navigator',
104+
]
105+
}]
106+
),
47107
]
48108

49109
return LaunchDescription(nodes + [
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
image: map.pgm
1+
image: empty.pgm
22
resolution: 0.5 # Elke pixel is 0.5 meter → 50x50 m kaart
33
origin: [0.0, 0.0, 0.0] # Beginpunt in wereldcoördinaten
44
occupied_thresh: 0.65
55
free_thresh: 0.196
6-
negate: 0
6+
negate: 0

ros_ws/src/navigation/navigation/boatnavigator.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ class BoatNavigator(Node):
1111
def __init__(self):
1212
super().__init__('boat_navigator')
1313

14+
self.get_logger().info("Waiting for Basic navigator to be activated")
15+
1416
# Initialize the Nav2 navigator
1517
self.navigator = BasicNavigator()
1618
self.navigator.waitUntilNav2Active()
1719

20+
self.get_logger().info("Basic navigator has been activated")
21+
1822
# Publishers for heading and speed
1923
self.heading_pub = self.create_publisher(Float64, '/desired_heading', 10)
2024
self.speed_pub = self.create_publisher(Float64, '/desired_speed', 10)

ros_ws/src/navigation/setup.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
('share/ament_index/resource_index/packages', ['resource/' + package_name]),
1111
('share/' + package_name + '/launch', ['launch/nav2_stack.launch.py']),
1212
('share/' + package_name + '/launch', ['launch/boat.launch.py']),
13+
('share/' + package_name + '/config', ['config/controller_server.yaml']),
14+
('share/' + package_name + '/config', ['config/behavior_server.yaml']),
1315
('share/' + package_name + '/maps', ['maps/empty.yml', 'maps/empty.pgm']),
1416
('share/' + package_name, ['package.xml']),
1517
],

ros_ws/src/sensorfusion/sensorfusion/sensorfusion_node.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import math
22

33
import rclpy
4-
from geometry_msgs.msg import PoseStamped
4+
from geometry_msgs.msg import PoseWithCovarianceStamped
5+
from geometry_msgs.msg import PoseWithCovariance
56
from geometry_msgs.msg import Point
67
from geometry_msgs.msg import Pose
78
from geometry_msgs.msg import Quaternion
@@ -30,7 +31,7 @@ def __init__(self):
3031
super().__init__('sensor_fusion_node')
3132
self.gps_sub = self.create_subscription(NavSatFix, '/fix', self.gps_callback, 10)
3233
self.compass_sub = self.create_subscription(Float64, '/compass', self.compass_callback, 10)
33-
self.pose_pub = self.create_publisher(PoseStamped, '/amcl_pose', 100)
34+
self.pose_pub = self.create_publisher(PoseWithCovarianceStamped, '/amcl_pose', 100)
3435
self.current_lat = 0.0
3536
self.current_lon = 0.0
3637
self.current_heading = 0 # Heading from your custom compass
@@ -55,7 +56,8 @@ def publish_pose(self):
5556
orientation = heading_to_quaternion(self.current_heading)
5657
pose = Pose(position = position, orientation = orientation)
5758

58-
pose_msg = PoseStamped(header = hdr, pose = pose)
59+
pose_ext = PoseWithCovariance(pose = pose)
60+
pose_msg = PoseWithCovarianceStamped(header = hdr, pose = pose_ext)
5961
self.get_logger().debug(f"Pose with cov: {pose_msg}")
6062
self.pose_pub.publish(pose_msg)
6163

ros_ws/src/sensorfusion/test/test_pub_error.py

Lines changed: 0 additions & 53 deletions
This file was deleted.

ros_ws/src/sensorfusion/test/test_sensorfusion_node.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from rclpy.node import Node
44
from sensor_msgs.msg import NavSatFix
55
from std_msgs.msg import Float64
6-
from geometry_msgs.msg import PoseStamped
6+
from geometry_msgs.msg import PoseWithCovarianceStamped
7+
from geometry_msgs.msg import PoseWithCovariance
78
from rclpy.wait_for_message import wait_for_message
89
import launch
910
import launch_ros.actions
@@ -47,7 +48,7 @@ def setUp(self):
4748
# Create publishers for GPS & Compass
4849
self.gps_pub = self.node.create_publisher(NavSatFix, "/fix", 10)
4950
self.compass_pub = self.node.create_publisher(Float64, "/compass", 10)
50-
self.pose_sub = self.node.create_subscription(PoseStamped, "/amcl_pose", lambda msg: self.msgs.append(msg), 10)
51+
self.pose_sub = self.node.create_subscription(PoseWithCovarianceStamped, "/amcl_pose", lambda msg: self.msgs.append(msg), 10)
5152

5253
def tearDown(self):
5354
self.node.destroy_subscription(self.pose_sub)
@@ -86,9 +87,10 @@ def test_sensorfusion_publishes_fused_data(self, launch_service, proc_info, sens
8687
fused_pose = self.msgs[-1]
8788
assert fused_pose is not None, f"SensorFusion did not publish a fused Pose! {fused_pose}"
8889
assert fused_pose.pose is not None, f"SensorFusion did not include a Pose! {fused_pose}"
89-
assert fused_pose.pose.position is not None, f"SensorFusion did not include a Position! {fused_pose}"
90-
assert fused_pose.pose.position.x != 0, "Expected nonzero position"
91-
assert fused_pose.pose.position.y != 0, "Expected nonzero position"
92-
assert fused_pose.pose.orientation.z != 0, "Expected valid heading"
90+
assert fused_pose.pose.pose is not None, f"SensorFusion did not include a Pose! {fused_pose}"
91+
assert fused_pose.pose.pose.position is not None, f"SensorFusion did not include a Position! {fused_pose}"
92+
assert fused_pose.pose.pose.position.x != 0, "Expected nonzero position"
93+
assert fused_pose.pose.pose.position.y != 0, "Expected nonzero position"
94+
assert fused_pose.pose.pose.orientation.z != 0, "Expected valid heading"
9395

9496

0 commit comments

Comments
 (0)