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就可以保存在左侧,下次直接点击就能打开。
三、配置vscode
配置很简单就是安装一些扩展,安装的所有扩展如图,打开vscode左侧四个小正方形的图标安装下图中所有的扩展即可,可以在搜索框搜索:
四、vscode打开工程
选择左上角文件——>打开文件夹——>打开racecar_ws文件夹即可:
五、配置
不想知道配置原理的可以直接跳到第八节,下载我的github代码,运行对应命令即可! 使用cpp编写需要添加以下五个依赖项:
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文件,加上新增的依赖:
geometry_msgsbuild_depend>
roscppbuild_depend>
image_transportbuild_depend>
cv_bridgebuild_depend>
trajectory_msgsbuild_depend>
geometry_msgsrun_depend>
roscpprun_depend>
image_transportrun_depend>
cv_bridgerun_depend>
trajectory_msgsrun_depend>
六、创建cpp脚本
在racecar_gazebo下创建src文件夹,然后在文件夹下创建findLine.cpp 6.1 包含阿克曼消息的头文件:
#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的代码补全提示就可以很方便的找到具体的成员:
6.3 阿克曼消息发布的节点创建:
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的线速度和角度运动的代码,小车会在原地打转!七、测试效果 点击vscode最顶上一排的终端——>新建终端: 编译:
catkin_make
运行仿真模型:
roslaunch racecar_gazebo racecar_normal_runway.launch
运行刚写的脚本:
rosrun racecar_gazebo findLine
注意运行cpp脚本是不加cpp结尾的,直接run文件名字即可。
八、代码运行方法
项目地址:https://github.com/xmy0916/racecar.git 大家可以不用配置,直接下载我的远程谷仓即可,代码已经更新