Skip to content

Merge all robots eyes#27

Merged
17 commits merged intosktometometo:masterfrom
sawada10:merge-all-robots-eyes
Mar 4, 2025
Merged

Merge all robots eyes#27
17 commits merged intosktometometo:masterfrom
sawada10:merge-all-robots-eyes

Conversation

@sawada10
Copy link
Contributor

@sawada10 sawada10 commented Feb 7, 2025

変更点

感情ごとに作成していた関数の統一

  • 変更前
    • 目の表示・視線方向の切り替え・感情表現などを一つのクラス(Eye)で行なっていた。
    • 感情表現については、感情ごとに
      • 「その感情を画像を読み込む関数(ready_for_<name of emotion>_eye)」
      • 「その感情のまぶたのアニメーションやlcdへの描画を制御する関数(<name of emotion>)」
        を作成していた
  • 変更後:
    • クラスを二つに分けた:基本的な目の機能を司るクラスEyeManager(目の画像準備、視線方向、まぶた位置の決定),感情表現を司るクラスEmotionManager(目の画像セットの切り替え、まぶたのアニメーション)
    • 感情表現については、一つの関数set_emotion内で、eye_statusに基づいて、EyeManager内の機能を呼び出して、画像セットの変更やまぶたのアニメーション制御を行なうようにした。

@sawada10
Copy link
Contributor Author

@sktometometo

Thank you for your review. I apologize for the delay in addressing your feedback. Based on your suggestions, I have made the following changes. Please review them at your convenience.


1. Removed Unnecessary Functions


2. Split Functions to Simplify Responsibilities

  • Commit: 7401e52e87add63ca6b0fa2abb5d40dbfd035a8d

    • set_upperlid_position and set_gaze_direction in eye.hpp now only handle value assignments.
    • update function now performs pushSprite operations to reflect changes on lcd.
  • Commit: a8103449d65d285c11eeb6dcfc48f8a54270b1a6

    • set_emotion now only handles image configuration, while actual updates to upperlid position and images are managed by a separate function called emotion_update.
    • Animation frame management, which was previously handled in main.cpp, is now fully contained within eye.hpp.
    • Also, a bug related to frame handling was fixed in ba8c78b73e9f80f4c7ed88bb3004862d77450348.

3. Restructured File Organization


Please let me know if there are any further concerns or improvements needed.
Thank you for your valuable feedback🚀

Copy link
Owner

@sktometometo sktometometo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically, your updates look good to me except some points below.

constexpr EyeAsset sad_eye = {"/normal_kxr_eyeball.jpg", "/normal_kxr_iris.jpg", "/normal_kxr_pupil.png", "/normal_kxr_reflex.png", "/normal_kxr_upperlid_rdown.jpg"};
constexpr EyeAsset happy_eye = {"/normal_kxr_eyeball.jpg", "/white.jpg", "/white.png", "/white.png", "/normal_kxr_upperlid_happy.jpg"};

// EDIT HERE: eye_status(ROSトピックのメッセージ)と それぞれのEyeAssetの対応付け
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically, you should split definition and variable declaration because if you include the defintion, you will also declare the variable even when you don't want to use it.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend the structure like below.

  • eye_assets.hpp: definition of EyeAsset
  • eye.hpp: defintion of EyeManager with constructor which has eye_assets_map and upperlid_position_map as arguments.
  • emotion.hpp: definition of EmotionManager
  • main.cpp: declaration of eye_assets_map, upperlid_position_map and declaration of Eye instance with those variables.

@k-okada
Copy link
Contributor

k-okada commented Feb 25, 2025

金曜日にやっていた作業のひと段落まで行ったバージョンを https://github.com/k-okada/eye-display/commits/merge-all-robots-eyes-shinjo-merge/ に置きました。
1)文字列を読み込むのは、「やれば普通に動く by @sktometometo 」で、落ち着いて書くと動きました

  • rosserial_node.py を立ち上げても、マイコン側の setup 関数が呼ばれるわけではないので、マイコンの電源on/offのタイミングでないとgetParam が呼び出されない
  • StaticJsonDocument<2049> の値をいじると動いたり動かなかったり、あるいは、launchfile の中のリストを削ると動いたり。<2049>は大きい方が良くて、launchfileのリストも空白文字に見えて違う文字コードがあったのかな。。。
  • plan1, plan 2を作ってみました。感情の数が固定であればplan2でもよさそう。将来的に、というか既に増減が見込まれているならplan1の方が良いのか。

@sawada10 コード見るタイミングが来たら、一緒に続きをしましょう。

@sktometometo
Copy link
Owner

  • rosserial_node.py を立ち上げても、マイコン側の setup 関数が呼ばれるわけではないので、マイコンの電源on/offのタイミングでないとgetParam が呼び出されない

この件ですが、 https://github.com/sktometometo/elevator_operation/blob/c7d86af1c81d319219b78c51fd465a85a55cb67a/sketchbooks/elevator_status_core2/src/main.cpp#L75-L79 みたいに loop で毎周期 nh.connected() チェックしてROSの初期化走らせ直して挙げると マイコンつけっぱなしでも rosserial_node.py を立ち上げたタイミングで getParamしてくれます。

void loop()
{
  while (not nh.connected()) {
    delay(100);
    nh.spinOnce();
    nh.getParam(...); 
  }
  ...
}

みたいな感じです。

@sawada10 sawada10 force-pushed the merge-all-robots-eyes branch from 2cf7ec5 to 29189ea Compare February 27, 2025 04:48
@sawada10
Copy link
Contributor Author

3bdb2fb で、動いたがする

  • upperlid_positoin か、upperlid_default_pos をなくすか修正して、一通りアニメーションになるようにする
  • 使っていない関数をけずる。ready_for_xxx など
  • Merge all robots eyes #27 (comment) を考える。

@sawada10
Copy link
Contributor Author

sawada10 commented Feb 28, 2025

upperlid_positoin か、upperlid_default_pos をなくすか修正して、一通りアニメーションになるようにする

bc1a74d 一通りアニメーションができた気がする。

  • demo.launchのupperlid_positionの値を新城さんの値を参考に更新した
  • include/eye.hpp内のupperlid_default_pos_yの値を微調整した

