一、前言
之前的教程使用Python代码实现了四轮车的巡线,阿克曼模型确实在方仿真上效果都好多了,今天教大家将代码从python修改成cpp的,毕竟嵌入式程序还是以c语言为主,可以更好的移植到单片机上。修改代码这件事当然有个编译器的提示可以让我们达到事半功倍的效果啦,所以先讲解安装vscode这强大的ide来编写cpp代码。
二、安装vscode
2.1 安装Ubuntu make
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编写需要添加以下五个依赖项:
- roscpp:ros的cpp支持库
- geometry_msgs:通用消息类型
- cv_bridge:图片转换用
- image_transport:图片转换用
- opencv:图片处理库
5.1 修改CMakeList
打开vscode中racecar_gazebo中的CMakeList:
在find_package中添加上述五个依赖项并设置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
)
include_directories(
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
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_msgs</build_depend><build_depend>roscpp</build_depend><build_depend>image_transport</build_depend><build_depend>cv_bridge</build_depend><build_depend>trajectory_msgs</build_depend><run_depend>geometry_msgs</run_depend><run_depend>roscpp</run_depend><run_depend>image_transport</run_depend><run_depend>cv_bridge</run_depend><run_depend>trajectory_msgs</run_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);
}
6.3 阿克曼消息发布的节点创建:
cmdpub = node.advertise<ackermann_msgs::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
大家可以不用配置,直接下载我的远程谷仓即可,代码已经更新
- 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