-
Notifications
You must be signed in to change notification settings - Fork 1
teleop init #8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
teleop init #8
Changes from all commits
0d0ba6f
5ff13d9
947e794
02dc005
1ced01d
e946321
f0d0dea
46231a0
d5bd330
bb70054
6008d43
e9bf81e
f96a911
b34fa45
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| # Teleop | ||
| ## Samples | ||
|
|
||
| rosbridge listener: a node that subscribes to the "teleop" topic and prints all received messages to the console | ||
| rosbridge publisher: a node that publishes a VRHandPose message to the "teleop" topic on a timer | ||
|
|
||
| running humanoid-server will allow you to listen to, and publish over the "teleop" topic over websocket. You should be able to see messages published from humanoid-server on the ros side, and messages published from ros in humanoid-server. | ||
|
|
||
| To run rosbridge listener: | ||
| ``` | ||
| ros2 run rosbridge_listener rosbridge_listener_node | ||
| ``` | ||
|
|
||
| To run rosbridge publisher: | ||
|
|
||
| ``` | ||
| ros2 run rosbridge_publisher rosbridge_publisher_node | ||
| ``` | ||
|
|
||
| ## Running Rosbridge Server | ||
| Rosbridge server will relay ros topics to humanoid-server. To run, use: | ||
| ``` | ||
| ros2 launch rosbridge_server rosbridge_websocket_launch.xml | ||
| ``` | ||
|
|
||
| ## Full Setup for Testing VR -> ROS | ||
| These commands were run with the autonomy/samples folder deleted, since some packages may overlap | ||
|
|
||
| ```bash | ||
|
|
||
| # In humanoid repo: | ||
| cd autonomy/teleop | ||
| colcon build | ||
| source install/setup.bash | ||
| ros2 run rosbridge_listener rosbridge_listener_node | ||
|
|
||
| # Then, in another terminal: | ||
| cd autonomy | ||
| source install/setup.bash | ||
| ros2 launch rosbridge_server rosbridge_websocket_launch.xml | ||
|
|
||
| # In humanoid-server repo: | ||
| npm run dev | ||
| ``` | ||
|
|
||
| Then, connect to ws://localhost:3000 (default websocket url) and send an example hand pose message: | ||
| ``` | ||
| [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] | ||
| ``` | ||
| The message should appear in the terminal where you ran the rosbridge listener node | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| cmake_minimum_required(VERSION 3.8) | ||
| project(rosbridge_example) | ||
|
|
||
| if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") | ||
| add_compile_options(-Wall -Wextra -Wpedantic) | ||
| endif() | ||
|
|
||
| # find dependencies | ||
| find_package(ament_cmake REQUIRED) | ||
| find_package(rclcpp REQUIRED) | ||
| find_package(std_msgs REQUIRED) | ||
| find_package(sample_msgs REQUIRED) | ||
| # uncomment the following section in order to fill in | ||
| # further dependencies manually. | ||
| # find_package(<dependency> REQUIRED) | ||
|
|
||
| add_library(rosbridge_listener_lib src/rosbridge_listener_core.cpp) | ||
| add_library(rosbridge_publisher_lib src/rosbridge_publisher_core.cpp) | ||
|
|
||
| target_include_directories(rosbridge_listener_lib PUBLIC include) | ||
|
|
||
| add_executable(rosbridge_listener_node src/rosbridge_listener_node.cpp) | ||
| add_executable(rosbridge_publisher_node src/rosbridge_publisher_node.cpp) | ||
|
|
||
| ament_target_dependencies(rosbridge_listener_lib rclcpp std_msgs sample_msgs) | ||
| ament_target_dependencies(rosbridge_publisher_lib rclcpp std_msgs sample_msgs) | ||
|
|
||
| target_link_libraries(rosbridge_listener_node rosbridge_listener_lib) | ||
| target_link_libraries(rosbridge_publisher_node rosbridge_publisher_lib) | ||
|
|
||
| target_include_directories(rosbridge_listener_lib PUBLIC | ||
| $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | ||
| $<INSTALL_INTERFACE:include>) | ||
| target_include_directories(rosbridge_publisher_lib PUBLIC | ||
| $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | ||
| $<INSTALL_INTERFACE:include>) | ||
|
|
||
| target_compile_features(rosbridge_listener_node PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 | ||
| target_compile_features(rosbridge_publisher_node PUBLIC c_std_99 cxx_std_17) | ||
|
|
||
| install(TARGETS rosbridge_listener_node | ||
| DESTINATION lib/${PROJECT_NAME}) | ||
| install(TARGETS rosbridge_publisher_node | ||
| DESTINATION lib/${PROJECT_NAME}) | ||
|
|
||
| if(BUILD_TESTING) | ||
| find_package(ament_lint_auto REQUIRED) | ||
| # the following line skips the linter which checks for copyrights | ||
| # comment the line when a copyright and license is added to all source files | ||
| set(ament_cmake_copyright_FOUND TRUE) | ||
| # the following line skips cpplint (only works in a git repo) | ||
| # comment the line when this package is in a git repo and when | ||
| # a copyright and license is added to all source files | ||
| set(ament_cmake_cpplint_FOUND TRUE) | ||
| ament_lint_auto_find_test_dependencies() | ||
| endif() | ||
|
|
||
| install(DIRECTORY launch/ | ||
| DESTINATION share/${PROJECT_NAME}/launch) | ||
|
|
||
| ament_package() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| #ifndef ROSBRIDGE_LISTENER_NODE_HPP_ | ||
| #define ROSBRIDGE_LISTENER_NODE_HPP_ | ||
|
|
||
| #include "rclcpp/rclcpp.hpp" | ||
|
|
||
| #include "sample_msgs/msg/vr_hand_pose.hpp" | ||
|
|
||
| #include "rosbridge_listener_core.hpp" | ||
|
|
||
| /** | ||
| * Implementation of a ROS2 node that listens to the "unfiltered" and "filtered" | ||
| * topics and echoes the operating frequency of the topic to the console. | ||
| */ | ||
| class ROSbridgeListenerNode : public rclcpp::Node { | ||
| public: | ||
| ROSbridgeListenerNode(); | ||
|
|
||
| private: | ||
| std::string | ||
| hand_pose_to_string(const sample_msgs::msg::VRHandPose::SharedPtr pose); | ||
|
|
||
| void hand_pose_callback(const sample_msgs::msg::VRHandPose::SharedPtr msg); | ||
|
|
||
| rclcpp::Subscription<sample_msgs::msg::VRHandPose>::SharedPtr hand_pose_sub_; | ||
| }; | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| #ifndef ROSBRIDGE_PUBLISHER_CORE_HPP_ | ||
| #define ROSBRIDGE_PUBLISHER_CORE_HPP_ | ||
|
|
||
| #include "rclcpp/rclcpp.hpp" | ||
|
|
||
| #include "sample_msgs/msg/vr_hand_pose.hpp" | ||
|
|
||
| class ROSbridgePublisherCore { | ||
| public: | ||
| explicit ROSbridgePublisherCore(); | ||
|
|
||
| std::string hand_pose_to_string(const sample_msgs::msg::VRHandPose pose); | ||
|
|
||
| private: | ||
| }; | ||
|
|
||
| #endif // AGGREGATOR_CORE_HPP_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| #ifndef ROSBRIDGE_PUBLISHER_NODE_HPP_ | ||
| #define ROSBRIDGE_PUBLISHER_NODE_HPP_ | ||
|
|
||
| #include "rclcpp/rclcpp.hpp" | ||
|
|
||
| #include "sample_msgs/msg/vr_hand_pose.hpp" | ||
|
|
||
| #include "rosbridge_publisher_core.hpp" | ||
|
|
||
| /** | ||
| * Implementation of a ROS2 node that listens to the "unfiltered" and "filtered" | ||
| * topics and echoes the operating frequency of the topic to the console. | ||
| */ | ||
| class ROSbridgePublisherNode : public rclcpp::Node { | ||
| public: | ||
| ROSbridgePublisherNode(); | ||
|
|
||
| private: | ||
| void timer_callback(); | ||
|
|
||
| rclcpp::TimerBase::SharedPtr timer_; | ||
|
|
||
| rclcpp::Publisher<sample_msgs::msg::VRHandPose>::SharedPtr hand_pose_pub_; | ||
|
|
||
| ROSbridgePublisherCore rosbridge_publisher_; | ||
| }; | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| from launch import LaunchDescription | ||
| from launch_ros.actions import Node | ||
|
|
||
|
|
||
| def generate_launch_description(): | ||
| return LaunchDescription([ | ||
| Node( | ||
| package='rosbridge_example', | ||
| executable='rosbridge_listener_node', | ||
| ), | ||
| Node( | ||
| package='rosbridge_example', | ||
| executable='rosbridge_publisher_node', | ||
| ), | ||
| Node( | ||
| package='rosbridge_server', | ||
| executable='rosbridge_websocket', | ||
| name='rosbridge_websocket', | ||
| parameters=[{ | ||
| 'port': 9090, | ||
| 'address': '0.0.0.0' | ||
| }] | ||
| ) | ||
| ]) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| <?xml version="1.0"?> | ||
| <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> | ||
| <package format="3"> | ||
| <name>rosbridge_example</name> | ||
| <version>0.0.0</version> | ||
| <description>TODO: Package description</description> | ||
| <maintainer email="yichen@todo.todo">yichen</maintainer> | ||
| <license>TODO: License declaration</license> | ||
|
|
||
| <buildtool_depend>ament_cmake</buildtool_depend> | ||
|
|
||
| <depend>rclcpp</depend> | ||
| <depend>std_msgs</depend> | ||
| <depend>sample_msgs</depend> | ||
| <depend>rosbridge_server</depend> | ||
|
|
||
| <test_depend>ament_lint_auto</test_depend> | ||
| <test_depend>ament_lint_common</test_depend> | ||
|
|
||
| <export> | ||
| <build_type>ament_cmake</build_type> | ||
| </export> | ||
| </package> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| #include "rosbridge_listener_node.hpp" | ||
|
|
||
| #include <algorithm> | ||
| #include <string> | ||
|
|
||
| ROSbridgeListenerNode::ROSbridgeListenerNode() : Node("rosbridge_listener") { | ||
|
|
||
| hand_pose_sub_ = this->create_subscription<sample_msgs::msg::VRHandPose>( | ||
| "teleop", 10, | ||
| std::bind(&ROSbridgeListenerNode::hand_pose_callback, this, | ||
| std::placeholders::_1)); | ||
| } | ||
|
|
||
| std::string ROSbridgeListenerNode::hand_pose_to_string( | ||
| const sample_msgs::msg::VRHandPose::SharedPtr pose) { | ||
| std::string s; | ||
| std::vector<float> positions = pose->positions; | ||
| s += "["; | ||
| for (int i = 0; i < positions.size(); i++) { | ||
| s += std::to_string(positions[i]); | ||
| s += ","; | ||
| } | ||
| s += "]"; | ||
| return s; | ||
| } | ||
|
|
||
| void ROSbridgeListenerNode::hand_pose_callback( | ||
| const sample_msgs::msg::VRHandPose::SharedPtr msg) { | ||
| RCLCPP_INFO(this->get_logger(), "Received Hand Data: %s", | ||
| hand_pose_to_string(msg).c_str()); | ||
| } | ||
|
|
||
| int main(int argc, char **argv) { | ||
| rclcpp::init(argc, argv); | ||
| rclcpp::spin(std::make_shared<ROSbridgeListenerNode>()); | ||
| rclcpp::shutdown(); | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| #include <chrono> | ||
| #include <cmath> | ||
|
|
||
| #include "rosbridge_publisher_core.hpp" | ||
|
|
||
| ROSbridgePublisherCore::ROSbridgePublisherCore() {} | ||
|
|
||
| std::string ROSbridgePublisherCore::hand_pose_to_string( | ||
| const sample_msgs::msg::VRHandPose pose) { | ||
| std::string s; | ||
| std::vector<float> positions = pose.positions; | ||
| s += "["; | ||
| for (int i = 0; i < positions.size(); i++) { | ||
| s += std::to_string(positions[i]); | ||
| s += ","; | ||
| } | ||
| s += "]"; | ||
| return s; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| #include "rosbridge_publisher_node.hpp" | ||
|
|
||
| #include <chrono> | ||
| #include <memory> | ||
|
|
||
| using namespace std::chrono_literals; | ||
|
|
||
| ROSbridgePublisherNode::ROSbridgePublisherNode() | ||
| : Node("rosbridge_publisher"), | ||
| rosbridge_publisher_(ROSbridgePublisherCore()) { | ||
|
|
||
| hand_pose_pub_ = | ||
| this->create_publisher<sample_msgs::msg::VRHandPose>("teleop", 10); | ||
| timer_ = this->create_wall_timer( | ||
| 500ms, std::bind(&ROSbridgePublisherNode::timer_callback, this)); | ||
| } | ||
|
|
||
| void ROSbridgePublisherNode::timer_callback() { | ||
| auto message = sample_msgs::msg::VRHandPose(); | ||
| message.positions = std::vector<float>(17); | ||
| RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", | ||
| rosbridge_publisher_.hand_pose_to_string(message).c_str()); | ||
| hand_pose_pub_->publish(message); | ||
| } | ||
|
|
||
| int main(int argc, char **argv) { | ||
| rclcpp::init(argc, argv); | ||
| rclcpp::spin(std::make_shared<ROSbridgePublisherNode>()); | ||
| rclcpp::shutdown(); | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| float32[] positions | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can this be defined as positions for each finger joint ie:
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. also include which hand it is / if it detects both hands at the same time have this for both the left and right
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we have a curl metric right now, is this placeholder?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes, this is placeholder, i haven't put too much thought into the actual format yet current msg is just used to test websocket communication |
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
here could you explain the distinction between the listener and the publisher