(疑問メモ:
upperlidのspriteの座標の原点がなぜかずれている気がする。
他のspriteについては、左上(モニターの円に外接する正方形の左上の点)が原点だと思われる。
upperlidについては、upperlidのspriteにのみ行われているsetPivotの行をコメントアウトしたり、upperlidのdefaultの座標値の削除したりした(=他のspriteと同じ状況にした)とき、原点がさらに左上にずれた位置が原点になっていた。)

使っていない関数をけずる。ready_for_xxx など

c452329 efb26a8
再利用しなそうなコメントラインの削除・使っていない関数の削除を行なった

@sawada10
Copy link
Contributor Author

sawada10 commented Feb 28, 2025

0af478c 8b1cf88 normal_kxrの目(sample)に加えて、柏木さんの目に対応しました。
いまは基本的に以下の2つの対応で別のロボットの目を追加できるようになっているはずです。

  • rosserial/data以下に画像追加
  • roslaunchを書き換える

@a-ichikura @ayaha-n
くろみつと電電虫の目にも対応したいので、お時間があるときに、以下の対応していただけると大変助かります。
@heissereal のドローンに使っている目は、感情増えたり画像追加したりしてなさそう?だから、何もせずで大丈夫なはず)

0. kashiwagiをサポートできたレポジトリを持ってくる

cd /path/to/eye-display
git remote add sawada git@github.com:sawada10/eye-display.git
git fetch sawada
git checkout -b merge-all-robots-eyes-shinjo-merge sawada/merge-all-robots-eyes-shinjo-merge

1. 画像追加する
eye-display/rosserial_version/data 以下にそれぞれの目の画像データをおいてください。(png, jpg可)

※pupilとかについては、fillCircle関数で描画していたと思うのですが、今のバージョンでは描画関数を使わないで、全て画像を用いることにしました。なので、fillCircleなどで書いていた図形も画像として置いていただきたいです。
(ちなみにchatGPTで以下みたいなプロンプトを入れると描画関数から画像ファイルを作ってくれるので楽です。)

以下の139x139の画像を生成してください
色のついているところ以外は透過になっているpngファイルが良いです
image_height = 139, image_width = 139です
出力ファイル名:画像生成に関する指示 (lovyan gfxのfillcircle関数形式での指示)
kashiwagi_pupil.png :fillCircle(58, 58, 30, TFT_BLACK) |
kashiwagi_pupil_surprised.png : fillCircle(58, 58, 30, TFT_BLACK) |

2. launchファイルを書く
1c385b8 (bugfix: adc967c) denden.launchとkuromitsu.launchのテンプレを書いたので、kashiwagi.launchを参考に編集していただきたいです。
基本的には ①path_iris, pupil, reflex, upperlid の画像パスの追加 ②upperlid_positionの調整 の2つの作業で良いはずです。

3. テストする

cd rosserial_version
pio run -e stampc3
pio run -e stampc3 -t uploadfs --upload-port <port to device>
pio run -e stampc3 -t upload --upload-port <port to device>

で書き込んで、

cd /path/to/eye-display/launch/
roslaunch kuromitsu.launch # or roslaunch denden.launch

で立ち上げて、

rostopic pub -1 /eye_status std_msgs/UInt16 "data: 1" 

で目を変えて動作しているか確認お願いします。
※番号については、若干変わっていて、eye-display/msg/EyeSatus.msgを参考にしていただきたいです。
e.g., くろみつのshine1は、data: 11のはずです。

ここまで試して良さそうでしたら、
https://github.com/sawada10/eye-display/tree/merge-all-robots-eyes-shinjo-merge
にPRを出していただけると嬉しいです。
お願いします。

多分、説明不足 & 何かしら起こるような気がするのでそのときは聞いてください

@a-ichikura
Copy link
Contributor

a-ichikura commented Mar 1, 2025

とりあえず
・画像ファイルの追加
・launchファイルにpathを指定
までは行いました.

sawada10/eye-display@merge-all-robots-eyes-shinjo-merge...a-ichikura:eye-display:merge-all-robots-eyes-shinjo-merge

EyeStatus.msgのSHINE1が2つ定義されていたので修正しました。

しかし、

$ pio run -e stampc3
Processing stampc3 (platform: espressif32; framework: arduino; board: esp32dev)
--------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32dev.html
PLATFORM: Espressif 32 (6.10.0) > Espressif ESP32 Dev Module
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b 
 - tool-esptoolpy @ 1.40501.0 (4.5.1) 
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 36 compatible libraries
Scanning dependencies...
Dependency Graph
|-- LovyanGFX @ 1.2.0
|-- ArduinoJson @ 6.21.5
|-- ros_lib
|-- Wire @ 2.0.0
|-- SPIFFS @ 2.0.0
Building in release mode
Compiling .pio/build/stampc3/src/main.cpp.o
In file included from src/main.cpp:11:
include/emotion.hpp: In member function 'int EmotionManager::set_emotion(int)':
include/emotion.hpp:77:36: error: 'EYE_STATUS_SHINE1' is not a member of 'eye_display::EyeStatus'
       case eye_display::EyeStatus::EYE_STATUS_SHINE1:
                                    ^~~~~~~~~~~~~~~~~
include/emotion.hpp:80:36: error: 'EYE_STATUS_SHINE2' is not a member of 'eye_display::EyeStatus'
       case eye_display::EyeStatus::EYE_STATUS_SHINE2:
                                    ^~~~~~~~~~~~~~~~~
include/emotion.hpp:89:36: error: 'EYE_STATUS_SERIOUS' is not a member of 'eye_display::EyeStatus'
       case eye_display::EyeStatus::EYE_STATUS_SERIOUS:
                                    ^~~~~~~~~~~~~~~~~~
include/emotion.hpp:92:36: error: 'EYE_STATUS_REGRET1' is not a member of 'eye_display::EyeStatus'
       case eye_display::EyeStatus::EYE_STATUS_REGRET1:
                                    ^~~~~~~~~~~~~~~~~~
include/emotion.hpp:95:36: error: 'EYE_STATUS_REGRET2' is not a member of 'eye_display::EyeStatus'
       case eye_display::EyeStatus::EYE_STATUS_REGRET2:
                                    ^~~~~~~~~~~~~~~~~~
