下載安裝官方的ros1_bridge package
文件顯示從source code 自己build 需要系統有4 GB 的RAM
sudo apt-get update
sudo apt-get install ros-ardent-ros1-bridge
|
先開一個terminal 啟動roscore
再開第二個terminal 啟動bridge,讓他連到roscore
export ROS_MASTER_URI=http: //localhost :11311
ros2 run ros1_bridge dynamic_bridge
|
再開兩個terminal 分別啟動ROS 及ROS 2 的node,就可以測試連通性了
ros2 run demo_nodes_cpp talker
rosrun roscpp_tutorials listener
|
底下的source code,示範將ROS 的msg 轉丟到ROS 2 上( ROS 2 sub 可以收到ROS pub 的topic )
處理方式是在callback function 內將ROS 的msg sample copy 塞到ROS 2 的msg sample
此處的package name 在ROS 及ROS 2 剛好都叫 beginner_tutorials ,可以不一樣
#include <iostream>
#include <memory>
#ifdef __clang__
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunused-parameter"
#endif
#include "ros/ros.h"
#include "beginner_tutorials/Daq.h"
#ifdef __clang__
# pragma clang diagnostic pop
#endif
#include "rclcpp/rclcpp.hpp"
#include "beginner_tutorials/msg/daq.hpp"
rclcpp::Publisher<beginner_tutorials::msg::Daq>::SharedPtr pub;
void callback( const beginner_tutorials::Daq::ConstPtr & ros1_msg)
{
std::cout << "I heard: [" << ros1_msg->length << "]" << std::endl;
auto ros2_msg = std::make_shared<beginner_tutorials::msg::Daq>();
ros2_msg->length = ros1_msg->length;
for ( int i=0;i<ros1_msg->length;i++)
ros2_msg->data.push_back(ros1_msg->data[i]);
pub->publish(ros2_msg);
}
int main( int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared( "bridger2" );
pub = node->create_publisher<beginner_tutorials::msg::Daq>( "test" );
ros::init(argc, argv, "bridger1" );
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe( "test" , 10, callback);
ros::spin();
return 0;
}
|
建置步驟
我是用ROS 2的ament 建置,所以檔案要放到ROS 2 的workspace 內
需要先gen 出ROS 2 的msg header file
修改cmake file,再底下加入如下內容
include_directories(include /opt/ros/kinetic/include )
add_executable(bridge src /bridge .cpp)
target_link_libraries(bridge /opt/ros/kinetic/lib/libroscpp .so)
target_link_libraries(bridge /opt/ros/kinetic/lib/librosconsole .so)
target_link_libraries(bridge /opt/ros/kinetic/lib/libroscpp_serialization .so)
ament_target_dependencies(bridge rclcpp beginner_tutorials )
install (TARGETS bridge DESTINATION lib/${PROJECT_NAME})
|
要做到以下三件事情
- include ROS header
- link ROS library
- include ROS msg header ( 程式碼的這行#include "beginner_tutorials/Daq.h" )
- 因為我將Daq.h 放到ROS 2 的workspace 所以不用寫到cmake file 內了
啟動步驟跟用官方的一樣
沒有留言:
張貼留言