🐡

Kria Robotics Stack(ROS2の動作確認方法について)

2022/03/20に公開

1.はじめに

今回はROS2を開発するにあたり、「シミュレーション」、「エミュレーション」、「実機」と抽象度の異なる環境における動作確認方法について見ていきたいと思います。

2.使用するプログラム

今回はpublisher_xilinxを使って各ターゲットでの開発手法を見ていきたいと思います。
以下がpublisher_xilinxのコードになります。

#include <chrono>
#include <functional>
#include <memory>
#include <string>

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

using namespace std::chrono_literals;

/* This example creates a subclass of Node and uses std::bind() to register a
* member function as a callback from the timer. */

class MinimalPublisher : public rclcpp::Node
{
public:
MinimalPublisher()
: Node("minimal_publisher"), count_(0)
{
    publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
    timer_ = this->create_wall_timer(
    500ms, std::bind(&MinimalPublisher::timer_callback, this));
}

private:
void timer_callback()
{
    auto message = std_msgs::msg::String();
    message.data = "Hello, Xilinx! " + std::to_string(count_++);
    RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
    publisher_->publish(message);
}
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;
}

3.シミュレーションによる動作確認方法

Ubunt上でコーディングしたROS2プログラムをUbuntu上で動作させる方法について確認します。

KRSをビルドするとpublisher_xilinxもCMakeList.txtの設定でビルドされます。

add_executable(member_function_publisher member_function_publisher.cpp)
ament_target_dependencies(member_function_publisher rclcpp std_msgs)

install(TARGETS
  member_function_publisher
  DESTINATION lib/${PROJECT_NAME}
)

この時点ではUbuntuをターゲットとしてpublisher_xilinxがビルドされているので、Ubutu上で実行させて動作を確認することができます。

$ source install/setup.bash
$ ros2 run publisher_xilinx member_function_publisher

4.ターゲットデバイス(kv260)による動作確認方法

次に、ZynqなどのARM搭載FPGA上でpublisher_xilinxを動作させます。

クロスコンパイル先のターゲット(kv260)のファームウエアを選択します。

$ colcon acceleration select kv260

ファームウエアが正しく選択されているか確認するコマンドも準備されています。

$ colcon acceleration list
kv260*

選択したターゲット向けにパッケージをビルドします。

$ colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select publisher_xilinx

PetaLinuxのRootFs、Kernelと一緒にROS2をパッケージングしてイメージファイルを生成します。

$ colcon acceleration linux vanilla --install-dir install-kv260

生成したイメージファイル/krs_ws/acceleration/firmware/kv260/sd_card.imgをEtcherを使ってSDカードに書き込みます。
SDカードをkv260ボードに差し込み電源を入れると以下のプロンプトがターミナルソフトに表示されるのでuser=petalinuxでパスワードを適当に設定してログインします。

PetaLinux 2020.2.2 xilinx-k26-starterkit-2020_2.2 ttyPS0
xilinx-k26-starterkit-2020_2 login:

ターミナルソフトからROS2パッケージを起動します。

$ source /usr/bin/ros_setup.bash
$ . /krs_ws/local_setup.bash
$ ros2 run publisher_xilinx member_function_publisher

ターミナルソフトに実行結果が表示されます。

5.シミュレーションによる動作確認方法

ターゲットデバイス(kv260)が無い場合、QEmuを使ったエミュレーション動作確認ができます。

QEmu環境を使うため、Xilinxの環境を読み込みます。

$ source /tools/Xilinx/Vitis/2021.2/settings64.sh

クロスコンパイル先のターゲット(kv260)のファームウエアを選択します。

$ source install/setup.bash
$ colcon acceleration select kv260

選択したターゲット向けにパッケージをビルドします。

$ colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select publisher_xilinx

SDカードのイメージファイルを生成します。

$ colcon acceleration linux vanilla

エミュレーションを実行します。

$ colcon acceleration emulation sw_emu install-kv260

結果は以下の通り、QEmuがExitしてしまいます。ベータ版なのでまだきちんと動作保証がされていないようです。

6.おわりに

今回は「シミュレーション」、「エミュレーション」、「実機」におけるROS2プログラムの動作確認方法について見てみました。ベータ版という事でエミュレーションは上手く動作しませんでしたが、シミュレーションと実機は動作するので、この二つをうまく使い分ける事で、デバッグ・動作確認は進められるのではないでしょうか。

Discussion