*** [.pio/build/stampc3/src/main.cpp.o] Error 1
======================================================== [FAILED] Took 4.25 seconds ========================================================

Environment    Status    Duration
-------------  --------  ------------
stampc3        FAILED    00:00:04.247
================================================== 1 failed, 0 succeeded in 00:00:04.247 ==================================================

というエラーになって、

catkin clean
catkin build

して EyeStatus.hの中身も確認しました。

$ cat EyeStatus.h 
// Generated by gencpp from file eye_display/EyeStatus.msg
// DO NOT EDIT!


#ifndef EYE_DISPLAY_MESSAGE_EYESTATUS_H
#define EYE_DISPLAY_MESSAGE_EYESTATUS_H


#include <string>
#include <vector>
#include <memory>

#include <ros/types.h>
#include <ros/serialization.h>
#include <ros/builtin_message_traits.h>
#include <ros/message_operations.h>


namespace eye_display
{
template <class ContainerAllocator>
struct EyeStatus_
{
  typedef EyeStatus_<ContainerAllocator> Type;

  EyeStatus_()
    {
    }
  EyeStatus_(const ContainerAllocator& _alloc)
    {
  (void)_alloc;
    }





// reducing the odds to have name collisions with Windows.h 
#if defined(_WIN32) && defined(EYE_STATUS_NORMAL)
  #undef EYE_STATUS_NORMAL
#endif
#if defined(_WIN32) && defined(EYE_STATUS_BLINK)
  #undef EYE_STATUS_BLINK
#endif
#if defined(_WIN32) && defined(EYE_STATUS_SURPRISED)
  #undef EYE_STATUS_SURPRISED
#endif
#if defined(_WIN32) && defined(EYE_STATUS_SLEEPY)
  #undef EYE_STATUS_SLEEPY
#endif
#if defined(_WIN32) && defined(EYE_STATUS_ANGRY)
  #undef EYE_STATUS_ANGRY
#endif
#if defined(_WIN32) && defined(EYE_STATUS_SAD)
  #undef EYE_STATUS_SAD
#endif
#if defined(_WIN32) && defined(EYE_STATUS_HAPPY)
  #undef EYE_STATUS_HAPPY
#endif
#if defined(_WIN32) && defined(EYE_STATUS_TROUBLED)
  #undef EYE_STATUS_TROUBLED
#endif
#if defined(_WIN32) && defined(EYE_STATUS_DELIGHTED)
  #undef EYE_STATUS_DELIGHTED
#endif
#if defined(_WIN32) && defined(EYE_STATUS_EXPECTING)
  #undef EYE_STATUS_EXPECTING
#endif
#if defined(_WIN32) && defined(EYE_STATUS_HEART)
  #undef EYE_STATUS_HEART
#endif
#if defined(_WIN32) && defined(EYE_STATUS_SHINE1)
  #undef EYE_STATUS_SHINE1
#endif
#if defined(_WIN32) && defined(EYE_STATUS_SHINE2)
  #undef EYE_STATUS_SHINE2
#endif
#if defined(_WIN32) && defined(EYE_STATUS_FLUSTRATED)
  #undef EYE_STATUS_FLUSTRATED
#endif
#if defined(_WIN32) && defined(EYE_STATUS_BORING)
  #undef EYE_STATUS_BORING
#endif
#if defined(_WIN32) && defined(EYE_STATUS_SERIOUS)
  #undef EYE_STATUS_SERIOUS
#endif
#if defined(_WIN32) && defined(EYE_STATUS_REGRET1)
  #undef EYE_STATUS_REGRET1
#endif
#if defined(_WIN32) && defined(EYE_STATUS_REGRET2)
  #undef EYE_STATUS_REGRET2
#endif

  enum {
    EYE_STATUS_NORMAL = 0u,
    EYE_STATUS_BLINK = 1u,
    EYE_STATUS_SURPRISED = 2u,
    EYE_STATUS_SLEEPY = 3u,
    EYE_STATUS_ANGRY = 4u,
    EYE_STATUS_SAD = 5u,
    EYE_STATUS_HAPPY = 6u,
    EYE_STATUS_TROUBLED = 7u,
    EYE_STATUS_DELIGHTED = 8u,
    EYE_STATUS_EXPECTING = 9u,
    EYE_STATUS_HEART = 10u,
    EYE_STATUS_SHINE1 = 11u,
    EYE_STATUS_SHINE2 = 12u,
    EYE_STATUS_FLUSTRATED = 13u,
    EYE_STATUS_BORING = 14u,
    EYE_STATUS_SERIOUS = 15u,
    EYE_STATUS_REGRET1 = 16u,
    EYE_STATUS_REGRET2 = 17u,
  };


  typedef boost::shared_ptr< ::eye_display::EyeStatus_<ContainerAllocator> > Ptr;
  typedef boost::shared_ptr< ::eye_display::EyeStatus_<ContainerAllocator> const> ConstPtr;

}; // struct EyeStatus_

typedef ::eye_display::EyeStatus_<std::allocator<void> > EyeStatus;

typedef boost::shared_ptr< ::eye_display::EyeStatus > EyeStatusPtr;
typedef boost::shared_ptr< ::eye_display::EyeStatus const> EyeStatusConstPtr;

// constants requiring out of line definition

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   



template<typename ContainerAllocator>
std::ostream& operator<<(std::ostream& s, const ::eye_display::EyeStatus_<ContainerAllocator> & v)
{
ros::message_operations::Printer< ::eye_display::EyeStatus_<ContainerAllocator> >::stream(s, "", v);
return s;
}


} // namespace eye_display

namespace ros
{
namespace message_traits
{





template <class ContainerAllocator>
struct IsMessage< ::eye_display::EyeStatus_<ContainerAllocator> >
  : TrueType
  { };

template <class ContainerAllocator>
struct IsMessage< ::eye_display::EyeStatus_<ContainerAllocator> const>
  : TrueType
  { };

template <class ContainerAllocator>
struct IsFixedSize< ::eye_display::EyeStatus_<ContainerAllocator> >
  : TrueType
  { };

template <class ContainerAllocator>
struct IsFixedSize< ::eye_display::EyeStatus_<ContainerAllocator> const>
  : TrueType
  { };

template <class ContainerAllocator>
struct HasHeader< ::eye_display::EyeStatus_<ContainerAllocator> >
  : FalseType
  { };

template <class ContainerAllocator>
struct HasHeader< ::eye_display::EyeStatus_<ContainerAllocator> const>
  : FalseType
  { };


template<class ContainerAllocator>
struct MD5Sum< ::eye_display::EyeStatus_<ContainerAllocator> >
{
  static const char* value()
  {
    return "42ee7f69b45515c113da121d157a4f78";
  }

  static const char* value(const ::eye_display::EyeStatus_<ContainerAllocator>&) { return value(); }
  static const uint64_t static_value1 = 0x42ee7f69b45515c1ULL;
  static const uint64_t static_value2 = 0x13da121d157a4f78ULL;
};

template<class ContainerAllocator>
struct DataType< ::eye_display::EyeStatus_<ContainerAllocator> >
{
  static const char* value()
  {
    return "eye_display/EyeStatus";
  }

  static const char* value(const ::eye_display::EyeStatus_<ContainerAllocator>&) { return value(); }
};

template<class ContainerAllocator>
struct Definition< ::eye_display::EyeStatus_<ContainerAllocator> >
{
  static const char* value()
  {
    return "uint16 EYE_STATUS_NORMAL=0\n"
"uint16 EYE_STATUS_BLINK=1\n"
"uint16 EYE_STATUS_SURPRISED=2\n"
"uint16 EYE_STATUS_SLEEPY=3\n"
"uint16 EYE_STATUS_ANGRY=4\n"
"uint16 EYE_STATUS_SAD=5\n"
"uint16 EYE_STATUS_HAPPY=6\n"
"uint16 EYE_STATUS_TROUBLED=7\n"
"uint16 EYE_STATUS_DELIGHTED=8\n"
"uint16 EYE_STATUS_EXPECTING=9\n"
"uint16 EYE_STATUS_HEART=10\n"
"uint16 EYE_STATUS_SHINE1=11\n"
"uint16 EYE_STATUS_SHINE2=12\n"
"uint16 EYE_STATUS_FLUSTRATED=13\n"
"uint16 EYE_STATUS_BORING=14\n"
"uint16 EYE_STATUS_SERIOUS=15\n"
"uint16 EYE_STATUS_REGRET1=16\n"
"uint16 EYE_STATUS_REGRET2=17\n"
"\n"
"\n"
;
  }

  static const char* value(const ::eye_display::EyeStatus_<ContainerAllocator>&) { return value(); }
};

} // namespace message_traits
} // namespace ros

namespace ros
{
namespace serialization
{

  template<class ContainerAllocator> struct Serializer< ::eye_display::EyeStatus_<ContainerAllocator> >
  {
    template<typename Stream, typename T> inline static void allInOne(Stream&, T)
    {}

    ROS_DECLARE_ALLINONE_SERIALIZER
  }; // struct EyeStatus_

} // namespace serialization
} // namespace ros

namespace ros
{
namespace message_operations
{

template<class ContainerAllocator>
struct Printer< ::eye_display::EyeStatus_<ContainerAllocator> >
{
  template<typename Stream> static void stream(Stream&, const std::string&, const ::eye_display::EyeStatus_<ContainerAllocator>&)
  {}
};

} // namespace message_operations
} // namespace ros

#endif // EYE_DISPLAY_MESSAGE_EYESTATUS_H

エラーは変わらない状態です…

@a-ichikura
Copy link
Contributor

上のEyeStatus.hは
/devel/include/eye_display/EyeStatus.h

$ find . -name "EyeStatus.h"
./lib/ros_lib/eye_display/EyeStatus.h

だったので

~/toshima_ws/src/eye_display/lib/ros_lib/eye_display$ cat EyeStatus.h 
#ifndef _ROS_eye_display_EyeStatus_h
#define _ROS_eye_display_EyeStatus_h

#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include "ros/msg.h"

namespace eye_display
{

  class EyeStatus : public ros::Msg
  {
    public:
      enum { EYE_STATUS_NORMAL = 0 };
      enum { EYE_STATUS_BLINK = 1 };
      enum { EYE_STATUS_SURPRISED = 2 };
      enum { EYE_STATUS_SLEEPY = 3 };
      enum { EYE_STATUS_ANGRY = 4 };
      enum { EYE_STATUS_SAD = 5 };
      enum { EYE_STATUS_HAPPY = 6 };
      enum { EYE_STATUS_TROUBLED = 7 };
      enum { EYE_STATUS_DELIGHTED = 8 };
      enum { EYE_STATUS_EXPECTING = 9 };
      enum { EYE_STATUS_HEART = 10 };
      enum { EYE_STATUS_SHINE = 11 };
      enum { EYE_STATUS_FLUSTRATED = 12 };
      enum { EYE_STATUS_BORING = 13 };

    EyeStatus()
    {
    }

    virtual int serialize(unsigned char *outbuffer) const override
    {
      int offset = 0;
      return offset;
    }

    virtual int deserialize(unsigned char *inbuffer) override
    {
      int offset = 0;
     return offset;
    }

    virtual const char * getType() override { return "eye_display/EyeStatus"; };
    virtual const char * getMD5() override { return "78f98b2a6b27818c86e9e651a10b9bef"; };

  };

}
#endif

で、参照先のEyeStatus.hに定義がなかったです。

というわけでとりあえず修正して
sawada10@e40227b
解決しました。

@a-ichikura
Copy link
Contributor


stamps3にくろみつのファイルをuploadしようとしたら、ファイルの容量が大きくて上げられないという以下のエラーになったので、

