Giter VIP home page Giter VIP logo

ros2mbed's Introduction

ros2mbed

mbed library for communicating with ROS2

ROS2 Version

ROS 2 Dashing Diademata

Micro-XRCE-DDS-Agent Version

v1.3.0

$ git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
$ cd Micro-XRCE-DDS-Agent && git checkout v1.3.0
$ mkdir build && cd build
$ source /opt/ros/dashing/setup.bash # to share libraries with ros2
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig /usr/local/lib/

Network setting(for Ubuntu)

UDP通信を使う場合
IPv4
method: Manual
Address: 任意のAddress, Netmask, Gateway

IPv6 method: Link-Local Only

How to use

UDP

ros2mbed内のuser_config.hのUSER_TRANSPORT_TYPEは0にしておく

#define USER_TRANSPORT_TYPE 0

コンパイルしてmbedに書き込む

ターミナルで以下を実行

~/Micro-XRCE-DDS-Agent/build$ ./MicroXRCEAgent udp4 -p 2018

Serial

ros2mbed内のuser_config.hのUSER_TRANSPORT_TYPEは2にしておく

#define USER_TRANSPORT_TYPE 2

コンパイルしてmbedに書き込む

ターミナルで以下を実行

~/Micro-XRCE-DDS-Agent/build$ ./MicroXRCEAgent serial --dev /dev/ttyACM0 -b 115200

Example

mbedに以下を書き込んでおく

/*
for UDP config
mbed_app.json

{
    "target_overrides": {
        "*": {
            "platform.stdio-convert-newlines": true,
            "target.network-default-interface-type": "ETHERNET"
        }
    }
}
*/

#include "mbed.h"
#include "ros2mbed.h"
#include "subscription.hpp"
#if USER_TRANSPORT_TYPE == 0 || USER_TRANSPORT_TYPE == 1
#include "EthernetInterface.h"
#endif 

#include <string>

DigitalOut led(LED1);

class SamplePub : public ros2::Node
{
public:
    SamplePub()
    : Node("sample_node"), count_(0)
    {
        pub_ = this->create_publisher<std_msgs::String>("string_pub");

        sub_ = this->create_subscription<std_msgs::Bool>(
            "led_sub",
            [&](std::shared_ptr<std_msgs::Bool> msg)
            {
                led = msg->data;
            });

        timer_ = this->create_wall_timer(
            500ms,
            [&](){
                auto msg = std::make_shared<std_msgs::String>();
                msg->data = "Hello ros2mbed! " + std::to_string(count_++);
                pub_->publish(msg);
            });
    }

private:
    int count_;
    ros2::Publisher<std_msgs::String>::SharedPtr pub_;
    ros2::Subscription<std_msgs::Bool>::SharedPtr sub_;
    
    ros2::TimerBase::SharedPtr timer_;
};


int main()
{
    led = 1;
#if USER_TRANSPORT_TYPE == 0 || USER_TRANSPORT_TYPE == 1
    EthernetInterface net;
    ros2::init(&net, "192.168.2.101", 2018);
#endif 

#if USER_TRANSPORT_TYPE == 2
    BufferedSerial pc(USBTX, USBRX, 115200);
    ros2::init(&pc);
#endif

    SamplePub sample_node;
    ros2::spin(&sample_node);
}

MicroXRCEAgentを起動させて接続する
接続されると以下のように表示される

$ ~/Micro-XRCE-DDS-Agent/build$ ./MicroXRCEAgent serial --dev /dev/ttyACM0 -b 115200
Press CTRL+C to exit
[1609143777.121211] info     | TermiosAgentLinux.cpp | init                     | running...             | fd: 3
[1609143822.997434] info     | Root.cpp           | create_client            | create                 | client_key: 0xAABBCCDD, session_id: 0x81
[1609143822.997504] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x2864434397, address: 0

mbed->ros

MicroXRCEAgentを接続したターミナルとは別のターミナルを起動させ、以下を実行

$ ros2 topic echo string_pub

mbedから文字列が送られてくる

data: Hello ros2mbed! 10
---
data: Hello ros2mbed! 11
---
data: Hello ros2mbed! 12
---
data: Hello ros2mbed! 13
---
data: Hello ros2mbed! 14
---
data: Hello ros2mbed! 15
---
data: Hello ros2mbed! 16
---
data: Hello ros2mbed! 17
---
data: Hello ros2mbed! 18

ros->mbed

MicroXRCEAgentを接続したターミナルとは別のターミナルを起動させ、以下を実行 mbedのledをONにする

$ ros2 topic pub --once /led_sub std_msgs/Bool '{data: True}'

mbedのledをOFFにする

$ ros2 topic pub --once /led_sub std_msgs/Bool '{data: False}'

ros2mbed's People

Contributors

kotakku avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

lycanthought

ros2mbed's Issues

UDPが止まる

ソケットのタイムアウトを設定するとタイムアウトを発生させてデータを受け取らない

NetworkInterface初期化処理のsleepの除去

NetworkInterfaceの初期化で5sのsleepを入れている(これがないと動かない)
これを削除する

connect処理がブロッキングされない?
sleepを入れないと接続が確立する前にROS2との接続処理に入り接続失敗になる

rqt_graph対応

rqt_graphを起動しようとするとmbedのノードのGUIDが取れなくて起動しない

[ERROR] [rmw_fastrtps_shared_cpp]: Unable to find GUID for node: ros2stb_gateway
PluginManager._load_plugin() could not load plugin "rqt_graph/RosGraph":

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.