Skip to content

Commit 665b318

Browse files
authored
Merge pull request #24 from WATonomous/voxel-grid
Voxel grid implementation
2 parents 494f633 + 73723a7 commit 665b318

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+32068
-12
lines changed

.github/workflows/linting_auto.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
- name: Set up Python
2727
uses: actions/setup-python@v1
2828
with:
29-
python-version: 3.10.18
29+
python-version: '3.10.18'
3030

3131
- name: Install Python dependencies
3232
run: pip install autopep8 clang-format

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ __pycache__
33
.vscode/
44

55
watod-config.local.sh
6+
utils/voxel/spconv
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from launch import LaunchDescription
2+
import launch_ros.actions
3+
4+
5+
def generate_launch_description():
6+
return LaunchDescription([
7+
launch_ros.actions.Node(
8+
name='octo_map_node',
9+
package='octo_map',
10+
executable='octo_map_node',
11+
output='screen',
12+
emulate_tty=True),
13+
])
File renamed without changes.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import rclpy
2+
from rclpy.node import Node
3+
import numpy as np
4+
import torch
5+
from spconv.pytorch.utils import PointToVoxel
6+
import cv2
7+
from cv_bridge import CvBridge
8+
9+
from sensor_msgs.msg import Image, PointCloud2, PointField, CameraInfo
10+
from std_msgs.msg import Header
11+
import sensor_msgs_py.point_cloud2 as pc2
12+
13+
class OctoMapNode(Node):
14+
def __init__(self):
15+
super().__init__('octo_map_node')
16+
17+
# Subscribe to processed perception data
18+
self.rgb_sub = self.create_subscription(
19+
Image, '/perception/rgb_processed', self.rgb_callback, 10)
20+
self.depth_sub = self.create_subscription(
21+
Image, '/perception/depth_processed', self.depth_callback, 10)
22+
self.info_sub = self.create_subscription(
23+
CameraInfo, '/perception/camera_info', self.info_callback, 10)
24+
25+
self.octo_pub = self.create_publisher(PointCloud2, '/behaviour/octo_map', 10)
26+
27+
self.rgb_image = None
28+
self.depth_image = None
29+
self.bridge = CvBridge()
30+
31+
# Camera intrinsics (will be updated from camera info)
32+
self.fx, self.fy, self.cx, self.cy = 525.0, 525.0, 320.0, 240.0
33+
34+
self.voxel_size = 0.04
35+
self.max_range = 3.5
36+
37+
self.get_logger().info('OctoMap Node started - subscribing to processed perception data')
38+
39+
def info_callback(self, msg):
40+
"""Update camera intrinsics from perception node."""
41+
self.fx = msg.k[0]
42+
self.fy = msg.k[4]
43+
self.cx = msg.k[2]
44+
self.cy = msg.k[5]
45+
self.get_logger().info(f'Updated camera intrinsics: fx={self.fx}, fy={self.fy}')
46+
47+
def rgb_callback(self, msg):
48+
"""Receive processed RGB image from perception node."""
49+
self.rgb_image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
50+
self.process_rgbd_if_ready()
51+
self.get_logger().info('Received processed RGB image from perception')
52+
53+
def depth_callback(self, msg):
54+
"""Receive processed depth image from perception node."""
55+
self.depth_image = self.bridge.imgmsg_to_cv2(msg, 'passthrough')
56+
self.process_rgbd_if_ready()
57+
self.get_logger().info('Received processed depth image from perception')
58+
59+
# TODO: Implement point cloud generation and octomap updating
60+
61+
62+
def main(args=None):
63+
rclpy.init(args=args)
64+
node = OctoMapNode()
65+
66+
try:
67+
rclpy.spin(node)
68+
except KeyboardInterrupt:
69+
pass
70+
finally:
71+
node.destroy_node()
72+
rclpy.shutdown()
73+
74+
if __name__ == '__main__':
75+
main()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0"?>
2+
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
3+
<package format="3">
4+
<name>octo_map</name>
5+
<version>0.0.0</version>
6+
<description>OctoMap generation for 3D mapping</description>
7+
<maintainer email="watonomous@uwaterloo.ca">watonomous</maintainer>
8+
<license>Apache-2.0</license>
9+
10+
<depend>rclpy</depend>
11+
12+
<test_depend>ament_copyright</test_depend>
13+
<test_depend>ament_flake8</test_depend>
14+
<test_depend>ament_pep257</test_depend>
15+
<test_depend>python3-pytest</test_depend>
16+
17+
<export>
18+
<build_type>ament_python</build_type>
19+
</export>
20+
</package>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
voxel_grid
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[develop]
2+
script-dir=$base/lib/voxel_grid
3+
[install]
4+
install-scripts=$base/lib/voxel_grid
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import os
2+
from glob import glob
3+
from setuptools import setup
4+
5+
package_name = 'octo_map'
6+
7+
setup(
8+
name=package_name,
9+
version='0.0.0',
10+
packages=[package_name],
11+
data_files=[
12+
# Install marker file in the package index
13+
('share/ament_index/resource_index/packages', ['resource/' + package_name]),
14+
# Include our package.xml file
15+
(os.path.join('share', package_name), ['package.xml']),
16+
# Include all launch files.
17+
(os.path.join('share', package_name, 'launch'),
18+
glob(os.path.join('launch', '*.launch.py'))),
19+
# Include all config files.
20+
(os.path.join('share', package_name, 'config'),
21+
glob(os.path.join('config', '*.yaml'))),
22+
],
23+
install_requires=['setuptools'],
24+
zip_safe=True,
25+
maintainer='watonomous',
26+
maintainer_email='watonomous@uwaterloo.ca',
27+
description='OctoMap generation for 3D mapping',
28+
license='Apache-2.0',
29+
tests_require=['pytest'],
30+
entry_points={
31+
'console_scripts': [
32+
'octo_map_node = octo_map.octo_map_node:main'
33+
],
34+
},
35+
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from launch import LaunchDescription
2+
import launch_ros.actions
3+
4+
5+
def generate_launch_description():
6+
return LaunchDescription([
7+
launch_ros.actions.Node(
8+
name='voxel_grid_node',
9+
package='voxel_grid',
10+
executable='voxel_grid_node',
11+
output='screen',
12+
emulate_tty=True),
13+
])

0 commit comments

Comments
 (0)