pio run -e stampc3 -t uploadfs --upload-port /dev/ttyACM0
Processing stampc3 (platform: espressif32; framework: arduino; board: esp32dev)
--------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via -v, --verbose option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32dev.html
PLATFORM: Espressif 32 (6.10.0) > Espressif ESP32 Dev Module
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b 
 - tool-esptoolpy @ 1.40501.0 (4.5.1) 
 - tool-mkfatfs @ 2.0.1 
 - tool-mklittlefs @ 1.203.210628 (2.3) 
 - tool-mkspiffs @ 2.230.0 (2.30) 
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 36 compatible libraries
Scanning dependencies...
Dependency Graph
|-- LovyanGFX @ 1.2.0
|-- ArduinoJson @ 6.21.5
|-- ros_lib
|-- Wire @ 2.0.0
|-- SPIFFS @ 2.0.0
Building in release mode
Building FS image from 'data' directory to .pio/build/stampc3/spiffs.bin
/normal_kxr_iris.jpg
/kuromitsu_reflex_normal.png
/kashiwagi_pupil_surprised.png
/kashiwagi_upperlid_ldown.png
/kashiwagi_happy.jpg
/kuromitsu_upperlid_troubled.png
SPIFFS_write error(-10010): unknown
error adding file!
*** [.pio/build/stampc3/spiffs.bin] Error 1
======================================================== [FAILED] Took 1.90 seconds ========================================================

Environment    Status    Duration
-------------  --------  ------------
stampc3        FAILED    00:00:01.904
================================================== 1 failed, 0 succeeded in 00:00:01.904 ==================================================

名前を短く(kuromitsu → krmt)にしました。

sawada10@fa7de4e

そしてlaunchまではできましたが、挙動が変(normalの目が表示されたり、reflexが表示されていなかったり…でよくわからなくなってしまったので(もしかしてEyeStatus.hを編集してしまったから?)これ以上いじるのはやめておきます…すみません。

@sktometometo
Copy link
Owner

@sawada10 @a-ichikura 反応おそくなってすいません。

ドキュメント作っていなくて申し訳ないんですが、今のrosserial_version スケッチで使っている EyeStatus.h のある lib/ros_lib/ 以下のファイルは rosrun rosserial_arduino make_libraries.py .自動生成されたファイルです。

catkin build eye_displaysource <path/to/catkin workspace>/devel/setup.bash したのちに
rosrun eye_display update_ros_lib.sh すると自動で lib/ros_lib/ 以下が更新されるので、msgを編集したのちに上の手順で更新してください。

@sktometometo
Copy link
Owner

あと、
https://github.com/sawada10/eye-display/tree/merge-all-robots-eyes-shinjo-merge
をmasterにマージできそうになったら教えて下さい。

一度マージしちゃってもいいかな

@sawada10
Copy link
Contributor Author

sawada10 commented Mar 4, 2025

@a-ichikura のくろみつの目の修正がなければ、
@ayaha-nのでんでんむしの目をlaunchやdataを足すだけで、あまり差分は出ないので、一度マージしていただいても大丈夫だと思います!

@a-ichikura
Copy link
Contributor

#27 (comment)

ごめんなさいおそくなりました
修正ありがとうございます。
動画確認しました。あっています。マージおねがいします。

@sktometometo sktometometo closed this pull request by merging all changes into sktometometo:master in 50cf7f4 Mar 4, 2025
@sktometometo
Copy link
Owner

sktometometo commented Mar 4, 2025

#29
でマージしました

変更がmasterに反映されたのでこちらも自動でcloseされてしまいました

@k-okada
Copy link
Contributor

k-okada commented Mar 5, 2025

@sawada10 に確認したい内容

  • とりあえず eye-display/rosserial_version 以下を見ている.eye-display/dataや eye-display/simple_version eye-display/sample_project は気になりつつも目をつぶる.
  • 画像データは eye-display/rosserial_version/data に追加している. eye-display/dataにkashiwagi があるが,触っていない
  • dendenはsurprised と sleepy の2モードだけ.

で,合っている?

@sawada10
Copy link
Contributor Author

sawada10 commented Mar 5, 2025

オフラインで先ほど話しましたが、一応コメントを残します。

とりあえず eye-display/rosserial_version 以下を見ている.eye-display/dataや eye-display/simple_version eye-display/sample_project は気になりつつも目をつぶる.
画像データは eye-display/rosserial_version/data に追加している. eye-display/dataにkashiwagi があるが,触っていない

この二つはどちらもyesです

dendenはsurprised と sleepy の2モードだけ.

これはNoで、8個?感情があると思います
https://github.com/ayaha-n/eye-display
あとで永田さんと一緒に作業してlaunchファイルを追加する予定です

@ayaha-n -> 市倉さんにやっていただいて、ちょっと丸投げで書いてもらうのは良くない気がしたので、今後時間あるタイミングで一緒に書きましょう)

@k-okada
Copy link
Contributor

k-okada commented Mar 12, 2025

@sawada10 #32 で少し直しました.大きな違いは,rostopic pub -1 /eye_display/eye_status std_msgs/String "data: blink" と文字で状態を指定するようにしました.node_scripts/pub_eye_status.py も参考にしてください.

またロボット毎の設定は
https://github.com/sktometometo/eye-display/blob/4550d6859cc58c0c10a516847c81eca9219f42fb/launch/kashiwagi.yaml
とyamlファイルをかいて
roslaunch eye_display demo.launch port:=/dev/ttyACM0 debug:=true eye_asset_file:=$(rospack find eye_display)/launch/kashiwagi.yaml とするようにしました.(本質的には違いはないです)
毎回引数を書くのが面倒なときは,
https://github.com/sktometometo/eye-display/blob/4550d6859cc58c0c10a516847c81eca9219f42fb/launch/kashiwagi.launch
みたいにファイルをつくります.
一回動かしてみて,原点がズレているとか動きがおかしいとか教えてくれると助かります.

これで, @ayaha-n @heissereal のロボットもyamlフィアルを追加すればよいはずです.

@iory I2Cのコードだけど, WireSlave.onReceive(receiveEvent); に入るとクラッシュするのですが,I2Cが繋がっていないとかあるんでしょうか?

@sktometometo main.cpp 読みやすくしたつもりですがどうでしょう..

@sktometometo
Copy link
Owner

sktometometo commented Mar 13, 2025

@k-okada ぱっと見いいかんじだと思います、2点気になるところがあります。

