运行ros
` 提示:因为手头有英伟达树莓派跟激光雷达,也有ros小车
直接上现成的,但是会卡。而且不好用,所以建议自己安装一个
链接:https://pan.baidu.com/s/16eDEqTB7y9wE9ghmqoTofA
提取码:yylk
文章目录
- 运行ros
- 前言
- 一、安装ros
-
- 二、试试?
-
- 三、基础
-
- 四.自定义话题消息类型
-
- 五.自定义服务消息类型
- 区别
前言
手头有雷达,所以像试试ros操作系统
一、安装ros
ros对于ubuntu是有版本要求的,一下是版本对应关系
ubuntu版本 | 对应ros版本 |
---|
16.04 | Kinetic |
18.04 | Melodic |
20.04 | Noetic |
这里我们可以lsb_release -a查看我们的ubunutu版本,避免出错
book@100ask:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
book@100ask:~$
1、ubunutu安装ros
指定软件源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
安装密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
如下代表成功
sudo apt-get update
sudo apt-get install ros-melodic-desktop-full
安装malodic_ros,这一步时间还挺长的
sudo apt-get install ros-melodic-desktop-full
然后就是初始化
sudo pip3 install rosdepc
sudo rosdepc init
rosdepc update
链接: link
二、试试?
1.配置环境
打开终端输入以下,
echo "source /opt/ros/melodic/setup.bash" >>~/.bashrc
source ~/.bashrc
也可以打开文件看看
2.小海龟
打开三个终端,分别输入
roscore 所有的ros都必须启动这个,就是管理者意思
rosrun turtlesim turtlesim_node 运行这个就会出现小海龟
rosrun turtlesim turtle_teleop_key 运行这个就会可以通过小键盘去控制小海龟
更简单的方法
一行代码安装ROS链接: 一行代码安装ROS
三、基础
1.建立基础工程
mkdir -p catkin_ws/src
创建联级目录
cd catkin_ws/src
到src目录后初始化工作空间
catkin_init_workspace
返回 catkin_make目录
catkin_make
ls发现当前目录有个devel跟build,具体干嘛的后面再说,大概就是build用来储存一些编译后的文件,devel是一些环境设置的文件,而为了以后的方便操作,将本地的工作空间加入的终端打开的环境变量中,我们可以在home目录下打开 .bashrc 这个文件并且加入
source /home/book/catkin_ws/devel/setup.bash
到 .bashrc 里面如图,因为运行某些程序的时候需要此终端有这个环境
2.创建功能包
我们到了其功能包cd catkin_ws/src/目录下
然后创建我们的功能包,msg是名称,后面两个是他的依赖项
catkin_create_pkg msg std_msgs roscpp
里面有这四个文件,CMakeLists.txt是编译文件,跟Makefile一样,
package.xml 是配置文件,在嵌入式中很常见,主要设置一些编译过程中需要的依赖项,以及储存一些设置断电后一些系统设置的系统环境变量
CMakeLists.txt include package.xml src
在这里大概讲下他的文件结构,小编开始学习的时候也有点发怵
四.自定义话题消息类型
我们在功能包目录下创建msg文件,在此文件夹目录下创建一个后为.msg的animal.msg文件,输入以下文本,实际机器人情况就是一些gps的数据
string animal
string action
uint8 age
uint8 sex
uint8 x
uint8 y
uint8 z
然后在我们的功能包目录下的package.xml 最后加入
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
代表我们能编译msg文件
然后打开我们的CMakeLists.txt自行修改,大概就是配置编译.msg文件
找到catkin_package,加入message_runtime
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES server
CATKIN_DEPENDS roscpp std_msgs message_runtime
# DEPENDS system_lib
)
然后我们回到工作空间主目录,进行catkin_make
此时我们就会发现生成了一个.h文件
应用消息
同样在CMakeLists。txt下进行编辑
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp )
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
pub
#include <ros/ros.h>
#include "msg/animal.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "person_publisher");
ros::NodeHandle n;
ros::Publisher person_info_pub = n.advertise<msg::animal>("/person_info", 10);
ros::Rate loop_rate(1);
int count = 0;
while (ros::ok())
{
msg::animal person_msg;
person_msg.action = "creep";
person_msg.animal="cat";
person_msg.age = 4;
person_msg.sex = 0;
person_msg.x=1;
person_msg.y=2;
person_msg.z=3;
person_info_pub.publish(person_msg);
ROS_INFO("Publish Person Info: action:%s age:%d sex:%d",
person_msg.action.c_str(), person_msg.age, person_msg.sex);
loop_rate.sleep();
}
return 0;
}
sub
#include <ros/ros.h>
#include "msg/animal.h"
void personInfoCallback(const msg::animal::ConstPtr& msg)
{
ROS_INFO("Subcribe Person Info: action:%s animal:%s age:%d sex:%s x:%d y:%d x:%d",
msg->action.c_str(), msg->animal.c_str(), msg->age,msg->sex ? "公" : "母",msg->x,msg->y,msg->z );
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "person_subscriber");
ros::NodeHandle n;
ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
ros::spin();
return 0;
}
结果
五.自定义服务消息类型
我们在功能包目录下创建msg文件,在此文件夹目录下创建一个后为.srv的message.srv文件,输入以下文本,实际机器人情况就是一些gps的数据,跟话题消息很像对不对,但是多了一行—下面的回应,意思是服务消息是有回应的
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result
然后在我们的功能包目录下的package.xml 最后加入
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
代表我们能编译msg文件
然后打开我们的CMakeLists.txt自行修改,大概就是配置编译.msg文件
加入服务的消息编译
找到catkin_package,加入message_runtime
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES server
CATKIN_DEPENDS roscpp std_msgs message_runtime
# DEPENDS system_lib
)
最后跟话题一样,对应用程序进行编译
add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES} )
add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES} )
运行即可
区别
我们可以看到话题有个队列去存消息,然年去更新掉最开始的信息,类似于堆,话题跟服务的大概区别就udp跟tcp,我们再服务的有个callback有个返回,可以想象类似于tcp的返回的sck包
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)