Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Euslispでyaml形式のファイルを読み書きしたい #709

Open
Kanazawanaoaki opened this issue Apr 30, 2022 · 6 comments
Open

Euslispでyaml形式のファイルを読み書きしたい #709

Kanazawanaoaki opened this issue Apr 30, 2022 · 6 comments

Comments

@Kanazawanaoaki
Copy link

Euslispでyaml形式のファイルを読み書きするための関数や読み書きしている例はありますでしょうか?

pythoncommon lispの例はあるみたいなのでそれらを参考にして作るか,使いたいyamlファイルの形式などがある程度決まっている場合は自分でparserを作るというのも有り得そうです.

また,読み込むだけならrosparamとして渡すという作戦が有効そうかなと思っています.

因みにjsonの例はjsk_roseus/roseus_mongo/euslisp/json/にあるようです.

@Affonso-Gui
Copy link
Member

Affonso-Gui commented May 1, 2022

As far as I know the closest thing we have to a yaml utility in euslisp is the rosparam interface.

You could try to couple set/get param with (unix:system "rosparam load/dump ...") calls, or write a simple encoder /decoder and maybe add it to the euslib or roseus-utils.

Here is a start:

(defun alistp (alist)
  (and (listp alist) (every #'consp alist)))

(defun format-alist (lst output-stream &optional (lvl 0))
  (dolist (l lst)
    (let ((name (car l))
          (val (cdr l)))
      (spaces (* 2 lvl) output-stream)
      (format output-stream "~a: " name)
      (if (alistp val)
          (progn
            (terpri output-stream)
            (format-alist val output-stream (1+ lvl)))
        (if (listp val)
            (dolist (v val)
              (terpri output-stream)
              (spaces (* 2 (1+ lvl)) output-stream)
              (format output-stream "- ~A" v))
          (print val output-stream))))))

(defun dump-param (name output-stream)
  (format-alist (acons name (ros::get-param name) nil) output-stream))

;; (dump-param "myparam" t)

@Kanazawanaoaki
Copy link
Author

Kanazawanaoaki commented May 12, 2022

Thank you very much.
I confirmed that I can load and dump yaml with known format from euslisp (to be exact, roseus?) that I wanted to do.

I feel that simple encoder/decoder can be implemented relatively easily if we use rosparam, so I'll think about it for a moment.

input.yaml

val1: 100
val2: 200

from-yaml.l

#!/usr/bin/env roseus

(ros::roseus "test")

(setq *val1* nil)
(setq *val2* nil)

(defun yaml-load (input-file)
  (unix:system (format nil "rosparam load ~A yaml_load_eus" input-file))
  (setq *val1* (ros::get-param "/yaml_load_eus/val1"))
  (setq *val2* (ros::get-param "/yaml_load_eus/val2"))
  (format t "~%load params from ~A ~%" input-file)
  (format t " now val1 is ~A ~%" *val1*)
  (format t " now val2 is ~A ~%" *val2*)
  )

(defun yaml-dump (output-file)
  (unix:system "rosparam delete /yaml_dump_eus")
  (ros::set-param "/yaml_dump_eus/val1" *val1*)
  (ros::set-param "/yaml_dump_eus/val2" *val2*)
  (unix:system (format nil "rosparam dump ~A yaml_dump_eus" output-file))
  (format t "~%dump params to ~A ~%" output-file)
  )

(yaml-load "input.yaml")
(yaml-dump "output.yaml")

in command line

$ ls
from-yaml.l  input.yaml
$ roseus from-yaml.l 
load params from input.yaml 
 now val1 is 100.0 
 now val2 is 200.0 
ERROR: parameter [/yaml_dump_eus] is not set

dump params to output.yaml 
$ cat output.yaml 
val1: 100.0
val2: 200.0

@Kanazawanaoaki
Copy link
Author

Kanazawanaoaki commented May 19, 2022

Using #710 , I created a program to read and write any yaml file in roseus by using the load and dump functions of rosparam.
https://gist.github.com/Kanazawanaoaki/b9aba2c4bb1a51e138057574beab7dfe

(defun yaml-load (input-file)
  (unix:system "rosparam delete /eus_yaml_load")
  (unix:system (format nil "rosparam load ~A eus_yaml_load" input-file))
  (setq *params* (ros::get-param "/eus_yaml_load"))
  (unix:system "rosparam delete /eus_yaml_load")
  (format t "~%load params from ~A~%" input-file)
  (format t " now param is ~A ~%" *params*)
  )

(defun yaml-dump (output-file)
  (unix:system "rosparam delete /eus_yaml_dump")
  (ros::set-param "/eus_yaml_dump" *params*)
  (unix:system (format nil "rosparam dump ~A eus_yaml_dump" output-file))
  (unix:system "rosparam delete /eus_yaml_dump")
  (format t "~%dump params to ~A~%" output-file)
  )

Is there a good way and need to add such functions to jsk_roseus?

@Affonso-Gui
Copy link
Member

Glad that you were able to read/ write yaml files as expected.

However, I am afraid that this still may be a little too 'hacky' to add to jsk_roseus...

@Kanazawanaoaki
Copy link
Author

That's right ...
I don't think it's something that can be added to jsk_roseus either.
Is it better to leave it as a sample program in this issue?
I have no idea how to add it to jsk_roseus as a feature.

@Affonso-Gui
Copy link
Member

I think it is ok to leave it as a sample program in this issue.

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

No branches or pull requests

2 participants