Category Archives: Linux

Shell与kernel

作者:大宽宽链接:https://www.zhihu.com/question/35382632/answer/803711006来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 shell是什么? 操作系统对外提供的接口是“系统调用”,也就是一堆编程用的接口。这些接口一般以C函数的形式暴露给使用者。通过这些接口,开发者可以命令操作系统“启动一个进程”,“查找某个目录下的所有文件”,“将某个文件的权限配置为744”等等。 实际上我们平时编程用的是对系统调用的包装,比如libc里的那些库函数。但无论如何,你总是得写代码才能使用它们。 问题是我们平时使用电脑,不能每次都编写程序,再编译,再运行得到结果吧。比如你想知道一个目录下的所有文件,你肯定不会去写一段C代码,调用系统调用“readdir” (见http://www.man7.org/linux/man-pages/man3/readdir.3.html),然后gcc编译,然后运行。真这么干,一个最简单的工作也要耗费很长时间。况且,一个函数的返回是“数据结构”,或者输出到stdout或文件之类的地方。你总得以某种形式把结果“画”到界面上(不管是画字符还是画图片),才能查看那个结果。这个格式化输出的工作量也很大。 正常人的思路是先写好程序,然后弄个交互的界面方便使用这个程序。只要使用者敲一组字符串,就可以调用之前写好的程序完成工作。比如我们会在命令行里输入“ls -Rl”这种字符串。这个字符串被翻译成“ls”,“-R”,“-l”。“ls”帮我们找到那个之前写好的程序,并启动它;“-R”和“-l”被作为参数传给这个程序,告诉程序走“递归所有子目录”+“输出长格式”这部分代码。 这个负责把用户输入的字符串转换到需要执行的程序,并把结果以某个形式画出来的东西,就叫做“Shell”,即帮你更方便使用操作系统接口的“壳”。这个词与操作系统内核(Kernel)对应。 在Linux中,bash负责按照某种格式把用户的输出的字符串翻译,比如对于普通非空字符翻译为程序和参数,并尝试去PATH里找对应的程序。例如 对“空格”翻译成分隔符; 对“$XXX”尝试进行环境变量的替换; 对“|”翻译为管道; 对 “>”翻译为输出重定向; 对一个指令末尾的“&”翻译为将程序转到后台执行…… 更多Special Characters and Quoting for shell 另一方面终端将stdout、stderr输出的东西画成我们可以看的一坨坨字符,包括字符、字体、颜色、换行、甚至响铃。 【bash】 + 【终端】大概可以理解为一个以字符为交互方式的“Shell”。 当然,大家会更习惯上说“bash”是一个“Shell”。也许是因为bash大家用的不爽可以换,可以改变配置,可以编程。总之玩法很多。但是对终端一般不怎么理会,默认的就够用了。或者也可以理解为“终端“属于操作系统的一部分。不管如何,可以习惯这些不同角度的不同看法,不需要特别细纠,理解大概意思就好。 除了bash,还有像csh,zsh等,虽然各自的规定有些区别,但干的事情就是这些。Windows里一般等价的就是cmd,与Linux这边相比弱鸡得很。不过Windows有自己的PowerShell,也可以通过cygwin或者linux subsystem的方式使用bash。 如果你自己定义一个解析字符串的“Shell”,你可以规定用分号而不是空格做分隔符;用#而不是$代表变量…… Shell也可以做成图形界面的,比如你点击一个窗口里左边的一个目录图标,右边就展示这个目录下的所有文件。他做的事情和上面ls一模一样,只不过接受的是点击,而不是输入字符串;输出的是一幅画,而不是格式化的文本而已。内部还是转换成调用系统调用来完成工作。 如果你开心,你甚至都把Shell可以做成声控的,比如你说一段语音,你的“Shell”识别后翻译为调用程序的指令,执行成功后就可以把结果翻译为语音再返回给你。你一定熟悉“小爱同学”,“Hi Siri”这种东西吧。 Shell的思想很普遍,并不一定限制在操作系统上。比如你自己写一个程序,有大量复杂的参数和配置。为了使用方便可以写个命令行工具将一个命令翻译成对这段程序的调用。你写的命令行工具就是你自己程序的“Shell”。比如写Java的同学肯定很熟悉mvn。一句mvn install可以产生出成百上千个下载、压缩、编译、清理、测试、上传等api的调用;使用数据库的同学也会用SQL来表达自己的查询,让数据库的“Shell”解释成对存储引擎各种api的调用。 怎么check你用哪个shell?

python与Conda

python从哪里找已经安装的library How does Python know where to find packages when you call import? Python imports work by searching the directories listed in sys.path. 具体我们可以在terminal通过以下code将路径打出来 你可以添加别的路径 python的library都安装在哪里 当你跑如下命令时,scipy被放在sys.path的哪个路径? Python usually stores its library (and thereby your site-packages folder) in the installation directory.在terminal 查看python安装在哪里: 出来的结果是 The default library would reside in C:\Python\Lib\ and third-party modules should be stored in…

Read More

ROS, MoveIt, and OMPL

