簡體   English   中英

我如何在ros中運行這個cpp文件

[英]how do i run this cpp file in ros

我是 ROS 的新手,目前正在研究 ROS Kinetic,當我使用命令“rosrun roscv linefollowing.cpp”運行此 linefollowing.cpp 文件時遇到問題(其中 roscv 是 package 名稱和“linefollowing.cpp”是.cpp文件),

錯誤;

/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 19: using: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 20: using: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 21: namespace: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 22: static: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 24: float: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 25: float: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 26: float: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 28: class: command not found
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 36: syntax error near unexpected token `('
/home/badhrisrini/line_follow_ws/src/roscv/src/linefollow.cpp: line 36: `  image_transport::Publisher image_pub_; //image publisher(we subscribe to ardrone image_raw)'

該文件中的代碼是;

    #include <ros/ros.h>
#include <stdio.h>
#include <iostream>
#include "std_msgs/String.h"
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>     //make sure to include the relevant headerfiles
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <cv_bridge/CvBridge.h>
#include <cvaux.h>
#include<math.h>
#include <cxcore.h>
#include "turtlesim/Velocity.h"
     
/*here is a simple program which demonstrates the use of ros and opencv to do image manipulations on video streams given out as image topics from the monocular vision
of robots,here the device used is a ardrone(quad-rotor).*/
using namespace std;
using namespace cv;
namespace enc = sensor_msgs::image_encodings;
static const char WINDOW[] = "Image window";
     
float prevVelocity_angular ,prevVelocity_linear ,newVelocity_angular ,newVelocity_linear ;
float derive_angular, derive_linear, dt = 0.5;
float horizontalcount;
     
class ImageConverter
{
  ros::NodeHandle nh_;
  ros::NodeHandle n;
  ros::Publisher pub ;
  ros::Publisher tog;
  image_transport::ImageTransport it_;    
  image_transport::Subscriber image_sub_; //image subscriber 
  image_transport::Publisher image_pub_; //image publisher(we subscribe to ardrone image_raw)
  std_msgs::String msg;
public:
  ImageConverter()
    : it_(nh_)
  {
      pub= n.advertise<turtlesim::Velocity>("/drocanny/vanishing_points", 500);//
      image_sub_ = it_.subscribe("/ardrone/image_raw", 1, &ImageConverter::imageCb, this);
      image_pub_= it_.advertise("/arcv/Image",1);    
  }
     
  ~ImageConverter()
  {
    cv::destroyWindow(WINDOW);
  }
     
  void imageCb(const sensor_msgs::ImageConstPtr& msg)
  {
     
     sensor_msgs::CvBridge bridge;//we need this object bridge for facilitating conversion from ros-img to opencv
   IplImage* img = bridge.imgMsgToCv(msg,"rgb8");  //image being converted from ros to opencv using cvbridge
   turtlesim::Velocity velMsg;
 CvMemStorage* storage = cvCreateMemStorage(0);
     CvSeq* lines = 0;
       int i,c,d;
       float c1[50]; 
       float m,angle;
          float buf;
          float m1;
       float dis;
       int k=0,k1=0; 
      int count=0;  
     
      float xv;
      float yv;
      int vc=0;
     float xvan=0,yvan=0;
      static float xvan1=0,yvan1=0;
    float num=0;
   static float count1=0;
  float dv;
float vxx,vyy;
     
         cvSetImageROI(img, cvRect(0, 0,170, 140));
        IplImage* out1 = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );   //make sure to feed the image(img) data to the parameters necessary for canny edge output 
        IplImage* gray_out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 ); 
        IplImage* canny_out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
        IplImage* gray_out1=cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
          IplImage* canny_out1 = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
          IplImage* canny_out2 = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
     
        cvSmooth( img, out1, CV_GAUSSIAN, 11, 11 );
     
      cvCvtColor(out1 , gray_out, CV_RGB2GRAY);
        cvCanny( gray_out, canny_out, 50, 125, 3 );
      cvCvtColor(canny_out ,gray_out1, CV_GRAY2BGR);
     
     
     
       lines = cvHoughLines2( canny_out, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80,50, 10 );
        for( i = 0; i < lines->total; i++ )
        {    
     
             CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
{           
{
cvLine( out1, line[0], line[1], CV_RGB(0,255,0), 1, 8 );
cvLine( gray_out1, line[0], line[1], CV_RGB(0,255,0), 2, 8 );
xv=line[0].x-line[1].x;
yv=line[0].y-line[1].y;
velMsg.linear = atan2(xv,yv)*180 /3.14159265;
angle=velMsg.linear;
if(velMsg.linear<-90)
{
  velMsg.linear=velMsg.linear+180;
}
buf=(line[0].x+line[1].x)/2;
     
if(abs(85-buf)<=15)
{
velMsg.angular =0;
}
else
{
velMsg.angular =(85-(line[0].x+line[1].x)/2);
}
     
if(abs(velMsg.angular)>50)
{
velMsg.angular =0;
}
     
     
     
     
     
printf("\nX::Y::X1::Y1::%d:%d:%d:%d",line[0].x,line[0].y,line[1].x,line[1].y);
     
pub.publish(velMsg);
     
     
} 
     
     
     
}
     
cvSeqRemove(lines,i);
     
{
         cvShowImage( "OUT1", out1 );//lines projected onto the real picture
        cvShowImage( "GRAY_OUT1", gray_out1 );
        cv::waitKey(3);
   sensor_msgs::ImagePtr out = sensor_msgs::CvBridge::cvToImgMsg(img, "rgb8");//image converted from opencv to ros for publishing
   image_pub_.publish(out);
 cvClearMemStorage(storage);
cvReleaseMemStorage(&storage);
}
     
};
     
int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_converter");
  ImageConverter ic;
  ros::spin();
  return 0;
}

package "roscv" 的 CMakeLists.txt;

cmake_minimum_required(VERSION 3.0.2)
project(roscv)
find_package(catkin REQUIRED COMPONENTS
  ardrone_autonomy
  cv_bridge
  image_transport
  roscpp
  sensor_msgs
  std_msgs
  std_srvs
  turtlesim
)
find_package(OpenCV)
include_directories(
  ${catkin_INCLUDE_DIRS}
)
include_directories(${OpenCV_INCLUDE_DIRS})




catkin_package(
    CATKIN_DEPENDS
     ardrone_autonomy
     cv_bridge
     image_transport
     roscpp
     sensor_msgs
     std_msgs
     std_srvs
     turtlesim
)


catkin_package(
INCLUDE_DIRS include
LIBRARIES roscv
CATKIN_DEPENDS ardrone_autonomy cv_bridge image_transport opencv2 roscpp sensor_msgs std_msgs std_srvs turtlesim
DEPENDS system_lib
)

add_executable(linefollowing src/linefollowing.cpp)

target_link_libraries(linefollowing ${catkin_LIBRARIES})
install(TARGETS linefollowing
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

關於如何解決這個問題的任何建議伙計們? 先感謝您

根據您的CMakeLists.txt ,您實際上是在將文件編譯為linefollowing roscv的行。 因此,如果您嘗試使用rosrun ,命令應該是: rosrun roscv linefollowing 請注意,此處不包含.cpp 這是因為您嘗試運行的是 cpp 源文件。 這些不是直接可執行的,必須先編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM