Skip to content

Commit

Permalink
[Dev] Add ros2 bazel build example (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
lshmouse authored Sep 30, 2024
1 parent 0ddbc64 commit 1e49482
Show file tree
Hide file tree
Showing 10 changed files with 186 additions and 1 deletion.
41 changes: 40 additions & 1 deletion WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ load("@llvm_toolchain//:toolchains.bzl", "llvm_register_toolchains")
llvm_register_toolchains()

### Python Setup
load("@rules_python//python:repositories.bzl", "py_repositories")

py_repositories()

load("@rules_python//python:pip.bzl", "pip_install")

pip_install(
Expand Down Expand Up @@ -68,4 +72,39 @@ python_configure(name = "local_config_python")
### CUDA Setup
load("@rules_cuda//cuda:repositories.bzl", "register_detected_cuda_toolchains", "rules_cuda_dependencies")
rules_cuda_dependencies()
register_detected_cuda_toolchains()
register_detected_cuda_toolchains()


### ROS2 Setup
load("@com_github_mvukov_rules_ros2//repositories:repositories.bzl", "ros2_repositories", "ros2_workspace_repositories")

ros2_workspace_repositories()

ros2_repositories()

load("@com_github_mvukov_rules_ros2//repositories:deps.bzl", "ros2_deps")

ros2_deps()

load("@rules_python//python:repositories.bzl", "python_register_toolchains")

python_register_toolchains(
name = "rules_ros2_python",
python_version = "3.10",
)

load("@rules_python//python:pip.bzl", "pip_parse")
load("@rules_ros2_python//:defs.bzl", python_interpreter_target = "interpreter")

pip_parse(
name = "rules_ros2_pip_deps",
python_interpreter_target = python_interpreter_target,
requirements_lock = "@com_github_mvukov_rules_ros2//:requirements_lock.txt",
)

load(
"@rules_ros2_pip_deps//:requirements.bzl",
install_rules_ros2_pip_deps = "install_deps",
)

install_rules_ros2_pip_deps()
2 changes: 2 additions & 0 deletions bazel/workspace.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ load("//third_party/protobuf:workspace.bzl", protobuf = "repo")
load("//third_party/grpc:workspace.bzl", grpc = "repo")

# autonomous vechicle libraries
load("//third_party/rules_ros2:workspace.bzl", rules_ros2 = "repo")
load("//third_party/mcap:workspace.bzl", mcap = "repo")
load("//third_party/onnxruntime:workspace.bzl", onnxruntime = "repo")
load("//third_party/foxglove_schemas:workspace.bzl", foxglove_schemas = "repo")
Expand Down Expand Up @@ -94,6 +95,7 @@ def init_third_parties():
protobuf()
grpc()

rules_ros2()
mcap()
foxglove_schemas()
onnxruntime()
Expand Down
37 changes: 37 additions & 0 deletions experimental/ros2_example/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
load("@com_github_mvukov_rules_ros2//ros2:cc_defs.bzl", "ros2_cpp_binary")
load("@com_github_mvukov_rules_ros2//ros2:launch.bzl", "ros2_launch")

load("//bazel/tools:cpplint.bzl", "cpplint")

package(default_visibility = ["//visibility:public"])

ros2_cpp_binary(
name = "ros_talker",
srcs = ["ros_talker.cc"],
deps = [
"@ros2_common_interfaces//:cpp_std_msgs",
"@ros2_rclcpp//:rclcpp",
],
)

ros2_cpp_binary(
name = "ros_listener",
srcs = ["ros_listener.cc"],
deps = [
"@ros2_common_interfaces//:cpp_std_msgs",
"@ros2_rclcpp//:rclcpp",
],
)

# Disabled ros2_launch temporarily, for following issue:
# Error: file '@rules_python//python:pip.bzl' does not contain symbol 'whl_filegroup'
#ros2_launch(
# name = "ros_chatter",
# launch_file = "ros_chatter.py",
# nodes = [
# ":ros_listener",
# ":ros_talker",
# ],
#)

cpplint()
6 changes: 6 additions & 0 deletions experimental/ros2_example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## ROS2 Example

### References
- https://github.com/mvukov/rules_ros2
- https://github.com/ApexAI/rules_ros/
- https://github.com/RobotLocomotion/drake-ros
16 changes: 16 additions & 0 deletions experimental/ros2_example/ros_chatter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""Launch a talker and a listener."""
import launch
import launch_ros.actions

def generate_launch_description():
"""Launch a talker and a listener."""
return launch.LaunchDescription([
launch_ros.actions.Node(
# Provide the rootpath for the node.
executable='chatter/talker',
output='screen',
name='talker'),
launch_ros.actions.Node(executable='chatter/listener',
output='screen',
name='listener'),
])
26 changes: 26 additions & 0 deletions experimental/ros2_example/ros_listener.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright 2023 AI-Playground
#include <iostream>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class MinimalSubscriber : public rclcpp::Node {
public:
MinimalSubscriber() : Node("minimal_subscriber") {
subscription_ = create_subscription<std_msgs::msg::String>(
"topic", 10, [this](std_msgs::msg::String::UniquePtr msg) {
RCLCPP_INFO(get_logger(), "I heard: '%s'", msg->data.c_str());
});
}

private:
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalSubscriber>());
rclcpp::shutdown();
return 0;
}
40 changes: 40 additions & 0 deletions experimental/ros2_example/ros_talker.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright 2023 AI-Playground
#include <chrono> // NOLINT [build/c++11]
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

/* This example creates a subclass of Node and uses a fancy C++11 lambda
* function to shorten the callback syntax, at the expense of making the
* code somewhat more difficult to understand at first glance. */

class MinimalPublisher : public rclcpp::Node {
public:
MinimalPublisher() : Node("minimal_publisher"), count_(0) {
declare_parameter("callback_period_ms", 500);
auto callback_period_ms = get_parameter("callback_period_ms").as_int();

publisher_ = create_publisher<std_msgs::msg::String>("topic", 10);
auto timer_callback = [this]() -> void {
auto message = std_msgs::msg::String();
message.data = "Hello, world! " + std::to_string(count_++);
RCLCPP_INFO(get_logger(), "Publishing: '%s'", message.data.c_str());
publisher_->publish(message);
};
timer_ = create_wall_timer(std::chrono::milliseconds(callback_period_ms),
timer_callback);
}

private:
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
size_t count_;
};

int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalPublisher>());
rclcpp::shutdown();
return 0;
}
1 change: 1 addition & 0 deletions third_party/rules_ros2/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package(default_visibility = ["//visibility:public"])
6 changes: 6 additions & 0 deletions third_party/rules_ros2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## rules_ros2

See: https://github.com/bazelbuild/rules_ros2

### references
- https://github.com/bazelbuild/rules_ros2
12 changes: 12 additions & 0 deletions third_party/rules_ros2/workspace.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""Loads the rules_python package"""
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

def clean_dep(dep):
return str(Label(dep))

def repo():
git_repository(
name = "com_github_mvukov_rules_ros2",
remote = "https://github.com/mvukov/rules_ros2.git",
commit = "b599d6af09b90e0d548d3cb6e39fed8c3ef7be70",
)

0 comments on commit 1e49482

Please sign in to comment.