Kria Robotics Stack(ROS2の動作確認方法について)
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