注意注意:本文基于的版本是ROS melodic(Melodic是基于python2) 第一步:环境setup,全部follow此tutorial的步骤 创建catkin的workspace, 以及安装moveit(从源代码安装) 我们要下载两个ROS packages,剩下的tutorial全是通过启动这两个包来进行的(注意一个ROS package下面可以有多个ROS node,需要指明启动ROS的哪个package里面的哪个node) 第一个ROS包:ROBOT_moveit_config,用来定义robot的;默认的机器人是Panda arm from Franka Emika,所以默认的定义的机器人ROS包是panda_moveit_config, panda代替了ROBOT。 第二个ROS包:下载ROS包moveit_tutorials。 build一下ws_moveit(你的workspace) 第二步:创建自己的机器人config package(有自己的机器人的必要步骤) 即自己的 robot_moveit_config package, 参考the MoveIt Setup Assistant tutorial. 第三步:Visualize a robot with the interactive motion planning plugin for RViz(非必要的步骤) 可视化机器人,并在rviz上有可交互的页面。Rviz是ROS最重要的可视化工具,MoveIt通过他支持的rviz插件,可以实现交互式选取start state与goal state, 测试motion planning等等。 运行roslaunch panda_moveit_config demo.launch rviz_tutorial:=true用于启动panda_moveit_config的ROS包,里面会启动planning_context.launch(用于加载描述robot的信息),启动move_group.launch(moveit的可运行程序),启动moveit_rviz.launch(启动rviz), 如果是第一次启动panda_moveit_config的ROS包,那么你会打开rviz,并有一个空的enviroment,没有机器人。我们需要添加motion planning的插件. 加完该motion planning插件,panda机器臂就出现在环境中。同时我们要对motion planning这个插件做一些关于robot的configuration。另外关于可视化,我们可以设置哪些项目是可见的,有四个东西可以显示。 机器人周围的环境(包括障碍物什么的,scene robot) 规划的路径(planned…

Read More

Rviz,Gazebo,MoveIt区别与联系

参考:https://www.zhihu.com/question/268658280/answer/340190866来源:知乎, 作者:古月 Rviz的几个关键特性: 它是三维可视化工具,强调把已有的数据可视化显示. Rviz需要别人给它喂数据。 rviz提供了很多插件,这些插件可以显示图像、模型、路径等信息。但是前提都是这些数据已经以ROS topic、ROS parameters的形式pubilish,rviz做的事情就是subscribe这些数据,并完成可视化的渲染,让开发者直观地理解数据的意义。 Gazebo是三维物理(机器人的力学物理模型)仿真平台,强调的是创建一个虚拟的仿真环境。Gazebo不是显示工具,强调的是仿真,它不需要等着别人喂数据,而是创造数据。 如果你手上已经有机器人硬件平台,并且在上边可以完成需要的功能,用rviz应该就可以满足开发需求。如果你手上没有机器人硬件,或者想在仿真环境中做一些算法、应用的测试,gazebo+rviz应该是你需要的。另外,rviz配合其他功能包也可以建立一个简单的仿真环境,比如rviz+ArbotiX,可以参考《ROS by Example》,但是其中rviz的本质还是处理显示的部分。 那么Gazebo与MoveIt又是怎样的关系呢?两者功能不一样,不是相互替代的关系。Gazebo是一个simulator, it doesn’t do any motion planning. ROS is (in this context) the middleware that allows gazebo to talk to other software. MoveIt is a motion planning framework that uses ROS to talk to Gazebo.

如何建立和维护ROS catkin-based package

创建ROS Package 每一个ROS package都是~/catkin_ws/src路径下的一个文件夹,所以我们需要在~/catkin_ws/src路径下来创建一个ros package,命令如下: 以上命令中,beginner_tutorials是package的名字,std_msgs rospy roscpp代表了该ros package依赖这三个ros package(ROS自带的)。接下来就要build package了,我们需要回到~/catkin_ws路径下,进行build。 运行该命令之后,你就发现~/catkin_ws/src路径下多了一个文件夹beginner_tutorials,并且该文件夹下有两个文件package.xml和CMakeLists.txt,并且package.xml中自动有了build_depend的信息,即刚才的std_msgs rospy roscpp三个ros packages。 建议:除了第一次~/catkin_ws/src路径下还一个ros package都没有的时候,用catkin_make(会自动生成devel文件夹和build文件夹),后面每次有任何包括的任何文件有更新,都需要把整个src code进行build,而我们可以用更好的命令catkin build或者catkin_make_isolated,具体为什么可以看链接的解释 具体含义 每一个ROS package都是~/catkin_ws/src路径下的一个文件夹,所以通常~/catkin_ws/src路径下有好多个文件夹,每个都是一个ros package。一个ros package文件夹必须包含以下两个文件: package.xml文件: 定义package的名字,license,以及最重要的是定义本ros package的dependency。 buildtool_depend: Use this for buildtool packages,这里我们的build system用的是catkin啦 build_depend: Use this for packages you need at compile time exec_depend: Use this for packages you need at runtime build_export_depend: Use…

Read More

Catkin工作空间的机制

参考以下链接:[1]https://subscription.packtpub.com/book/hardware_and_creative/9781783554713/1/ch01lvl1sec14/setting-the-ros-workspace ROS workspace是用来keep ROS packages. 而通常我们用catkin_based的工作空间来建立和安装ROS packages. Catkin system是ROS的官方build system,帮助我们将source code弄成在ROS workspace中的a target executable 或者libraries, 具体可以看看catkin的发展历史。 A build system is responsible for generating ‘targets’ from raw source code that can be used by an end user. These targets may be in the form of libraries, executable programs, generated scripts, exported interfaces (e.g. C++ header files) or…

Read More