【问题标题】:How to use streamlit in ROS?如何在 ROS 中使用 streamlit?
【发布时间】:2021-07-26 15:32:11
【问题描述】:
我有一个用 Python 编写的 ROS 节点,它捕获消息并将它们写入磁盘,但我还需要通过 Web 界面可视化我的数据。我是一位经验丰富的 Streamlit 用户,但我找不到在 ROS 中使用此库的合适方法。在 Streamlit 中运行我们的代码,有命令:“streamlit run FILENAME.py”
但在 ROS 中,为了订阅 ROS 节点,我需要使用 rosrun 或 roslaunch 运行我的 python 文件。
知道如何一起使用这些库吗?
操作系统:Ubuntu 20.04
Python 3.7
【问题讨论】:
标签:
python
ubuntu
ros
streamlit
【解决方案1】:
这里有一个非常基本的例子,说明如何结合streamlit使用ROS订阅和发布。在此示例中,当输入文本字段更改时,字符串将发布到 rostopic /mystring。流光指标每秒更新一次,当前 Int32 值发布到 rostopic /mynumber
Python 代码:
from streamlit import cli as stcli
import streamlit as st
import rospy
from std_msgs.msg import String, Int32
import sys
import time
mynum=0
mydelta=0
def callback(data):
global mydelta, mynum
mydelta=mynum-data.data
mynum=data.data
#rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
def getData():
return mynum, mydelta
rospy.init_node('my_streamlit_ros_node')
pub = rospy.Publisher('/mystring', String, queue_size=10)
rospy.Subscriber("mynumber", Int32 , callback)
def main():
st.title('Streamlit APP:')
st.subheader('Commuicating with ROS')
mytext = st.text_input('Send String to ROS', 'Life of Brian')
pub.publish(mytext)
metrics = st.empty()
while True:
mynum, mydelta=getData()
with metrics:
st.metric(label="Get Int32 Number from ROS", value=mynum, delta=mydelta, delta_color="inverse")
time.sleep(1)
if __name__ == '__main__':
if st._is_running_with_streamlit:
main()
else:
sys.argv = ["streamlit", "run", sys.argv[0]]
sys.exit(stcli.main())
执行:
- 获取你的 ros 工作空间
- python3 脚本名.py