今現在の仕様だと、必要な画像データは全てSPIFFSに書き込まれている前提になっていると思うのですが、SPIFFSのサイズは制限があるので種類が増えていったときに全部は入れられないのでプロジェクト的にまとめられた方がいいかなという思いがあります。依然作った build.pysample_project はこれに基づいた試みなのですが、まだ足りない感じではあります。
=> プロジェクト的にyamlと使う画像ファイルまとめておいて、roslaunchで指定すると画像ファイルのrename&配置してのちにuploadfs 走らせて、アップロード終わってから serial_node.py を走らせるような roslaunch にすると、設定ファイルと画像ファイルのあるプロジェクトをPC側で編集すれば書き込みなおしを意識しなくても プロジェクトをroslaunchの引数で指定すると勝手にそのプロジェクト設定(設定ファイルと画像ファイル)に基づく目の動作ができる仕組みは作れそうです。

あと、(結局simple_versionでも完全には消せていないのですが)プリプロセッサディレクティブをメインロジック部(特にsetup(), loop()内)で多用するのは結局初心者にとって触りやすい通信部分を除いたEyeManagerクラスの機能のデモの用意という目的からは外れてしまう気がします。前にできると口にしてしまいましたが、どこかにこの問題は残ってしまいますね...

あとは本質的ではないのですが細かいところで...

  • yamlにJSONをstringで埋め込むよりは全部yamlにしてパーサー頑張って書いたほうが設定ファイルのメンテ性が良さそう。特にシンタックスハイライトがあれば気づくようなJSON部分のシンタックスエラーに基づくバグを避けられやすくなる。これは特にROS+rosserial+Arduinoシステムの初心者にとっては沼になりそう(結局どこで=シンタックスエラーが起きているのを知るには、動かない状態からシリアル通信でリセットがかかっているのを知り、そのうえでデバッガを使うなりprintデバッグするなりしてエラーを起こす該当箇所のソースコードを確認する必要があるため。)
    • パーサ部分でエラーが起きるなら ArduinoJSON部分ではなく nh.getParamでエラーが起きたほうが roslaunch のコンソール側にエラーが出てデバッグが roslaunch + rosparam だけで済んでわかりやすい。
  • グローバル変数(特にexternを使ってファイルをまたいだもの)はめちゃめちゃ見通しが悪くなる&初心者が触るときに構造をつかみづらいと思うので、多少のサイズが大きなコピーを許しても戻り値なりの値渡しとか、引数にパラメータを渡すなりをした方が個人的には好みです。

@sawada10
Copy link
Contributor Author

@k-okada 岡田先生
ありがとうございます。確認遅くなり申し訳ありません。
一応kashiwagi.yamlを引数に渡す形で動かしてみて原点などのズレはなさそうでした。

@sktometometo
Copy link
Owner

@sawada10 僕の環境で 79ca5c3 でstampc3で uploadfs & upload して roslaunch eye_display kashiwagi.launch port:=/dev/ttyACM0 debug:=true してから python node_scripts/pub_eye_status.py すると、以下のように出て png の画像が読み込めていないんですが、 @sawada10 の環境では置きませんか?

[DEBUG] [WallTime: 1742775318.341907] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: loading jpeg: /outline.jpg                                                               
[DEBUG] [WallTime: 1742775318.373097] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: loading jpeg: /kashiwagi_iris.jpg                                                        
[DEBUG] [WallTime: 1742775318.427912] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: loading png: /kashiwagi_pupil.png                                                        
[ERROR] [WallTime: 1742775318.430160] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: Failed to load /kashiwagi_pupil.png                                                      
[DEBUG] [WallTime: 1742775318.447555] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: loading png: /kashiwagi_reflex.png                                                       
[ERROR] [WallTime: 1742775318.449711] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: Failed to load /kashiwagi_reflex.png
[DEBUG] [WallTime: 1742775318.451781] [node:/eye_display] [func:SerialClient.handleLoggingRequest]: loading jpeg: /kashiwagi_upperlid.jpg

@sawada10
Copy link
Contributor Author

@sktometometo 返信遅くなりすみません
今確認したところ、私の環境でも、

  • stamps3 => png読み込めて問題なくうごく
  • stampc3 => pngが読み込めない
    という状況でした。
    s3 or c3の問題な気がします

@sktometometo
Copy link
Owner

ありがとうございます、こうなるとそもそもSPIFFSに全部ファイル乗り切っているのかが気になりますね....
ちょっと確認してみます。

@sktometometo
Copy link
Owner

メモ:

convert input.png -background white -flatten output.jpg でjpgに変換して読み込ませるとエラーは出ないので、ファイルの読み込み・展開時になにかエラーが出ていそう。

@sktometometo
Copy link
Owner

RAMの使用量に差がある?

@sktometometo
Copy link
Owner

sktometometo commented Apr 3, 2025

LovyanGFXのバージョンを 1.1.2 から 1.2.0 に挙げると解決する気がします
1.1.51.1.8でPng周りにバグフィックスがありそうなのでこれが関係していたのかも?

SPIFFSのパーティション設定をデフォルトにする( board_build.partitions = huge_app.csv を消した) のも有効かも

効いてない、やっぱりバグ出る

@sawada10
Copy link
Contributor Author

sawada10 commented Apr 7, 2025

今日、@ayaha-n さんと一緒にdendenの目を追加しようとしていました。
その過程で、うまく行かず、試行錯誤した結果、今のmasterの最新(c8ac004)でreadme通りに実行すると動かないことがわかりました。
やったこととエラーは以下のとおりです。なお、stamps3で実行しています。

  1. 環境構築
git clone git@github.com:sktometometo/eye-display.git
rosdep install --from-paths . --ignore-src -y -r
catkin build eye_display
source ~/catkin_ws/devel/setup.bash
  1. マイコンに書き込み
cd ~/catkin_ws/eye_display/rosserial_version
rosrun eye_display build.py ./sample.yaml --env stamps3 --port /dev/ttyACM0
  1. 実行
roslaunch eye_display demo.launch port:=/dev/ttyACM0

以下のようなエラーが出ます。

~/catkin_ws/src/eye-display/sample_project$ roslaunch eye_display demo.launch port:=/dev/ttyACM0
... logging to /home/leus/.ros/log/fe7d7a8c-139f-11f0-a261-a555d17b0ae2/roslaunch-leus-ThinkPad-T480s-14649.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://leus-ThinkPad-T480s:40207/

SUMMARY
========

