



sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get install ubuntu-make
2.2 安装vscode
umake ide visual-studio-code
中间会第一次确认安装位置,直接回车就行安装在默认位置
中间会第二次确认是否同意软件协议,输入“a”回车即可(霸王条款你不同意也不行哈哈哈)
2.3 启动vscode
cd ~/.local/share/umake/ide/visual-studio-code/bin
./code
这时候你的左侧图标栏会出现vscode的蓝色图标,右键lock to launcher就可以保存在左侧,下次直接点击就能打开。







- roscpp:ros的cpp支持库
- geometry_msgs:通用消息类型
- cv_bridge:图片转换用
- image_transport:图片转换用
- opencv:图片处理库
set(OpenCV_DIR /opt/ros/kinetic/share/OpenCV-3.3.1-dev/)
find_package(catkin REQUIRED COMPONENTS
gazebo_ros
geometry_msgs
OpenCV
roscpp
cv_bridge
image_transport
)
包含路径中加上opencv的路径:
include_directories(
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
加上cpp的执行声明:
add_executable(findLine src/findLine.cpp)
加上目标lib:
target_link_libraries(findline
${catkin_LIBRARIES}
${OpenCV_LiBRARIES}
)
添加依赖声明:
add_dependencies(findLine findLine_tutorials_generate_messages_cpp)
修改同目录下的package.xml文件,加上新增的依赖:
<build_depend>geometry_msgsbuild_depend>
<build_depend>roscppbuild_depend>
<build_depend>image_transportbuild_depend>
<build_depend>cv_bridgebuild_depend>
<build_depend>trajectory_msgsbuild_depend>
<run_depend>geometry_msgsrun_depend>
<run_depend>roscpprun_depend>
<run_depend>image_transportrun_depend>
<run_depend>cv_bridgerun_depend>
<run_depend>trajectory_msgsrun_depend>


#include "ackermann_msgs/AckermannDrive.h"#include "ackermann_msgs/AckermannDriveStamped.h"
6.2 创建阿克曼消息的速度控制:
void Follower::speed_contrl(float speed_car,float angluar_car)
{
ackermann_msgs::AckermannDriveStamped ack;
ack.drive.speed = speed_car;
ack.drive.steering_angle = angluar_car;
cmdpub.publish(ack);
}
这里我们对比之前的py代码,发现阿克曼的消息类型是AckermannDriveStamped,他是在ackermann_msgs类的,用vscode的代码补全提示就可以很方便的找到具体的成员:

cmdpub = node.advertise<:ackermanndrivestamped>("/vesc/low_level/ackermann_cmd_mux/input/teleop", 10, true);
6.4 接收图像的回调函数:
void Follower::image_callback(const sensor_msgs::ImageConstPtr& msg)
{
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
}
catch(cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
Mat hsv = cv_ptr->image.clone();
Mat mask = cv_ptr->image.clone();
cvtColor(cv_ptr->image, hsv, COLOR_BGR2HSV);
double low_H = 0;
double low_S = 0;
double low_V = 100;
double high_H = 180;
double high_S = 30;
double high_V = 255;
inRange(hsv, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), mask);
speed_contrl(0.5,0.5);//这里就写了一个原地转圈圈哈,大家自己开发
imshow("mask",mask);
waitKey(3);
}
这段代码前一部分是将ros的图片消息转换成opencv的图片类型Mat,这样可以方便的使用opencv的库函数来处理图像。中间我是使用色相环来过滤出蓝色和白色中的白色,色相环过滤在使用中我发现效果比二值化好多了,光线的影响也小很多,最后的话我就给大家写好了固定0.5的线速度和角度运动的代码,小车会在原地打转!




catkin_make

roslaunch racecar_gazebo racecar_normal_runway.launch
运行刚写的脚本:
rosrun racecar_gazebo findLine
注意运行cpp脚本是不加cpp结尾的,直接run文件名字即可。


- cd ~/racecar_ws/src
- git clone https://github.com/xmy0916/racecar.git
- cd ..
- catkin_make
- source ./devel/setup.bash
- roslaunch racecar_gazebo racecar_normal_runway.launch
- rosrun racecar_gazebo findLine

