废话不多说直接上代码————
#发布者:
#!/usr/bin/env python
#coding=utf-8
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
print("正在初始化————")
rospy.init_node('img_pub_node')
# rospy.loginfo("正在初始化————")
pub = rospy.Publisher('ros_img', Image)
bridge = CvBridge()
cap = cv2.VideoCapture(0)
print("初始化完成!")
while not rospy.is_shutdown():
ret, frame = cap.read()
if not ret:
rospy.logerr("Cannot open the camera!! ")
break
rospy.loginfo("摄像头成功读取到画面!")
msg = bridge.cv2_to_imgmsg(frame, encoding='bgr8')
pub.publish(msg)
#订阅者
#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
def callback(msg):
bridge = CvBridge()
cv_img = bridge.imgmsg_to_cv2(msg, "bgr8")
rospy.loginfo("成功捕获到画面!")
cv2.imshow("Hello", cv_img)
cv2.waitKey(1)
rospy.init_node('img_sub_node')
rospy.Subscriber('ros_img', Image, callback)
rospy.spin()
ps.1 新手第一次用py写ros节点一定别忘了开头两行的注释,很重要没有它跑不了
ps.2 并且还需要去.py文件目录下打开终端输入
chmod +x ***.py ***.py ...(所有py文件都可以依次写上去)
从而给.py文件添加执行权限不然不能运行
然后就可以运行了
roscore
rosrun <pkg_name> img_pub.py
rosrun <pkg_name> img_sub.py
dang dang~
这里摄像头的打开我用的是CV,而不是ros中的什么usb_cam
我这边遇到最大的问题就是:
cv_bridge我用的是pip下载,而非apt-get
pip install cv_bridge
我电脑用apt下载会报错 (sudo apt-get install ros-melodic-cv-bridge)
Traceback (most recent call last):
File "/home/jeston/jeston_ws/src/usb_cam-develop/scripts/img_pub.py", line 23, in <module>
msg = bridge.cv2_to_imgmsg(frame, encoding='bgr8')
File "/opt/ros/melodic/lib/python2.7/dist-packages/cv_bridge/core.py", line 259, in cv2_to_imgmsg
if self.cvtype_to_name[self.encoding_to_cvtype2(encoding)] != cv_type:
File "/opt/ros/melodic/lib/python2.7/dist-packages/cv_bridge/core.py", line 91, in encoding_to_cvtype2
from cv_bridge.boost.cv_bridge_boost import getCvType
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
如果是用apt安装的,能运行还好,不能运行的话(譬如和我抱一样的错),要卸载掉ros原生的cv_bridge,改用pip安装
卸载方法:来到 /opt/ros/melodic/lib/python2.7/dist-packages/ 目录下
sudo rm -r cv_bridge
sudo rm cv_bridge***(tab补全).info
别的没什么了。。。
ps. python的好处就是不用写CMake配置文件,不用catkin_make编译,每次写完一保存就能调用嘿嘿~