PARAMETERS
 * /eye_display/baud: 57600
 * /eye_display/direction: 1
 * /eye_display/eye_asset/angry/path_iris: /iris.jpg
 * /eye_display/eye_asset/angry/path_outline: /outline.jpg
 * /eye_display/eye_asset/angry/path_pupil: /pupil.jpg
 * /eye_display/eye_asset/angry/path_reflex: /reflex.jpg
 * /eye_display/eye_asset/angry/path_upperlid: /upperlid.jpg
 * /eye_display/eye_asset/angry/upperlid_default_pos_x: 50
 * /eye_display/eye_asset/angry/upperlid_default_pos_y: 40
 * /eye_display/eye_asset/angry/upperlid_default_theta: -30
 * /eye_display/eye_asset/angry/upperlid_position: [0]
 * /eye_display/eye_asset/blink/path_iris: /iris.jpg
 * /eye_display/eye_asset/blink/path_outline: /outline.jpg
 * /eye_display/eye_asset/blink/path_pupil: /pupil.jpg
 * /eye_display/eye_asset/blink/path_reflex: /reflex.jpg
 * /eye_display/eye_asset/blink/path_upperlid: /upperlid.jpg
 * /eye_display/eye_asset/blink/upperlid_default_pos_x: 75
 * /eye_display/eye_asset/blink/upperlid_default_pos_y: 7
 * /eye_display/eye_asset/blink/upperlid_default_theta: 0
 * /eye_display/eye_asset/blink/upperlid_position: [9, 9, 130, 130, ...
 * /eye_display/eye_asset/happy/path_iris: /white.jpg
 * /eye_display/eye_asset/happy/path_outline: /outline.jpg
 * /eye_display/eye_asset/happy/path_pupil: /white.jpg
 * /eye_display/eye_asset/happy/path_reflex: /white.jpg
 * /eye_display/eye_asset/happy/path_upperlid: /reflex_happy.jpg
 * /eye_display/eye_asset/happy/upperlid_default_pos_x: 75
 * /eye_display/eye_asset/happy/upperlid_default_pos_y: 7
 * /eye_display/eye_asset/happy/upperlid_default_theta: 0
 * /eye_display/eye_asset/happy/upperlid_position: [130, 131, 132, 1...
 * /eye_display/eye_asset/names: ['normal', 'blink...
 * /eye_display/eye_asset/normal/path_iris: /iris.jpg
 * /eye_display/eye_asset/normal/path_outline: /outline.jpg
 * /eye_display/eye_asset/normal/path_pupil: /pupil.jpg
 * /eye_display/eye_asset/normal/path_reflex: /reflex.jpg
 * /eye_display/eye_asset/normal/path_upperlid: /upperlid.jpg
 * /eye_display/eye_asset/normal/upperlid_default_pos_x: 75
 * /eye_display/eye_asset/normal/upperlid_default_pos_y: 7
 * /eye_display/eye_asset/normal/upperlid_default_theta: 0
 * /eye_display/eye_asset/normal/upperlid_position: [9]
 * /eye_display/eye_asset/sad/path_iris: /iris.jpg
 * /eye_display/eye_asset/sad/path_outline: /outline.jpg
 * /eye_display/eye_asset/sad/path_pupil: /pupil.jpg
 * /eye_display/eye_asset/sad/path_reflex: /reflex.jpg
 * /eye_display/eye_asset/sad/path_upperlid: /upperlid.jpg
 * /eye_display/eye_asset/sad/upperlid_default_pos_x: 100
 * /eye_display/eye_asset/sad/upperlid_default_pos_y: 40
 * /eye_display/eye_asset/sad/upperlid_default_theta: 30
 * /eye_display/eye_asset/sad/upperlid_position: [0]
 * /eye_display/eye_asset/sleepy/path_iris: /iris.jpg
 * /eye_display/eye_asset/sleepy/path_outline: /outline.jpg
 * /eye_display/eye_asset/sleepy/path_pupil: /pupil.jpg
 * /eye_display/eye_asset/sleepy/path_reflex: /reflex.jpg
 * /eye_display/eye_asset/sleepy/path_upperlid: /upperlid.jpg
 * /eye_display/eye_asset/sleepy/upperlid_default_pos_x: 75
 * /eye_display/eye_asset/sleepy/upperlid_default_pos_y: 8
 * /eye_display/eye_asset/sleepy/upperlid_default_theta: 0
 * /eye_display/eye_asset/sleepy/upperlid_position: [60, 60, 70, 130,...
 * /eye_display/eye_asset/surprised/path_iris: /iris_surprised.jpg
 * /eye_display/eye_asset/surprised/path_outline: /outline.jpg
 * /eye_display/eye_asset/surprised/path_pupil: /pupil_surprised.jpg
 * /eye_display/eye_asset/surprised/path_reflex: /reflex_surprised...
 * /eye_display/eye_asset/surprised/path_upperlid: /upperlid.jpg
 * /eye_display/eye_asset/surprised/upperlid_default_pos_x: 75
 * /eye_display/eye_asset/surprised/upperlid_default_pos_y: 8
 * /eye_display/eye_asset/surprised/upperlid_default_theta: 0
 * /eye_display/eye_asset/surprised/upperlid_position: [9, 9, 9, 9, 130,...
 * /eye_display/mode_right: True
 * /eye_display/port: /dev/ttyACM0
 * /rosdistro: noetic
 * /rosversion: 1.16.0

NODES
  /
    eye_display (rosserial_python/serial_node.py)

auto-starting new master
process[master]: started with pid [14657]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to fe7d7a8c-139f-11f0-a261-a555d17b0ae2
process[rosout-1]: started with pid [14668]
started core service [/rosout]
process[eye_display-2]: started with pid [14675]
[INFO] [1744023835.289514]: ROS Serial Python Node
[INFO] [1744023835.293984]: Connecting to /dev/ttyACM0 at 57600 baud
[INFO] [1744023837.398930]: Requesting topics...
[ERROR] [1744023852.405667]: Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino
[INFO] [1744023852.410626]: Requesting topics...
[ERROR] [1744023867.415760]: Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino
[INFO] [1744023867.417922]: Requesting topics...

baud rateが原因かと思ったのですが、前回動いたときと今回のエラーが出たとき両方とも57600で動かしていたので、baud rateのせいではなさそうでした。(試しにplatformio.iniのほうを見ると115200になっていたので、launchもそれに合わせて115200に変更するなどしましたが、状況は変わりませんでした。)

次に、USBケーブルのせいかと思い、M5stack純正のUSBケーブルに変更しましたが、同様のエラーが出ました。

@sktometometo さんのお手元でも同様の状況でしょうか?

k-okada added a commit to jsk-ros-pkg/jsk_3rdparty that referenced this pull request Apr 8, 2025
k-okada added a commit to jsk-ros-pkg/jsk_3rdparty that referenced this pull request Apr 8, 2025
k-okada added a commit to jsk-ros-pkg/jsk_3rdparty that referenced this pull request Apr 8, 2025
@k-okada
Copy link
Contributor

k-okada commented Apr 8, 2025

@sawada10 これは信じられないほど申し訳ないんだけど,
k-okada@a95d8cc#diff-702a2384560f32a83c4961110086f45bf65a84d96e44d4ee53ed2d115b4a00e0R49-R52
で,rosserial_project でrosserial したかったら,pio run -e stampc3' ではなく pio run -e stumpc3-ros とする,逆にpip run -e stampc3` とすると,いままでのsimple_project と同じ挙動(I2CもROSも通信なし),という風にしていました.
たとえ,リーズナブルでそのほうが良さそうという変更でも後方互換性を壊しては行けない,と言ってきたはずですが.

ということで,ついでなので,jsk_3rdparty に入れて,
jsk-ros-pkg/jsk_3rdparty#522
を作りました.

jsk_3rdparty は色々ファイルがあって見づらい場合もありますが,新し目のgitをつかうと,
https://github.com/jsk-ros-pkg/jsk_3rdparty/blob/964dce2eb695098b1484548c82d8454c4ed170d9/eye_display/README.md#how-to-clone-only-this-package
みたいにして,eye_display だけを持ってくることが出来ます.という風に,新しい機能を使い出すのも,ゼッタイにダメ,という進め方の一つではあります.

@sawada10
Copy link
Contributor Author

sawada10 commented Apr 8, 2025

@k-okada 先生
ご返信ありがとうございます。(先程、オフラインで見ていただきましたが一応書いておきます)
jsk_3rdpartyのeye_displayのpkgを持ってきて、pio run -e stamps3-rosで動くことが確認できました。(kashiwagi.launchの立ち上げ形式でもdemo.launch + yaml指定形式でも動きました)
@ayaha-n 時間あるときにでんでんむしのリトライしましょう)

@ayaha-n
Copy link

ayaha-n commented Apr 9, 2025

@sawada10 さんと電伝虫の目を表示できることを確認しました.
プルリクも出しました.
jsk-ros-pkg/jsk_3rdparty#524

ただ,目の表示方向に関する不思議な現象を観測したのでご報告します.

  • launchしたときに,抜き差しした後の1回目は,direction=0の方向で画像が表示される
  • 2回目以降のlaunchでは,launchファイルの引数で与えたdirectionに沿った方向で表示される
    • ただし,demo.launchのdirection=2,kashiwagi.launchのdirection=1のときに,kashiwagi.launchを2回行うと,direction=0の方向で表示される場合があった(1件のみ)

@k-okada
Copy link
Contributor

k-okada commented Apr 11, 2025

@ayaha-n

launchしたときに,抜き差しした後の1回目は,direction=0の方向で画像が表示される

は,https://github.com/ayaha-n/jsk_3rdparty/pull/2 でなおったとおもいます.`pio run -e stamps3-ros pio run -e stamps3-ros -t upload --upload-port /dev/ttyACM0` コンパイル,書き込み,して確認出来るとおもいます.

demo.launchのdirection=2,kashiwagi.launchのdirection=1のときに,kashiwagi.launchを2回行うと,direction=0の方向で表示される場合があった(1件のみ)

kashiwagi.launchを2回行う はdirection引数を付けずに,ということでしょうか?direction 引数を付けないと,デフォルト値になるかとおもいます.demo/kashiwagi は1, dendenは0 何れの場合も次の起こったログを確認してみてください.
通常は

https://gist.github.com/k-okada/3e8da1f2d4805f4a4294328ccd9706ff#file-gistfile1-txt-L104-L109

[INFO] [1744338905.632133] Setup subscriber on ~look_at [geometry_msgs/Point]
[INFO] [1744338905.636608] Setup subscriber on ~eye_status [std_msgs/String]
[INFO] [1744338907.075139] Setup eye asset
[INFO] [1744338907.092598] Read rosparam : mode_right is true
[INFO] [1744338907.112756] Read rosparam : direction is 2
[INFO] [1744338907.123426] ~eye_asset/names[0]: neutral

みたいにsetup eye asset と表示して,direction も教えてくれるようにしました.ただ,時々
https://gist.github.com/k-okada/3e8da1f2d4805f4a4294328ccd9706ff#file-ng-L232-L236

[INFO] [1744338793.129300] Setup subscriber on ~look_at [geometry_msgs/Point]
[INFO] [1744338793.133528] Setup subscriber on ~eye_status [std_msgs/String]
[INFO] [1744338793.136011] Eye status: neutral (49)
[INFO] [1744338793.205185] Eye status: neutral (50)
[INFO] [1744338793.338694] Eye status: neutral (51)

みたいに,subscriberはセットされているけど,rosparam は読んでい内容に見えることがあります.
ayaha-n/jsk_3rdparty@ecc63e7
で,0.5秒まって,よくなった気がしていますが,おまじないレベルかもしれないです.

次に発生したら,同じようにログを貼り付けてみて下さい.

@ayaha-n
Copy link

ayaha-n commented Apr 11, 2025

ありがとうございます.
私が確認した範囲では大丈夫そうでした.

kashiwagi.launchを2回行う はdirection引数を付けずに,ということでしょうか?direction 引数を付けないと,デフォルト値になるかとおもいます.demo/kashiwagi は1, dendenは0 何れの場合も次の起こったログを確認してみてください.

こちらはdirection引数を付けずにlaunchしていましたが,kashiwagiでdefault=1なのに,一回目のlaunchでは0の方向になってしまっていました,という報告でした(今は改善しました).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants