ros通信编程
- 练习ROS动作编程:客户端发送一个运动坐标,模拟机器人运动到目标位置的过程。包括服务端和客户端的代码实现,要求带有实时位置反馈。同时注意学习cmakelists 的使用方法。
一. ROS1.0控制小乌龟画圆(旋转)
1. ROS使用命令控制小乌龟画圆
1.1 关于ROS常用的命令介绍
1.2 使用ROS命令控制小乌龟画圆
- 首先我们打开终端,在第一个终端输入
roscore
- 启动服务
打开第二个终端,启动小海龟节点
rosrun turtlesim turtlesim_node
- 打开第三个终端,启动小海龟控制器
rosrun turtlesim turtle_teleop_key
到这里就可以使用我们的键盘上下左右控制小海龟行动了
- 接下来我们打开第四个终端使用rostopic命令,使我们的小海龟做出画圆的操作
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0"
- 这里我们主要使用rostopic命令设置我们小乌龟的线速度和角速度同时写一个循环来对我们的小乌龟进行画圆操作
2. 使用c++程序控制小海龟画圆
首先我们创建一个ros工作空间,创建一个catkin_ws文件夹放置功能源码包
mkdir -p ~/catkin_ws/src
然后进入我们的src文件夹,初始化工作空间
cd ~/catkin_ws/src
catkin_init_workspace
这样就在src文件中创建了一个 CMakeLists.txt 的文件,目的是告诉系统,这个是ROS的工作空间。
然后我们编译工作空间catkin_make
我们所有的编译工作都需要在我们的catkin_ws文件夹中进行,所以这里我们先进入catkin_ws文件夹
cd ~/catkin_ws
使用catkin_make命令进行编译,编译完成后我们可以发现catkin_ws文件夹中会出现build和devel两个新的文件夹
catkin_make
使用ls命令进行查看可以看到,我们的catkin_ws文件夹中现在有三个文件夹,build ,devel和src三个文件夹,我们的代码主要存放在src文件夹下面
接下来我们设置环境变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
配置环境变量生效
source ~/.bashrc
然后我们进入src文件夹中,创建一个功能包,名字叫my_turtle_package
cd ~/catkin_ws/src
catkin_create_pkg my_turtle_package rospy roscpp
在我们的src文件夹中出现了一个叫my_turtle_package的文件和一个CMakeLists.txt的文件
接下来我们要在我们创建的包里面创建一个cpp文件
gedit draw_circle.cpp
然后将以下内容写入cpp中并保存
#include "ros/ros.h"
#include<geometry_msgs/Twist.h> //运动速度结构体类型 geometry_msgs::Twist的定义文件
int main(int argc, char *argv[])
{
ros::init(argc, argv, "vel_ctrl"); //对该节点进行初始化操作
ros::NodeHandle n; //申明一个NodeHandle对象n,并用n生成一个广播对象vel_pub
ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
//vel_pub会在主题"/cmd_vel"(机器人速度控制主题)里广播geometry_msgs::Twist类型的数据
ROS_INFO("draw_circle start...");//输出显示信息
while(ros::ok())
{
geometry_msgs::Twist vel_cmd; //声明一个geometry_msgs::Twist 类型的对象vel_cmd,并将速度的值赋值到这个对象里面
vel_cmd.linear.x = 2.0;//前后(+-) m/s
vel_cmd.linear.y = 0.0; //左右(+-) m/s
vel_cmd.linear.z = 0.0;
vel_cmd.angular.x = 0;
vel_cmd.angular.y = 0;
vel_cmd.angular.z = 1.8; //机器人的自转速度,+左转,-右转,单位是rad/s
vel_pub.publish(vel_cmd); //赋值完毕后,发送到主题"/cmd_vel"。机器人的核心节点会从这个主题接受发送过去的速度值,并转发到硬件体上去执行
ros::spinOnce();//调用此函数给其他回调函数得以执行(比例程未使用回调函数)
}
return 0;
}
之后打开CMakeLists.txt,在CMakeLists.txt文件中找到## Declare a C++ executable
gedit CMakeLists.txt
可以使用ctrl+f快捷搜索找到## Declare a C++ executable然后在前面添加如下内容
add_executable(draw_circle src/draw_circle.cpp)
target_link_libraries(draw_circle ${catkin_LIBRARIES})
保存之后进入catkin_ws文件夹中开始编译工作
cd ~/catkin_ws/
catkin_make
编译成功之后我们打开ros机器人
第一个终端输入roscore
打开第二个终端打开小乌龟节点rosrun turtlesim turtlesim_node
打开第三个终端启动画圆程序
cd ~/catkin_ws/
source devel/setup.bash
rosrun my_turtle_package draw_circle
可以看见我们的小乌龟正在以匀速进行圆周运动
- 在VMware虚拟机Ubuntu系统下练习编译、安装著名的C/C++图像处理开源软件库 Opencv3.x 。
- 编写一个打开图片进行特效显示的代码 test1.cpp(见opencv编程参考资料 );
二.Ubuntu 20.04的OpenCV基础应用
1.安装opencv
从源仓库安装
sudo apt update
sudo apt install libopencv-dev python3-opencv
检验安装效果
python3 -c "import cv2; print(cv2.__version__)"
2.使用opencv处理图片和视频
2.1 处理图片
新建一个code文件夹,将处理图片的c程序放在文件夹中,放一张test.jpg图片在code文件夹下
mkdir code
cd code
gedit test.cpp
复制一下c代码到test.cpp中
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("test.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
编译 运行
g++ test.cpp -o test1 `pkg-config --cflags --libs opencv`
./test1
即可在文件夹中获得一个名为test.png的图片
2.2 打开视频
创建test2.cpp
gedit test2.cpp
添加以下代码
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture("man.mp4");//VideoCapture capture(0);打开man.mp4视频文件
//循环显示每一帧
while(1){
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame;//读取当前帧
if(frame.empty())//播放完毕,退出
break;
imshow("读取视频帧",frame);//显示当前帧
waitKey(30);//掩饰30ms
}
system("pause");
return 0;
}
在code文件夹中放在一个名为man.mp4的视频
编译运行
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
./test.2
即可完成视频播放