Trac 经验谈之(2)杂谈篇补遗

Trac 经验谈之(1)杂谈篇
Trac 经验谈之(2)杂谈篇补遗
Trac 经验谈之(3)工作流篇
Trac 经验谈之(4)报表篇
Trac 经验谈之(5)插件篇
Trac 经验谈之(6 完)插件篇补遗
=================

Trac 经验谈之(2)杂谈篇补遗

赖勇浩(http://laiyonghao.com)


教训

一定要有模板

嗯,我说的是每一个任务单(ticket)的描述。如果没有一个描述模板,你得到的很大可能是一堆完全不知所云的文本。使用 TicketExtPlugin 可以很方便地做到这一点(见插件篇)。下面是我使用的模板,其中需求和改进的模板由我“抄袭”自禅道。

=======================改进=========================
建议参考的模板:作为一名<某种类型的用户>,我希望<某个功能的描述>更改为<另一个功能的描述>,这样可以<开发的价值>。
=======================需求==========================
建议参考的模板:作为一名<某种类型的用户>,我希望<达成某些目的>,这样可以<开发的价值>。
=======================缺陷==========================
缺陷表现:


重现步骤:


期望结果:



一定要定制报表

多问一下用户,比如老板、经理、制作人和测试人员,了解他们想要弄明白什么信息,然后建立起相关的报表给他们方便地使用。这样才能更好的让他们跟进项目的状态,推进项目的进展。

不要定义太多字段

因为 Trac 有 Custom Fields 概念,用户可以随意定义字段,事实证明过多的字段一点用处都没有。只有专业的测试人员会去设置类似功能组件、职能组件之类的选项,产品策划等人通常无视这些“小细节”,甚至优先级、里程都都是空的,或者默认的。

没有必要设置开始、结束日期

现在我们有这样的选项的,但在我们团队,超过 9 成的任务单没有设置两个字段,我相信设置了这两个字段了的任务单,也会有 9 成都没能在这个期间内完成。对于开发人员来说,能够在预设的里程碑里完成任务单,就相当不错了。

没有必要安装甘特图、日历图等插件

是的,在老板看来,盯着甘特图好像会有一种成竹在胸、一切尽在掌握的感觉。鼓起胆气跟老板说:放弃这自我良好的感觉吧,这玩意根本不准。另外霍夫斯塔特定律必须记在心头:软件开发的时间总是比想象的时间长,即使注意了霍夫斯塔特定律也是如此。出处:http://en.wikipedia.org/wiki/Hofstadter%27s_law

搜索

Trac 的搜索相当不给力,比如你搜索“中文”两个字时,它会告诉你没有匹配的结果,并给出一条警告:

警告: 搜索查询太短。查询必须至少包含 3 字符。 
操蛋啊,尼玛啊,咱这是中文啊……两个字符可以表示整个世界了有木有!但是目前我还没有搜索到有效的解决方案,如果你有办法解决这个问题,请留言告知。谢谢。(2011年8月4日更新:flyinflash 朋友在本文后留言,提到了解决方案,我把它整合到了接下来的小技巧这一节中)。

小技巧

选择 owner

只要把 Trac.ini 的设置改一下即可:

[ticket]
restrict_owner = true
不过这不是完美的解决方案,因为 Trac 默认是显示注册的账号,这种英文字母+数字组合的名字对中国人太不友好了,比较好的方案是装插件,见“插件篇”。

继承 Trac.ini

经常要编辑 Trac.ini,容易出错。其实在 Trac.ini 加一个节 [inherit],然后填好 file 设置,Trac.ini 就能从指定的 file 中继承设置。

[inherit]
file = /path/to/global/trac.ini
如果有多个配置文件,那么需要用逗号(,)隔开。如果 Trac.ini 中又有相同的节项的话,父配置就会被 override,所以最佳实践是 Trac.ini 只有 [inherit] 这一节,然后所有的具体设置都放在不同的文件中给 Trac.ini 继承。

wiki 转 html

有时候需要把纯文本格式的 Wiki 转成 HTML 页面,比如发表到博客什么的。这时候可以使用这个方案:http://trac.edgewall.org/wiki/CookBook/Scripts/StandaloneWiki2Html#no1

搜索(2011年8月4日更新)

把 trac.ini 中的 [search] 这一节进行设置,即可搜索较短的单词,如中文的“义乌”,解决上文说的搜索警告的问题(感谢 flyinflash 的贡献)。

[search]
min_query_length = 0

Hacking

在这个系列发表之后,朋友 @SparkleZeng 在微博上评论说(见:http://weibo.com/1764732124/xeT2KivsG):“trac最大的好处是你可以二次开发,最大的问题是你需要二次开发才用的比较舒服。”说得太对了!所以对于 Trac 用户来说,Hacking 是必经的阶段,可能只是翻开源码直接 hard code 几行,也可能是编写一个插件来增进体验或增加功能。
本来我计划独立地写一篇来讲 Hacking Trac 这个事的,但在写这个系列的过程中我认识到还是介绍“使用”经验为好,所以就把这一篇缩写成一节。与使用 Trac 不同,想要 Hack 它,至少要读 Trac Developer Documentation(http://trac.edgewall.org/wiki/TracDev),而且有不少代码必须要了解。简单地直接在源码那里 hard code 几行就不需多方了,只要用好 find/grep 这两条命令就差不多了。
对于想要编写插件(Plugin)的家伙来说,Trac Component Architecture(http://trac.edgewall.org/wiki/TracDev/ComponentArchitecture)是必读的,通过这篇文档才能了解到 Trac 的心脏—— trac.core 是如何实现一个易于扩展微型的组件内核的(显然,这对于我们设计自己的应用也有很大的借鉴和启发作用)。

清楚 Trac 组件架构的内核机制以后,相信大家对如何编写插件实现自己的功能已经胸有成竹了。这时候需要了解 Trac 的 Request Handling 流程(http://trac.edgewall.org/wiki/TracDev/RequestHandling),这里有两个漂亮的时序图交待了整个请求处理的流程。
跃跃欲试的你现在想动手了吧,不着急,先看一下 Writing Plugins for Trac(http://trac.edgewall.org/wiki/TracDev/PluginDevelopment),你可以在这里看到基础代码模板,如何发布、调试,还有你必须了解的 Extension Points(http://trac.edgewall.org/wiki/TracDev/PluginDevelopment/ExtensionPoints)。
别以为你现在就可以开始了哦,如果你需要在数据库存储数据,那你还要了解清楚它的 Data Models(http://trac.edgewall.org/wiki/TracDev/DataModels)和Database Scheme(http://trac.edgewall.org/wiki/TracDev/DatabaseSchema)。
最后,为了让全世界人民都可以用上你编写的插件,你还需要了解一下它的本地化技术(http://trac.edgewall.org/wiki/TracL10N)。好吧,现在你可以动手了,最后送你一份 Trac API Docs一路伴随你(http://trac.edgewall.org/wiki/TracDev/ApiDocs)。

2011年8月4日更新:flyinflash 留言说:Trac开发文档可能有时会让人困惑,Plugin 和 Component 有时指同一样东西,应该加备注。
### 集成和使用 TRAC-IK 与 MoveIt2 在 ROS2TRAC-IK 是一种高效的逆运动学求解器,能够提供快速而精确的结果。在 ROS2 和 MoveIt2 中集成 TRAC-IK 可以为机器人应用带来更优的性能表现。 #### 安装依赖项 要将 TRAC-IK 集成到 MoveIt2 中,首先需要安装必要的软件包。可以通过以下命令安装 TRAC-IK 软件包及其依赖项: ```bash sudo apt-get install ros-${ROS_DISTRO}-trac-ik libtrac-ik-dev ``` 这一步确保了系统中有可用的 TRAC-IK 库以及对应的开发文件[^1]。 #### 修改 MoveIt2 配置 MoveIt2 使用插件机制加载不同的 IK 解算器。为了使 MoveIt2 使用 TRAC-IK,需修改配置文件中的 `kinematics.yaml` 文件。具体操作如下: 打开或创建 `${YOUR_ROBOT_NAME}_moveit_config/config/kinematics.yaml` 文件,并将其内容设置为支持 TRAC-IK 的形式。例如: ```yaml arm: kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin kinematics_solver_search_resolution: 0.005 kinematics_solver_timeout: 0.005 kinematics_solver_attempts: 3 ``` 这里的关键参数解释如下: - `kinematics_solver`: 设置为 `trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin` 表明我们希望使用 TRAC-IK 插件作为默认的 IK 求解器。 - `kinematics_solver_search_resolution`, `kinematics_solver_timeout`, 和 `kinematics_solver_attempts` 控制着求解器的行为,包括分辨率、超时时间和尝试次数。 #### 启动并验证 完成上述更改后,启动 MoveIt2 并测试新的 IK 解算器是否正常工作。可以运行标准的 MoveIt2 套件演示节点来进行验证: ```bash ros2 launch moveit2_tutorials demo.launch.py ``` 在此过程中观察终端日志输出,确认 TRAC-IK 是否成功加载并参与计算。如果一切顺利,应该可以看到类似于以下的日志消息: ``` [INFO] [trac_ik_kinematics_plugin]: Successfully loaded TRAC-IK plugin. ``` 此信息表明 TRAC-IK 已经正确集成到了 MoveIt2 系统中。 #### 性能优化建议 对于某些复杂场景下的 IK 计算需求,可能还需要进一步调整 TRAC-IK 参数以获得最佳效果。比如增大搜索范围或者减少迭代次数等都可以依据实际应用场景灵活设定。 --- ### 示例代码片段展示如何动态调用 TRAC-IK API 进行单次求解 以下是 Python 版本的一个简单例子,展示了如何利用 TRAC-IK 提供的功能实现基本的逆向动力学查询功能: ```python import rospy from geometry_msgs.msg import PoseStamped, Point, Quaternion from tf.transformations import quaternion_from_euler from ikpy.chain import Chain from ikpy.link import OriginLink, URDFLink def solve_trac_ik(target_pose): chain = Chain.from_urdf_file( urdf_file="path_to_your_robot.urdf", base_elements=["base_link"], end_elements=["end_effector_link"] ) target_position = [ target_pose.position.x, target_pose.position.y, target_pose.position.z ] target_orientation = quaternion_from_euler( target_pose.orientation.roll, target_pose.orientation.pitch, target_pose.orientation.yaw ) joint_angles = chain.inverse_kinematics( frame=target_pose, orientation_mode="all" ) return joint_angles if __name__ == "__main__": pose_goal = PoseStamped() pose_goal.pose.position = Point(0.4, 0.1, 0.4) pose_goal.pose.orientation = Quaternion(*quaternion_from_euler(0, pi / 4, 0)) result = solve_trac_ik(pose_goal) print(f"Joint angles solution is {result}") ``` 注意该脚本仅为示意用途;真实环境中应替换路径变量等内容使其适配特定硬件环境[^2]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值