我是 ROS 和 rospy 的新手,并且不熟悉非简单数据类型作为主题。
我想构建一个ROS节点作为订阅者和发布者:它接收一个主题(两个列表float64),并使用一个my_function返回列表列表的函数(例如)float64,然后将这个列表列表作为主题发布。
为此,我构建了一个节点,如下所示:
from pymongo import MongoClient
from myfile import my_function
import rospy
import numpy as np
pub = None
sub = None
def callback(req):
client = MongoClient()
db = client.block
lon = np.float64(req.b)
lat = np.float64(req.a)
point_list = my_function(lon, lat, db)
pub.publish(point_list)
def calculator():
global sub, pub
rospy.init_node('calculator', anonymous=True)
pub = rospy.Publisher('output_data', list)
# Listen
sub = rospy.Subscriber('input_data', list, callback)
print "Calculation finished. \n"
ros.spin()
if __name__ == '__main__': …Run Code Online (Sandbox Code Playgroud) 我为 Crazyflie 安装了 ROS 包,我想运行一个简单的脚本,但是当我输入时
sudo python3 execute_trajectory.py,它给了我一个没有名为 rospy 的模块的错误。
这是包:https : //github.com/whoenig/crazyflie_ros并且文件在 crazyflie_demo/scripts 中。此外,我正在使用 Ubuntu 16.04 和 ROS Kinect,我尝试在没有 ROS 的情况下运行 Python3 脚本,并且一切正常。
这是我的 CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(crazyflie_demo)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has …Run Code Online (Sandbox Code Playgroud) 我在使用 Python 记录器和 rospy 记录器时遇到问题。一开始,ROS 节点初始化后,Python 记录器就停止记录。我尝试通过向记录器添加流处理程序来解决该问题。现在,它仅记录 ROS 节点是否已初始化。
我在ROS git中读到了有关 rospy 和 python 日志记录冲突的信息,但似乎没有很好的解决方案可以专门使用 python 记录器,并且独立于 ROS 记录器来处理我的代码。
一些模块初始化记录器:
path = "/some_directory/"
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('logger_name')
# logging file handler for basic log infos
file_handler_info = logging.FileHandler('{}log.log'.format(path))
file_handler_info.setFormatter(formatter)
file_handler_info.setLevel(logging.INFO)
logger.addHandler(file_handler_info)
# logging file handler for critical warnings
file_handler_critical = logging.FileHandler('{}critical.log'.format(path))
file_handler_critical.setFormatter(formatter)
file_handler_critical.setLevel(logging.WARNING)
logger.addHandler(file_handler_critical)
# logging stream handler for console output
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
stream_handler.setLevel(logging.DEBUG)
logger.addHandler(stream_handler)
Run Code Online (Sandbox Code Playgroud)
启动 ROS 节点的其他模块 …
我一直在关注"用ROS编程机器人:机器人操作系统的实用介绍"
在本书的"定义新消息"部分中,我们创建了一个新的消息定义
Example 3-3. Complex.msg
float32 real
float32 imaginary
Run Code Online (Sandbox Code Playgroud)
所以我们需要修改package.xml并添加以下行:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
Run Code Online (Sandbox Code Playgroud)
但是当我在catkin_ws目录中运行catkin_make时,我收到以下错误
Error(s) in /home/gtkratosman-lap/catkin_ws/src/basic/package.xml:
- The manifest (with format version 2) must not contain the following tags: run_depend
Run Code Online (Sandbox Code Playgroud)
我的版本:
ii python-rospkg 1.1.4-100 all ROS package library
ii python-rospkg-modules 1.1.4-1 all ROS package library
Run Code Online (Sandbox Code Playgroud)
这是完整的package.xml文件
<?xml version="1.0"?>
<package format="2">
<name>basic</name>
<version>0.0.0</version>
<description>The basic package</description>
<maintainer email="gtkratosman-lap@todo.todo">gtkratosman-
lap</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<run_depend>message_generation</run_depend>
<run_depend>message_runtime</run_depend>
<build_export_depend>rospy</build_export_depend>
<exec_depend>rospy</exec_depend>
<export>
</export>
</package>
Run Code Online (Sandbox Code Playgroud) 我写了一个示例订阅者。我想将从 rospy.Subscriber 获得的数据提供给另一个变量,以便我稍后可以在程序中使用它进行处理。目前我可以看到订阅者正在运行,因为当我使用 rospy.loginfo() 函数时,我可以看到正在打印的订阅值。虽然我不知道如何将这些数据存储到另一个变量中。我曾尝试使用赋值运算符“=”将其直接分配给变量,但出现错误。
我尝试使用 rospy.loginfo 编写回调函数来打印订阅对象的位置数据。我已经订阅了 JointState 并且它包含头、位置、速度和努力数组。使用 rospy.loginfo 我可以验证订阅者是否正在订阅。但是当我尝试将它直接分配给变量时,出现错误。
我正在显示来自回调函数的日志信息,如下所示
def callback(data):
rospy.loginfo(data.position)
global listen
listen = rospy.Subscriber("joint_states", JointState,
callback)
rospy.spin()
Run Code Online (Sandbox Code Playgroud)
这很好用。但是当我稍微修改代码以分配订阅的值时,我收到以下错误即
listen1 = rospy.Subscriber("joint_states", JointState,
callback=None)
listen = listen1.position
#rospy.loginfo(listen)
print(listen)
rospy.spin()```
The error is as follows,
```listen = listen1.position
AttributeError: 'Subscriber' object has no attribute 'position'
Run Code Online (Sandbox Code Playgroud)
编辑:这是我在程序中定义的节点,
#rospy.loginfo(msg.data)
global tactile_states
tactile_states = data.data
def joint_callback(data):
#rospy.loginfo(data.position)
global g_joint_states
global g_position
global g_pos1
g_joint_states = data
#for i in len(data.position):
#g_position[i] = data.position[i]
g_position = data.position …Run Code Online (Sandbox Code Playgroud) 我是 ROS 新手,
当我将 rospy 导入脚本文件 example.py 并运行它时遇到问题:它说:
Traceback (most recent call last):
File "/home/nagarjunv/hk_ws/src/rvo/src/example.py", line 4, in <module>
import rospy
File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/__init__.py", line 49, in <module>
from .client import spin, myargv, init_node, \
File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/client.py", line 52, in <module>
import roslib
File "/opt/ros/melodic/lib/python2.7/dist-packages/roslib/__init__.py", line 50, in <module>
from roslib.launcher import load_manifest # noqa: F401
File "/opt/ros/melodic/lib/python2.7/dist-packages/roslib/launcher.py", line 42, in <module>
import rospkg
ModuleNotFoundError: No module named 'rospkg'
Run Code Online (Sandbox Code Playgroud)
我将以下内容导入到我的脚本文件中:第 4 行是 rospy
#!/usr/bin/env python3
import sys
import rospy
Run Code Online (Sandbox Code Playgroud)
这是我的 CmakeList: …
我有问题。我有两个节点,节点 1 和节点 2,其中节点 1 在节点 2 中发送浮点数,节点 2 在节点 1 中发送浮点数。在函数回调中,我想将收到的信息与其他值相加并更新变量。但问题是我没有成功发送信息,因为终端只在输出中打印第一次更新(对于节点 1 我得到 2.9,节点 2 2.0)这些节点1和节点2的代码
Node1
!/usr/bin/env python
import rospy
import time
from std_msgs.msg import Float64
global x1
global a
x1 = 1.5
def callback(msg):
#print 'Sto ricevendo informazioni da %s nel tempo %s' % (msg.data, time.ctime())
#print "%f"%msg.data
a = msg.data
info_nodo2 = a + 0.5
x1 = info_nodo2
print "%f"%x1
def nodo():
pub = rospy.Publisher('chatter1', Float64)
rospy.init_node('nodo1', anonymous=True)
rospy.loginfo("In attesa")
rospy.Subscriber('chatter2', Float64, callback)
rate = rospy.Rate(1) …
Run Code Online (Sandbox Code Playgroud) 我将按照http://wiki.ros.org/robotiq中的指示为 Robotiq 夹具安装 ros 驱动程序
,但是为了安装 Modbus TCP 依赖项 ( rosdep install robotiq_modbus_tcp),我遇到以下问题:
错误:以下包/堆栈无法将其 rosdep 键解析为系统依赖项:robotiq_modbus_tcp:无法找到 [rospy] 的 rosdep 定义
PS:我使用的是Ubuntu 16.04(kinetic),
预先非常感谢您帮助我解决这个问题......
rospy ×8
ros ×7
python ×6
crazyflie ×1
dependencies ×1
logging ×1
modbus-tcp ×1
python-2.7 ×1
python-3.x ×1
ubuntu-16.04 ×1