ros学习(二) ros_visp传输文件

2 篇文章 0 订阅
1 篇文章 0 订阅

话题发布:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <visp/vpImage.h>
#include <visp3/io/vpImageIo.h>
#include <opencv2/highgui/highgui.hpp>


int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_publisher");
  ros::NodeHandle nh;


  image_transport::ImageTransport it(nh);
  image_transport::Publisher pub = it.advertise("/camera/image_raw", 1);
 
  //vpImage<vpRGBa> I;
  //vpImageIo::read(I, argv[1]);
  cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
  sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8",image).toImageMsg();
  ros::Rate loop_rate(5);
  while (nh.ok()) {
    pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
  }
}

话题订阅

//! \example tutorial-ros-grabber.cpp
#include <visp/vpDisplayX.h>
#include <visp/vpImage.h>
#include <visp_ros/vpROSGrabber.h>
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_listener");
  ros::NodeHandle nh;
  vpImage<vpRGBa> I;
 
    vpROSGrabber g; // Create a grabber based on ROS
    //! [Construction]

    //! [Setting camera topic]
    g.setImageTopic("/camera/image_raw");

    //! [Opening]
    g.open(I);
    //! [Opening]
    std::cout << "Image size: " << I.getWidth() << " " << I.getHeight() << std::endl;

#ifdef VISP_HAVE_X11
    vpDisplayX d(I);
#else
    std::cout << "No image viewer is available..." << std::endl;
#endif

    while(1) {
      //! [Acquisition]
      g.acquire(I);
      //! [Acquisition]
      vpDisplay::display(I);
      vpDisplay::displayText(I, 20, 20, "A click to quit...", vpColor::red);
      vpDisplay::flush(I);
      if (vpDisplay::getClick(I, false))
        break;
    }
  
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(ros2visp)

add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
  visp_ros REQUIRED
  roscpp
  std_msgs
  cv_bridge
  visp_ros
  image_transport
)
include_directories(

  ${catkin_INCLUDE_DIRS}
  ${visp_ros_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
)
add_executable(grabber grabber.cpp)
link_directories(grabber /home/coco/catkin_ws/devel/lib /home/coco/visp-ws/visp-build/lib)
target_link_libraries(grabber ${visp_ros_LIBRARIES} visp_ros)

add_executable(publisher publisher.cpp)
link_directories(publisher /home/coco/catkin_ws/devel/lib /home/coco/visp-ws/visp-build/lib)
target_link_libraries(publisher ${visp_ros_LIBRARIES} ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} visp_ros)

CMakeLists写法总结:
1.ros中自带opencv,find_package中不需添加opencv
2.link_directories中,可添加绝对路径,以避免ros找不到库,这里添加的是catkin和visp安装的路径
3.target_link_libraries,${visp_ros_LIBRARIES}有时类似这在会找不到相应库,visp_ros加这种可弥补
4.根据编写需要的库添加相应的库

package.xml
添加了以下

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>visp</build_depend>
  <build_depend>visp_bridge</build_depend>
  <build_depend>visp_ros</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <build_export_depend>visp</build_export_depend>
  <build_export_depend>visp_bridge</build_export_depend>
  <build_export_depend>visp_ros</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>visp</exec_depend>
  <exec_depend>visp_bridge</exec_depend>
  <exec_depend>visp_ros</exec_depend>

步骤:
安装好ros环境,我用的kinetic,安装visp,安装ros_visp,vision_visp,
上网装了好久,其中创建工作空间catkin_ws
安装visp_ros时
libvisp_ros_bebop2_visual_servo_nodelet 一直编译失败,把相应的代码注释掉

#LIBRARIES ${PROJECT_NAME} libvisp_ros_bebop2_visual_servo_nodelet
#add_library(visp_ros_bebop2_visual_servo_nodelet
#  tutorial/bebop2/visual_servo_nodelet.cpp
#add_executable(visp_ros_bebop2_visual_servo_node tutorial/bebop2/visual_servo_node.cpp)

因为我不需要所以才敢注释掉.

环境搭建好了后:

cd ~/catkin_ws/src
catkin_create_pkg	ros2visp    std_msgs    roscpp opencv visp  visp_ros

catkin_create_pkg命令行格式:catkin_create_pkg [package_name] [depend1] [depend2]
其中depend可以后面手动添加,你添加错误的也不会直接报错,编译时才会出错。

编译:

cd ~/catkin_ws
catkin_make

然后把文件放好/catkin_ws/src/ros2visp
publisher.cpp grabber.cpp CMakeLists.txt package.xml都修改好
再次编译

cd ~/catkin_ws
catkin_make

编译成功后
三个终端分别是

roscore
rosrun ros2visp publisher /home/cocoisp-ws11/tutorial/image/monkey.jpeg

发布时要带上图片的绝对路径

rosrun ros2visp grabber

实现ros_visp图片的传输。
接下来尝试传输图片后的,tag识别。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值