话题发布:
#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识别。