1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程;
2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等;
3、参加工作后(2021-2023年)岗位是嵌入式软件开发,主要是服务器开发,Linux、C/C++、网络编程、docker容器、CMake、makefile、Shell脚本、JSON等。4、求职岗位是嵌入式软件开发、C/C++开发、自动驾驶岗位开发等。
文章目录
- 1 ros1通信模型
- 2 ROS的应用框架是怎样的?
- 3 如何新建一个工作空间?
- 4 如何新建一个功能包?
- 5 如何新建一个ROS节点?
- 6 如何在一个ros节点文件中调用其他的源文件?
- 7 如何设置两台机器的分布式通信?
- 8 用的ROS什么版本?
- 9 ROS开发是新建一个项目来开发嘛?
- 10 ROS的订阅和发布机制了解吗?实现的原理是什么
- 11 项目的平台是嵌入式平台吗?
- 12 科研期间,都熟悉什么算法?
- 13 在这些方面做过什么有挑战性的工作?
- 14 相机和imu的数据是怎么融合的?
- 15 ROS延时是一个大问题,图像和imu的延时是怎么解决的?
- 16 做过的算法二次开发有哪些?
- 17 这些项目里用到了哪些算法的哪些函数?
- 18 研究生这两个项目算法,的推理时间是多少?
- 19 imu出来的是什么数据?
- 20 imu出来的xyz是属于什么坐标系?
- 21 imu的当前的姿态,和落点之间的位置;他们两个的相对位置是怎么算出来的?
- 22 ROS中的spin()和spinOnce()相关问题
- 23 ROS中订阅(Subscribe)最新消息以及消息队列相关问题
- 24、话题和服务的区别:
- 25、ROS常用指令:
- 26、ROS常用函数
- 27、ROS常用Eigen库函数
- 28、ROS多个订阅者的回调之间,是并发的还是单线程的?两个topic同时访问一个资源,会有线程冲突的问题嘛?
- 29、launch启动多个节点,会有订阅者的节点还没起来,但是发布者的节点已经起来了,这样就导致发布的信息订阅者没订阅到,即接收的时候会丢一些数据,如何避免这个问题?
- 30发布者和订阅者的buff_size如何确定该定为多少?
- 31 ROS里时间戳的同步是如何做的?比如vins里的imu和相机的时间戳同步,使用的是ros里的什么机制?
- 32、TF树里,静态发布和一般发布有什么区别?
- 33、TF树可以获取过去某个时刻的位姿变化嘛?
- 34、TF树对不同坐标系的发布时间有什么要求吗?
1 ros1通信模型
- talker注册
- listener注册
- ROS Master进行信息匹配
- listener 发送链接请求
- talker确认请求
- 建立连接
- talker给listener发数据
2 ROS的应用框架是怎样的?
总结:ROS就是一个为了提高机器人开发的软件复用率,开发的一款具有独特的通信机制、丰富的开发工具、海量的应用功能、良好的生态系统集的工具。
3 如何新建一个工作空间?
mkdir -p ~/target_ws/src //其中target_ws为我新建的工作空间名
cd ~/target_ws/src
catkin_init_workspace //初始化工作空间
cd ~/target_ws
catkin_make //编译,编译完成后,会发现catkin_ws中多了两个文件 build 和 devel
echo "source ~/target_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
需要注意一点,同一个工作空间下不能存在同名功能包,不同的工作空间下可以存在同名功能包。但是要注意一个问题,ROS运行时会优先选择最前端工作空间的同名功能包。为了避免出现想不到的问题,所有工作空间尽量不使用同名功能包。
功能包的名称尽量按照a_b_c的格式书写,否则,编译过程将会出现警告。
4 如何新建一个功能包?
cd ~/target_ws/src/
catkin_create_pkg target_pub std_msgs roscpp rospy //target_pub为功能包的名称
cd ~/target_ws-
catkin_make //编译功能包
5 如何新建一个ROS节点?
接着上面的测试功能包,我们在功能包的src文件下新建test.cpp文件:
cd ~/catkin_test_ws/src/test_package/src/
vim test.cpp
然后就是ROS节点的模板程序,都是在模板程序之上做的修改。
#include "ros/ros.h" //引入ROS头文件
int main(int argc,char **argv)
{
ros::init(argc,argv,"test"); //初始化ROS节点
ros::NodeHandle nh; //创建ROS句柄
ros::Rate loop_rate(10); //定义循环频率 10HZ
while(ros::ok())
{
std::cout<< "hello ros" <<std::endl;
loop_rate.sleep(); //按照循环速率延时
}
return 0;
}
到这里,然后编译就可以了?这个功能包的编译还需要修改对应的CMakeLIsts.txt文件,一般为三步。
-
设置需要编译的代码和生成的可执行文件;
-
设置链接库;
-
设置依赖;
所以我们修改功能包下的CMakeLIsts.txt文件,一般功能包会自动生成CMakeLists.txt文件内容,我们进行修改即可。
add_executable(${PROJECT_NAME}_node src/test.cpp) #这里注意自动生成的源文件名字一般不对,一定要修改成对的名字
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
这里因为我们没有自定义的消息或者服务类型,所以其他的地方不做更改,如果使用了自定义的消息或者服务类型,注意修改其他的地方。
cd ~/catkin_test_ws
catkin_make #编译
此时~/catkin_test_ws/devel/lib/test_package
目录下生成了test_package_node
的可执行文件
执行功能包,在使用rosrun执行功能包之前,使用roscore启动rosmaster。启动rosmaster
是启动一切ros节点的前提。
roscore #启动rosmaster
打开一个新终端启动,test_package功能包下的test_package_node节点。
rosrun test_package test_package_node
终端循环打印hello ros,一个新的ros节点就创建完成了。
6 如何在一个ros节点文件中调用其他的源文件?
这个问题很常见,但是他不应该是个问题,但是发现一些小伙伴还是不太会操作。我们在开发的过程中,随着程序的不断扩大,模块化编程肯定必不可少。有时,我们要调用别人写好的特定功能的源文件,这个时候我们应该怎么做吗?
首先,将你需要的源文件复制到你需要编写的功能包的src文件夹下,规范地讲,.hpp文件应该放到include文件下,如果文件比较少,也没有必要,和.cpp文件放在一起也可以。
ros节点源文件只需要添加你复制的头文件下就行了,函数自己调用就行了。
CMakeLists.txt文件需要做相应的修改,添加你添加的文件名字,放在ros节点文件后面,如下所示:
add_executable(${
PROJECT_NAME}_node src/test.cpp src/test2.cpp src