ros学习(二) ros

mac2026-03-14  4

话题发布:

#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)